getPerspectiveTransform函数

getPerspectiveTransform函数

函数作用:

根据输入和输出点获得图像透视变换的矩阵

函数的调用形式:

C++: Mat getPerspectiveTransform(InputArray src, InputArray dst)

InputArray src, InputArray dst:分别为变换的输入和输出点

分别四个点

透视变换后的图像不是平行的,



函数的运用:

解变换公式的函数:

  1. Mat getPerspectiveTransform(const Point2f src[], const Point2f dst[])  
输入原始图像和变换之后的图像的对应4个点,便可以得到变换矩阵。之后用求解得到的矩阵输入perspectiveTransform便可以对一组点进行变换:

  1. void perspectiveTransform(InputArray src, OutputArray dst, InputArray m)  
注意这里src和dst的输入并不是图像,而是图像对应的坐标。应用前一篇的例子,做个相反的变换:

  1. int main( )  
  2. {  
  3.     Mat img=imread("boy.png");  
  4.     int img_height = img.rows;  
  5.     int img_width = img.cols;  
  6.     vector<Point2f> corners(4);  
  7.     corners[0] = Point2f(0,0);  
  8.     corners[1] = Point2f(img_width-1,0);  
  9.     corners[2] = Point2f(0,img_height-1);  
  10.     corners[3] = Point2f(img_width-1,img_height-1);  
  11.     vector<Point2f> corners_trans(4);  
  12.     corners_trans[0] = Point2f(150,250);  
  13.     corners_trans[1] = Point2f(771,0);  
  14.     corners_trans[2] = Point2f(0,img_height-1);  
  15.     corners_trans[3] = Point2f(650,img_height-1);  
  16.   
  17.     Mat transform = getPerspectiveTransform(corners,corners_trans);  
  18.     cout<<transform<<endl;  
  19.     vector<Point2f> ponits, points_trans;  
  20.     for(int i=0;i<img_height;i++){  
  21.         for(int j=0;j<img_width;j++){  
  22.             ponits.push_back(Point2f(j,i));  
  23.         }  
  24.     }  
  25.   
  26.     perspectiveTransform( ponits, points_trans, transform);  
  27.     Mat img_trans = Mat::zeros(img_height,img_width,CV_8UC3);  
  28.     int count = 0;  
  29.     for(int i=0;i<img_height;i++){  
  30.         uchar* p = img.ptr<uchar>(i);  
  31.         for(int j=0;j<img_width;j++){  
  32.             int y = points_trans[count].y;  
  33.             int x = points_trans[count].x;  
  34.             uchar* t = img_trans.ptr<uchar>(y);  
  35.             t[x*3]  = p[j*3];  
  36.             t[x*3+1]  = p[j*3+1];  
  37.             t[x*3+2]  = p[j*3+2];  
  38.             count++;  
  39.         }  
  40.     }  
  41.     imwrite("boy_trans.png",img_trans);  
  42.   
  43.     return 0;  
  44. }  

得到变换之后的图片:


发布了738 篇原创文章 · 获赞 389 · 访问量 190万+
展开阅读全文

图像透视变换程序:如何调试缓冲区溢出问题

01-11

求大神指导,小弟万分感谢! #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace cv; using namespace std; #define WINDOW_NAME1 "【原始图窗口】" //为窗口标题定义的宏 #define WINDOW_NAME2 "【经过perspective后的图像】" //为窗口标题定义的宏 int main( ) { Point2f srcTriangle[3];//定义两组点,代表两个四边形 Point2f dstTriangle[3]; Mat rotMat( 3, 3, CV_32FC1 );//定义一些Mat变量 Mat warpMat( 3, 3, CV_32FC1 ); Mat srcImage, dstImage; srcImage = imread( "picture.jpg", 1 );//加载源图像并作一些初始化 if(!srcImage.data ) { printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n"); return false; } dstImage = Mat::zeros( srcImage.rows, srcImage.cols, srcImage.type() );// 设置目标图像的大小和类型与源图像一致 srcTriangle[0] = Point2f( 403, 189 );//设置源图像和目标图像上的四组点以计算透视变换 srcTriangle[1] = Point2f( 610, 202 ); srcTriangle[2] = Point2f( 382, 370 ); srcTriangle[3] = Point2f( 617, 379 ); dstTriangle[0] = Point2f( 320, 240); dstTriangle[1] = Point2f( 640, 240); dstTriangle[2] = Point2f( 320, 480); dstTriangle[3] = Point2f( 640, 480); warpMat = getPerspectiveTransform( srcTriangle, dstTriangle ); perspectiveTransform( srcImage, dstImage, warpMat ); imshow( WINDOW_NAME1, srcImage ); imshow( WINDOW_NAME2, dstImage ); waitKey(0); return 0; } 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览