本文共 2804 字,大约阅读时间需要 9 分钟。
仿射变换是一种在计算机视觉中常用的图像变换方法,广泛应用于图像的仿射重建、投影、配准等场景。通过本文,你将逐步了解仿射变换的基本概念、实现方法以及实际应用案例。
仿射变换是一种线性变换加上平移的综合操作,能够保持图像的平行性和直线性。与旋转、缩放、平移等单一变换不同,仿射变换能够更灵活地调整图像的形状和位置。
仿射变换的核心可以用一个2×3的矩阵表示,形式如下:
| a b c || d e f || 0 0 1 |
其中,a
、b
、d
、e
是线性变换矩阵,c
和f
是平移向量。通过改变矩阵中的参数,可以实现旋转、缩放、平移等多种变换效果。
在OpenCV库中,提供了两个主要函数来实现仿射变换:
warpAffine
函数
src
:源图像。dst
:目标图像。M
:仿射变换矩阵。dsize
:目标图像的尺寸。flags
:插值方法(默认为线性插值)。borderMode
:边界模式(默认为常数边界)。getRotationMatrix2D
函数
center
:旋转中心。angle
:旋转角度。scale
:缩放系数。warpAffine
函数详解warpAffine
函数的主要作用是将源图像按照指定的仿射变换矩阵重建到目标图像上。以下是函数的核心实现逻辑:
M
对源图像进行线性变换。getRotationMatrix2D
函数详解getRotationMatrix2D
函数用于计算旋转矩阵,适用于基于仿射变换的旋转操作。函数的核心逻辑包括:
以下是一个使用 warpAffine
和 getRotationMatrix2D
实现仿射变换的代码示例:
#include#include using namespace std;using namespace cv;/// 函数主程序int main(int argc, char** argv) { // 加载源图像 Mat src = imread("harris.jpg", 1); // 创建目标图像,尺寸与源图像一致 Mat warp_dst = Mat::zeros(src.rows, src.cols, src.type()); // 定义仿射变换三点对应关系 Point2f srcTri[] = { Point2f(0, 0), // 三角形顶点1 Point2f(src.cols - 1, 0), // 三角形顶点2 Point2f(0, src.rows - 1) // 三角形顶点3 }; Point2f dstTri[] = { Point2f(src.cols*0.0, src.rows*0.33), // 目标顶点1 Point2f(src.cols*0.85, src.rows*0.25), // 目标顶点2 Point2f(src.cols*0.15, src.rows*0.7) // 目标顶点3 }; // 计算仿射变换矩阵 Mat warp_mat = getAffineTransform(srcTri, dstTri); // 应用仿射变换 warpAffine(src, warp_dst, warp_mat, warp_dst.size()); // 定义旋转中心和参数 Point center(warp_dst.cols/2, warp_dst.rows/2); double angle = -50.0; double scale = 0.6; // 计算旋转矩阵 Mat rot_mat = getRotationMatrix2D(center, angle, scale); // 应用旋转变换 warpAffine(warp_dst, warp_dst, rot_mat, warp_dst.size()); // 显示结果 namedWindow("source", CV_WINDOW_AUTOSIZE); imshow("source", src); namedWindow("warp", CV_WINDOW_AUTOSIZE); imshow("warp", warp_dst); namedWindow("warp_rotate", CV_WINDOW_AUTOSIZE); imshow("warp_rotate", warp_dst); // 等待用户退出程序 waitKey(0); return 0;}
代码结构:
src
。warp_dst
,尺寸与源图像一致。Point2f
类表示点坐标。warp_mat
,并应用 warpAffine
函数进行仿射变换。rot_mat
,并对变换后的图像进行旋转。效果展示:
仿射变换在图像处理中的应用场景包括:
仿射变换是一种强大的图像变换工具,其核心在于通过仿射矩阵实现图像的线性变换和平移操作。在OpenCV库中,warpAffine
和 getRotationMatrix2D
函数为我们提供了实现仿射变换的便捷工具。通过合理设计仿射矩阵和旋转矩阵,可以实现丰富的图像变换效果。
如果你对仿射变换有更多疑问,或者需要具体的实现案例,欢迎在评论区留言交流!
转载地址:http://hwgfk.baihongyu.com/