virtual-billboard.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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("first-image.jpg");
  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("times-square.jpg");
  34. // Set data for mouse handler
  35. Mat im_temp = im_dst.clone();
  36. userdata data;
  37. data.im = im_temp;
  38. //show the image
  39. imshow("Image", im_temp);
  40. cout << "Click on four corners of a billboard and then press ENTER" << endl;
  41. //set the callback function for any mouse event
  42. setMouseCallback("Image", mouseHandler, &data);
  43. waitKey(0);
  44. // Calculate Homography between source and destination points
  45. Mat h = findHomography(pts_src, data.points);
  46. // Warp source image
  47. warpPerspective(im_src, im_temp, h, im_temp.size());
  48. // Extract four points from mouse data
  49. Point pts_dst[4];
  50. for( int i = 0; i < 4; i++)
  51. {
  52. pts_dst[i] = data.points[i];
  53. }
  54. // Black out polygonal area in destination image.
  55. fillConvexPoly(im_dst, pts_dst, 4, Scalar(0), cv::LINE_AA);
  56. // Add warped source image to destination image.
  57. im_dst = im_dst + im_temp;
  58. // Display image.
  59. imshow("Image", im_dst);
  60. waitKey(0);
  61. return 0;
  62. }