300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > opencv的透视变换(投影变换)

opencv的透视变换(投影变换)

时间:2020-02-04 02:45:14

相关推荐

opencv的透视变换(投影变换)

主要涉及两个函数。

第一个,findHomography

计算多个二维点对之间的最优单映射变换矩阵H(3行x3列),使用最小均方误差或者RANSAC方法。函数功能:找到两个平面之间的转换矩阵。

Mat cv::findHomography(InputArray srcPoints,InputArray dstPoints,int method = 0,double ransacReprojThreshold = 3,OutputArray mask = noArray(),const int maxIters = 2000,const double confidence = 0.995 )

参数详解:

第二个,warpPerspective

通过输入变换矩阵得到透视图片。

void cv::warpPerspective(InputArray src,OutputArray dst,InputArray M,Size dsize,int flags = INTER_LINEAR,int borderMode = BORDER_CONSTANT,const Scalar &borderValue = Scalar() )

参数详解:

具体例子

透视变换同时获取ROI,代码如下:

#include<opencv2/opencv.hpp>using namespace cv;using namespace std;struct callbackP{Mat src;int clickTimes = 0; //在图像上单击次数vector<Point2f> srcTri;};void onMouse(int event, int x, int y, int flags, void *utsc){callbackP cp = *(callbackP*)utsc; // 先转换类型,再取数据if (event == EVENT_LBUTTONUP)//响应鼠标左键事件{circle((*(callbackP*)utsc).src, Point(x, y), 2, Scalar(0, 0, 255), 2); //标记选中点imshow("wait ", (*(callbackP*)utsc).src);(*(callbackP*)utsc).srcTri.push_back(Point2f(x, y));cout << "x:" << x << " " << "y:" << y << endl;(*(callbackP*)utsc).clickTimes++;if ((*(callbackP*)utsc).clickTimes == 4){cout << "按任意键继续!" << endl;}}}int main(int argc, char *argv[]){vector<Point2f> dstTri(4);Mat dst;callbackP utsc;utsc.src = imread("3.jpg");namedWindow("src", WINDOW_AUTOSIZE);imshow("src", utsc.src);cout << "从需要透视变换区域的左上角开始,顺时针依次点矩形的四个角!" << endl;setMouseCallback("src", onMouse, (void*)&utsc); //类型转换waitKey();if (utsc.clickTimes == 4){dstTri[0].x = 0;dstTri[0].y = 0;dstTri[1].x = utsc.srcTri[1].x - utsc.srcTri[0].x;dstTri[1].y = 0;dstTri[2].x = utsc.srcTri[1].x - utsc.srcTri[0].x;dstTri[2].y = utsc.srcTri[2].y - utsc.srcTri[1].y;dstTri[3].x = 0;dstTri[3].y = utsc.srcTri[2].y - utsc.srcTri[1].y;//计算透视矩阵Mat M = findHomography(utsc.srcTri, dstTri, RANSAC);//图像透视变换warpPerspective(utsc.src, dst, M, Size((utsc.srcTri[1].x - utsc.srcTri[0].x), (utsc.srcTri[2].y - utsc.srcTri[1].y)));imshow("output", dst);imwrite("3p.jpg", dst);cout << "透视变换矩阵:"<< M << endl;waitKey();}else {cout << "需要从左上角开始,顺时针依次点矩形的四个角!" << endl;cout << "现在点击了" <<utsc.clickTimes << "次" <<endl;}cv::destroyAllWindows();return 0;}

网上随便找一张图片,效果如下:注意,用鼠标描点时从左上角开始,顺时针依次进行

只进行透视变换,代码如下:

#include<opencv2/opencv.hpp>using namespace cv;using namespace std;struct callbackP{Mat src;int clickTimes = 0; //在图像上单击次数vector<Point2f> srcTri;};void onMouse(int event, int x, int y, int flags, void *utsc){callbackP cp = *(callbackP*)utsc; // 先转换类型,再取数据if (event == EVENT_LBUTTONUP)//响应鼠标左键事件{circle((*(callbackP*)utsc).src, Point(x, y), 2, Scalar(0, 0, 255), 2); //标记选中点imshow("wait ", (*(callbackP*)utsc).src);(*(callbackP*)utsc).srcTri.push_back(Point2f(x, y));cout << "x:" << x << " " << "y:" << y << endl;(*(callbackP*)utsc).clickTimes++;if ((*(callbackP*)utsc).clickTimes == 4){cout << "按任意键继续!" << endl;}}}int main(int argc, char *argv[]){vector<Point2f> dstTri(4);Mat dst;callbackP utsc;utsc.src = imread("3.jpg");namedWindow("src", WINDOW_AUTOSIZE);imshow("src", utsc.src);cout << "从需要透视变换区域的左上角开始,顺时针依次点矩形的四个角!" << endl;setMouseCallback("src", onMouse, (void*)&utsc); //类型转换waitKey();if (utsc.clickTimes == 4){dstTri[0].x = utsc.srcTri[0].x;dstTri[0].y = utsc.srcTri[0].y;dstTri[1].x = utsc.srcTri[1].x;dstTri[1].y = utsc.srcTri[0].y;dstTri[2].x = utsc.srcTri[1].x;dstTri[2].y = utsc.srcTri[2].y;dstTri[3].x = utsc.srcTri[0].x;dstTri[3].y = utsc.srcTri[2].y;//计算透视矩阵Mat M = findHomography(utsc.srcTri, dstTri, RANSAC);//图像透视变换warpPerspective(utsc.src, dst, M, utsc.src.size());imshow("output", dst);imwrite("3pp.jpg", dst);cout << "透视变换矩阵:"<< M << endl;waitKey();}else {cout << "需要从左上角开始,顺时针依次点矩形的四个角!" << endl;cout << "现在点击了" <<utsc.clickTimes << "次" <<endl;}cv::destroyAllWindows();return 0;}

效果图:

参考博客:

findHomography()函数详解_奔跑的小木的博客-CSDN博客_findhomography

opencv学习笔记三十四:透视变换_东城青年的博客-CSDN博客

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。