利用opencv完成对一个图像的变换需要两个算法,一个是空间坐标算法,描述每个坐标如何从初始坐标移动到最终坐标,一个是插值算法,描述出输出图像的每个像素的灰度值
几何变换又分为仿射变换,投影变换和极坐标变换。
1.二维坐标的空间仿射,仿射包括平移,缩放,旋转。
对于这三种变换,本质就是原来图像的矩阵和仿射矩阵作乘法运算得出结果,是python和c++的两种API不同
缩放
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
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_<float>(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<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
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);