透视变换实现代码(全)

来源:互联网 发布:如何升级mac os系统 编辑:程序博客网 时间:2024/05/19 06:34

好久没写博客了,因为白天要去实习,晚上看论文实在抽不出时间,由于项目需要,研究了透视变换,在网上找了一圈不是缺腿就是少胳膊的,后来对缺省的代码进行补充使其可以调通,现贴出来供大家学习使用,代码如下:

#include<iostream>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgproc/imgproc.hpp>using namespace cv;using namespace std;int main( )  {      Mat img=imread("1.jpg");      int img_height = img.rows;      int img_width = img.cols;      vector<Point2f> corners(4);      corners[0] = Point2f(0,0);      corners[1] = Point2f(img_width-1,0);      corners[2] = Point2f(0,img_height-1);      corners[3] = Point2f(img_width-1,img_height-1);      vector<Point2f> corners_trans(4);      corners_trans[0] = Point2f(150,250);      corners_trans[1] = Point2f(771,0);      corners_trans[2] = Point2f(0,img_height-1);      corners_trans[3] = Point2f(650,img_height-1);        Mat transform = getPerspectiveTransform(corners,corners_trans);      cout<<transform<<endl;      vector<Point2f> ponits, points_trans;      for(int i=0;i<img_height;i++){          for(int j=0;j<img_width;j++){              ponits.push_back(Point2f(j,i));          }      }        perspectiveTransform( ponits, points_trans, transform);      Mat img_trans = Mat::zeros(img_height,img_width,CV_8UC3);      int count = 0;      for(int i=0;i<img_height;i++){          uchar* p = img.ptr<uchar>(i);          for(int j=0;j<img_width;j++){              int y = points_trans[count].y;              int x = points_trans[count].x;              uchar* t = img_trans.ptr<uchar>(y);              t[x*3]  = p[j*3];              t[x*3+1]  = p[j*3+1];              t[x*3+2]  = p[j*3+2];              count++;          }      }      imwrite("1_trans.jpg",img_trans); namedWindow("原图");imshow("原图", img);namedWindow("透视变换图");imshow("透视变换图", img_trans);waitKey(0);    return 0;  }  
原图:


透视变换之后的效果图:


原创粉丝点击