仿射变换:一种二维坐标到二维坐标的线性变换,它保持二维图像的平直性与平行性,即变换后直线依然是直线,平行的线依然平行。
opencv中实现仿射变换,需要获取仿射变换矩阵getAffineTransform(),在使用矩阵对图像进行仿射变换wrapAffine()。
获取仿射变换矩阵:
src[] : 源图像中的四边形顶点坐标,三个点
dst[] : 目标图像与原图对应的顶点坐标
仿射变换只需要三个点,三点即可确定一个平行四边形。返回值是[2×3]的矩阵
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]。
参数与仿射变换矩阵一样,但透视变换需要四个点。
参数与仿射变换一样。
测试代码:
{
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);
}
测试结果:(图像来源网络,侵权即删。)
旋转也是仿射变换的一种。可以使用三点法获取仿射变换矩阵,也可以通过旋转角度获取旋转矩阵。
通过旋转角度获取旋转矩阵:
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);
参考链接: opencv透视变换.