homography2.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include <opencv2/opencv.hpp>
  2. using namespace cv;
  3. using namespace std;
  4. struct userdata{
  5. Mat im;
  6. vector<Point2f> points;
  7. };
  8. void mouseHandler(int event, int x, int y, int flags, void* data_ptr)
  9. {
  10. if ( event == EVENT_LBUTTONDOWN )
  11. {
  12. userdata *data = ((userdata *) data_ptr);
  13. circle(data->im, Point(x,y),3,Scalar(0,255,255), 5, cv::LINE_AA);
  14. imshow("Image", data->im);
  15. if (data->points.size() < 4)
  16. {
  17. data->points.push_back(Point2f(x,y));
  18. }
  19. }
  20. }
  21. int main( int argc, char** argv)
  22. {
  23. // Read in the image.
  24. Mat im_src = imread(argv[1]);
  25. Size size = im_src.size();
  26. // Create a vector of points.
  27. vector<Point2f> pts_src;
  28. pts_src.push_back(Point2f(0,0));
  29. pts_src.push_back(Point2f(size.width - 1, 0));
  30. pts_src.push_back(Point2f(size.width - 1, size.height -1));
  31. pts_src.push_back(Point2f(0, size.height - 1 ));
  32. // Destination image
  33. Mat im_dst = imread(argv[2]);
  34. //Create a window
  35. namedWindow("Image", 1);
  36. Mat im_temp = im_dst.clone();
  37. userdata data;
  38. data.im = im_temp;
  39. //set the callback function for any mouse event
  40. setMouseCallback("Image", mouseHandler, &data);
  41. //show the image
  42. imshow("Image", im_temp);
  43. waitKey(0);
  44. Mat tform = findHomography(pts_src, data.points);
  45. warpPerspective(im_src, im_temp, tform, im_temp.size());
  46. Point pts_dst[4];
  47. for( int i = 0; i < 4; i++)
  48. {
  49. pts_dst[i] = data.points[i];
  50. }
  51. fillConvexPoly(im_dst, pts_dst, 4, Scalar(0), cv::LINE_AA);
  52. im_dst = im_dst + im_temp;
  53. imshow("Image", im_dst);
  54. waitKey(0);
  55. return 0;
  56. }