C++ opencv图像的仿射变换、透视变换、旋转

这里写自定义目录标题

  • 图像的仿射变换、透视变换、旋转
    • 仿射变换
    • 透视变换
    • 旋转图像

图像的仿射变换、透视变换、旋转

仿射变换

仿射变换:一种二维坐标到二维坐标的线性变换,它保持二维图像的平直性与平行性,即变换后直线依然是直线,平行的线依然平行。

opencv中实现仿射变换,需要获取仿射变换矩阵getAffineTransform(),在使用矩阵对图像进行仿射变换wrapAffine()。

获取仿射变换矩阵:

C++ opencv图像的仿射变换、透视变换、旋转_第1张图片

src[] : 源图像中的四边形顶点坐标,三个点
dst[] : 目标图像与原图对应的顶点坐标
仿射变换只需要三个点,三点即可确定一个平行四边形。返回值是[2×3]的矩阵

C++ opencv图像的仿射变换、透视变换、旋转_第2张图片

src :源图像
dts : 目标图像
M : 仿射变换矩阵
dsize : 目标图像的大小
flags :填充方式,默认线性
borderMode:边框填充方式
borderValue :边界填充值,默认0,黑色

测试代码:

//仿射变换
	Mat m3 = imread(path4, 1);
	//只需三个点
	vector<Point2f> srcPointA;
	vector<Point2f> dstPointA;

	srcPointA.push_back(Point2f(0,0));
	srcPointA.push_back(Point2f(0,m3.rows));
	srcPointA.push_back(Point2f(m3.cols ,0));

	dstPointA.push_back(Point2f(m3.cols*0.1 , m3.rows*0.1));
	dstPointA.push_back(Point2f(m3.cols*0.2, m3.rows*0.7));
	dstPointA.push_back(Point2f(m3.cols*0.7, m3.rows*0.2));

	Mat m4;
	//获取放射变换矩阵
	m4 = getAffineTransform(srcPointA, dstPointA);
	Mat resultImgA;
	//进行仿射变换
	warpAffine(m3,  resultImgA, m4, m3.size());
	imshow("truth image", m3);
	imshow("affine image", resultImgA);
	waitKey(0);

测试结果:(图像来源网络,侵权即删。)

透视变换

透视变换是将一个平面投影到另一个平面的过程,也称投影映射。是一种非线性变换,表现为可将梯形变换为平行四边形,因此需要四个点来确定透视变换矩阵。变换矩阵维度为[3×3]。

获得透视变换矩阵:
C++ opencv图像的仿射变换、透视变换、旋转_第3张图片

参数与仿射变换矩阵一样,但透视变换需要四个点。

C++ opencv图像的仿射变换、透视变换、旋转_第4张图片

参数与仿射变换一样。

测试代码:

{
    Mat m1 = imread(path4, 1);
	Mat m2;

	//需要四个点
	vector<Point2f> srcPointP;
	vector<Point2f> dstPointP;
	//坐标顺序会一一对应变换
	srcPointP.push_back(Point2f(0,0));
	srcPointP.push_back(Point2f(0, m1.rows));
	srcPointP.push_back(Point2f(m1.cols, 0));
	srcPointP.push_back(Point2f(m1.cols , m1.rows));

	dstPointP.push_back(Point2f(m1.cols, m1.rows));
	dstPointP.push_back(Point2f(m1.cols*0.1, m1.rows*0.8)); 
	dstPointP.push_back(Point2f(m1.cols*0.7, m1.rows * 0.3));
	dstPointP.push_back(Point2f(0, 0));

	//获得透视变换矩阵
	m2 = getPerspectiveTransform(srcPointP, dstPointP);
	Mat resultImgP(m1.size(),m1.type());
	//进行透视变换
	warpPerspective(m1, resultImgP, m2, m1.size());
	imshow("truth image", m1);
	imshow("perspective image", resultImgP);
	waitKey(0);
	}

测试结果:(图像来源网络,侵权即删。)

旋转图像

旋转也是仿射变换的一种。可以使用三点法获取仿射变换矩阵,也可以通过旋转角度获取旋转矩阵。

通过旋转角度获取旋转矩阵:

C++ opencv图像的仿射变换、透视变换、旋转_第5张图片

center : 旋转中心
angle : 旋转角度
scale : 旋转比例因子

测试代码:

//图像的旋转
	Mat m5 = imread(path, 1);
	Mat m6;
	//获取图像的中心,作为旋转中心
	Point pcenter(m5.rows / 2, m5.cols / 2);
	//获取旋转矩阵,正值为逆时针旋转45度,缩放因子为1即不缩放
	m6 = getRotationMatrix2D(pcenter, 45, 0.75);
	//应用仿射变换,使图像旋转
	Mat rotatedImg;
	warpAffine(m5, rotatedImg, m6, Size(m5.cols, m5.rows));
	imshow("truth image", m5);
	imshow("rotated image",rotatedImg);
	waitKey(0);

测试结果:(图像来源网络,侵权即删。)
C++ opencv图像的仿射变换、透视变换、旋转_第6张图片

参考链接: opencv透视变换.

你可能感兴趣的:(OpenCV451,opencv,计算机视觉,c++)