利用opencv完成对一个图像的变换需要两个算法,一个是空间坐标算法,描述每个坐标如何从初始坐标移动到最终坐标,一个是插值算法,描述出输出图像的每个像素的灰度值
几何变换又分为仿射变换,投影变换和极坐标变换。
1.二维坐标的空间仿射,仿射包括平移,缩放,旋转。
对于这三种变换,本质就是原来图像的矩阵和仿射矩阵作乘法运算得出结果,是python和c++的两种API不同
缩放
#include#include #include using namespace cv; int main(int argc,char *argv[]){ Mat I = imread(argv[1],CV_LOAD_IMAGE_GRAYSCALE); if(!I.data) return -1; Mat s = (Mat_ (2, 3)<<0.5, 0, 0, 0, 0.5, 0); Mat dst1; warpAffine(I, dst1, Size(I.cols/2, I.rows/2));//图像缩放 //第二种方式。利用resize,个人觉得这种比较好理解 resize(I, dst2, Size(I.cols/2, I.rows/2), 0.5, 0.5); imshow("I", I); imshow("warAffine", dst1); imshow("resize", dst2); waitKey(0); return 0;
旋转
#include#include using namespace cv; int main(int argc, char*argv[]){ Mat img = imread (argv[1], IMREAD_ANYCOLOR); Mat rImg; rotate(img, rImg, ROTATE_90_COLOCKWISE); imshow("yuantu", img); imshow("xuanzhuan", rImg); waitKey(0); return 0;}
以上仿射变化都是二维平面进行的,如果物体在三维空间中发生旋转,这种叫做投射变换
对于c++的API ,利用opencv的鼠标事件,在原图和画布上选取四组对应的坐标,然后计算变换矩阵完成图像的投影变换
,关键代码:
//计算投影变换矩阵
Mat p = getPerspetiveTransform(src, dst);
Mat result;
//投影变换
warpPespective(I, result, p , pI.size());
imshow("投影效果", result);
waitKey(0);



