当前位置:   article > 正文

opencv透视变换的一个小demo_mat h = findhomography(obj, data.points, cv_ransac

mat h = findhomography(obj, data.points, cv_ransac);

上图经过透视变换后贴到下图红色框选的那个位置

 

 

 先介绍一下opencv的鼠标点击事件吧,opencv有自带的鼠标点击事件的函数

 void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)

 winname:窗口的名字

onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。 这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags, void* param);

userdate:传给回调函数的参数。

所以可以直接进行使用,注意:第一个参数是你要进行鼠标点击事件的那个窗口

接下来分享一下如何通过透视变换将图一嵌入到图二中框选的位置

效果大概是这样的

代码中有个结构体,结构体的第一个保存的是要操作的图片窗口,第二个参数是获取到的四个点保存在一个向量容器中

fillConvexPoly()函数

函数原型:void fillConvexPoly(Mat& img, const Point* pts, int npts, const Scalar& color, int lineType=8, int shift=0)
函数作用:填充凸多边形
参数说明:img                       图像
         pts                      指向单个多边形的指针数组
         npts                     多边形的顶点个数
         color                    多边形的颜色
         LineType                 组成多边形的线条的类型
(or 0) - 8-connected line(8邻接)连接 线。
- 4-connected line(4邻接)连接线。
                                  CV_AA - antialiased 线条。
         shift                    顶点坐标的小数点位数
函数说明:函数fillConvexPoly填充凸多边形内部。这个函数比函数cvFillPoly 更快。它除了可以填充凸多边形区域还可以填充任何的单调多边形。例如:一个被水平线(扫描线)至多两次截断的多边形

  1. #include <iostream>
  2. #include <opencv2/opencv.hpp>
  3. using namespace std;
  4. using namespace cv;
  5. struct userdata
  6. {
  7. Mat img;
  8. vector<Point2f> points;
  9. };
  10. //鼠标点击事件的回调函数
  11. void mouserhandle(int event,int x,int y,int flags,void *ptr)
  12. {
  13. if(event==EVENT_LBUTTONDOWN)
  14. {
  15. userdata *data=(userdata *)ptr;
  16. circle(data->img,Point(x,y),3,Scalar(0,0,255),3,CV_AA);
  17. imshow("image1",data->img);
  18. if(data->points.size()<5)
  19. {
  20. data->points.push_back(Point2f(x,y));
  21. }
  22. }
  23. }
  24. int main()
  25. {
  26. Mat image=imread("city.jpg");
  27. Mat girl=imread("girl.jpg");
  28. //imshow("girl",girl);
  29. vector<Point2f> obj;
  30. obj.push_back(Point2f(0,0));
  31. obj.push_back(Point2f(girl.cols,0));
  32. obj.push_back(Point2f(girl.cols,girl.rows));
  33. obj.push_back(Point2f(0,girl.rows));
  34. Mat image1=image.clone();
  35. userdata data;
  36. data.img=image1;
  37. Mat result;
  38. imshow("image1",image1);
  39. setMouseCallback("image1",mouserhandle,&data);
  40. waitKey(0);
  41. Mat H=findHomography(obj,data.points,CV_RANSAC);
  42. warpPerspective(girl, result, H, image.size());
  43. Point PointArray[4];
  44. for(int i=0;i<4;i++)
  45. {
  46. PointArray[i]=data.points[i];
  47. }
  48. fillConvexPoly(image,PointArray,4,Scalar(0));//将原图中的那个菱形区域变成黑色的
  49. Mat endresult=image+result;
  50. imshow("endresult",endresult);
  51. waitKey(0);
  52. return 0;
  53. }

 大概就是这样,有错误的地方欢迎各位指教哦!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/153486
推荐阅读
相关标签
  

闽ICP备14008679号