问题描述:已知两幅图像Image1和Image2,计算出两幅图像的重叠区域,并在Image1和Image2标识出重叠区域。
算法思想:
若两幅图像存在重叠区域,则进行图像匹配后,会得到一张完整的全景图,因而可以转换成图像匹配问题。
图像匹配问题,可以融合两幅图像,得到全景图,但无法标识出在原图像的重叠区域。
将两幅图像都理解为多边形,则其重叠区域的计算,相当于求多边形的交集。
通过多边形求交,获取重叠区域的点集,然后利用单应矩阵还原在原始图像的点集信息,从而标识出重叠区域。
算法步骤:
1.图像匹配计算,获取单应矩阵。
2.根据单应矩阵,计算图像2的顶点转换后的点集。
3.由图像1的顶点集合和图像2的转换点集,计算多边形交集。
4.根据单应矩阵的逆,计算多边形的交集在图像2中的原始点集。
代码实现如下所示:
1 bool ImageOverlap(cv::Mat &img1,cv::Mat &img2,std::vector<cv::Point> &vPtsImg1,std::vector<cv::Point> &vPtsImg2) 2 { 3 cv::Mat g1(img1,Rect(0,0,img1.cols,img1.rows)); 4 cv::Mat g2(img2,Rect(0,0,img2.cols,img2.rows)); 5 6 cv::cvtColor(g1,g1,CV_BGR2GRAY); 7 cv::cvtColor(g2,g2,CV_BGR2GRAY); 8 9 std::vector<cv::KeyPoint> keypoints_roi, keypoints_img; /* keypoints found using SIFT */ 10 cv::Mat descriptor_roi, descriptor_img; /* Descriptors for SIFT */ 11 cv::FlannBasedMatcher matcher; /* FLANN based matcher to match keypoints */ 12 std::vector<cv::DMatch> matches, good_matches; 13 cv::SIFT sift; 14 int i, dist=80; 15 16 sift(g1, Mat(), keypoints_roi, descriptor_roi); /* get keypoints of ROI image */ 17 sift(g2, Mat(), keypoints_img, descriptor_img); /* get key