单应性矩阵应用

一. 图像矫正

 1 #include <opencv2/opencv.hpp>
 2 using namespace cv;
 3 using namespace std;
 4 
 5 struct userdata{
 6     Mat im;
 7     vector<Point2f> points;
 8 };
 9 
10 void mouseHandler(int event, int x, int y, int flags, void* data_ptr)
11 {
12     if  ( event == EVENT_LBUTTONDOWN )
13     {
14         userdata *data = ((userdata *) data_ptr);
15         circle(data->im, Point(x,y),3,Scalar(0,0,255), 5, CV_AA);
16         imshow("Image", data->im);
17         if (data->points.size() < 4)
18         {
19             data->points.push_back(Point2f(x,y));
20         }
21     }
22 
23 }
24 
25 
26 
27 int main()
28 {
29 
30     // Read source image.
31     Mat im_src = imread("1.png");
32 
33     // Destination image. The aspect ratio of the book is 3/4
34     Size size(300,400);
35     Mat im_dst = Mat::zeros(size,CV_8UC3);
36 
37 
38     // Create a vector of destination points.
39     vector<Point2f> pts_dst;
40 
41     pts_dst.push_back(Point2f(0,0));
42     pts_dst.push_back(Point2f(size.width - 1, 0));
43     pts_dst.push_back(Point2f(size.width - 1, size.height -1));
44     pts_dst.push_back(Point2f(0, size.height - 1 ));
45 
46     // Set data for mouse event
47     Mat im_temp = im_src.clone();
48     userdata data;
49     data.im = im_temp;
50 
51     cout << "Click on the four corners of the book -- top left first and" << endl
52         << "bottom left last -- and then hit ENTER" << endl;
53 
54     // Show image and wait for 4 clicks. 
55     imshow("Image", im_temp);
56     // Set the callback function for any mouse event
57     setMouseCallback("Image", mouseHandler, &data);
58     waitKey(0);
59 
60     // Calculate the homography
61     Mat h = findHomography(data.points, pts_dst);
62 
63     // Warp source image to destination
64     warpPerspective(im_src, im_dst, h, size);
65 
66     // Show image
67     imshow("Image", im_dst);
68     waitKey(0);
69     return 0;
70 
71 
72 }

二.虚拟广告牌

 1 #include <opencv2/opencv.hpp>
 2 
 3 using namespace cv;
 4 using namespace std;
 5 
 6 struct userdata{
 7     Mat im;
 8     vector<Point2f> points;
 9 };
10 
11 
12 void mouseHandler(int event, int x, int y, int flags, void* data_ptr)
13 {
14     if  ( event == EVENT_LBUTTONDOWN )
15     {
16         userdata *data = ((userdata *) data_ptr);
17         circle(data->im, Point(x,y),3,Scalar(0,255,255), 5, CV_AA);
18         imshow("Image", data->im);
19         if (data->points.size() < 4)
20         {
21             data->points.push_back(Point2f(x,y));
22         }
23     }
24 
25 }
26 
27 
28 
29 int main( int argc, char** argv)
30 {
31 
32     // Read in the image.
33     Mat im_src = imread("2.jpeg");
34     Size size = im_src.size();
35 
36     // Create a vector of points.
37     vector<Point2f> pts_src;
38     pts_src.push_back(Point2f(0,0));
39     pts_src.push_back(Point2f(size.width - 1, 0));
40     pts_src.push_back(Point2f(size.width - 1, size.height -1));
41     pts_src.push_back(Point2f(0, size.height - 1 ));
42 
43 
44 
45     // Destination image
46     Mat im_dst = imread("3.jpeg");
47 
48 
49     // Set data for mouse handler
50     Mat im_temp = im_dst.clone();
51     userdata data;
52     data.im = im_temp;
53 
54 
55     //show the image
56     imshow("Image", im_temp);
57 
58     cout << "Click on four corners of a billboard and then press ENTER" << endl;
59     //set the callback function for any mouse event
60     setMouseCallback("Image", mouseHandler, &data);
61     waitKey(0);
62 
63     // Calculate Homography between source and destination points
64     Mat h = findHomography(pts_src, data.points);
65 
66     // Warp source image
67     warpPerspective(im_src, im_temp, h, im_temp.size());
68 
69     // Extract four points from mouse data
70     Point pts_dst[4];
71     for( int i = 0; i < 4; i++)
72     {
73         pts_dst[i] = data.points[i];
74     }
75 
76     // Black out polygonal area in destination image.
77     fillConvexPoly(im_dst, pts_dst, 4, Scalar(0), CV_AA);
78 
79     // Add warped source image to destination image.
80     im_dst = im_dst + im_temp;
81 
82     // Display image.
83     imshow("Image", im_dst);
84     waitKey(0);
85 
86     return 0;
87 }

CMakelists.txt:

 1 cmake_minimum_required( VERSION 2.8 )
 2 project( a )
 3 
 4 set( CMAKE_BUILD_TYPE Release )
 5 set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )
 6 
 7 find_package( OpenCV )
 8 include_directories( ${OpenCV_INCLUDE_DIRS} )
 9 
10 add_executable( a a.cpp )
11 target_link_libraries( a ${OpenCV_LIBS} )
12 
13 add_executable( b b.cpp )
14 target_link_libraries( b ${OpenCV_LIBS} )

 

图片下载:

                                       图片1                                                                                         图片2

 

                                                                                                                      图片3

posted @ 2019-08-10 21:20  心田居士  阅读(1481)  评论(0编辑  收藏  举报