1 bool ImageOverlap(cv::Mat &img1,cv::Mat &img2,std::vector<:point> &vPtsImg1,std::vector<: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<: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<: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 keypoints of the image*/

18 matcher.match(descriptor_roi, descriptor_img, matches);19

20 double max_dist = 0; double min_dist = 1000;21

22 //-- Quick calculation of max and min distances between keypoints

23 for( int i = 0; i < descriptor_roi.rows; i++)24 {25 double dist =matches[i].distance;26 if( dist < min_dist ) min_dist =dist;27 if( dist > max_dist ) max_dist =dist;28 }29

30 for (i=0; i < descriptor_roi.rows; i++)31 {32 if (matches[i].distance < 3*min_dist)33 {34 good_matches.push_back(matches[i]);35 }36 }37

38 //printf("%ld no. of matched keypoints in right image\n", good_matches.size());

39 /*Draw matched keypoints*/

40

41 //Mat img_matches;42 //drawMatches(img1, keypoints_roi, img2, keypoints_img,43 //good_matches, img_matches, Scalar::all(-1),44 //Scalar::all(-1), vector(),45 //DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);46 //imshow("matches",img_matches);

47

48 vectorkeypoints1, keypoints2;49 for (i=0; i

55 Mat H =findHomography( keypoints1, keypoints2, CV_RANSAC );56

57 //show stitchImage58 //cv::Mat stitchedImage;59 //int mRows = img2.rows;60 //if (img1.rows> img2.rows)61 //{62 //mRows = img1.rows;63 //}64 //stitchedImage = Mat::zeros(img2.cols+img1.cols, mRows, CV_8UC3);65 //warpPerspective(img2,stitchedImage,H,Size(img2.cols+img1.cols,mRows));66 //Mat half(stitchedImage,Rect(0,0,img1.cols,img1.rows));67 //img1.copyTo(half);68 //imshow("stitchedImage",stitchedImage);

69

70 std::vector<:point>vSrcPtsImg1;71 std::vector<:point>vSrcPtsImg2;72

73 vSrcPtsImg1.push_back(cv::Point(0,0));74 vSrcPtsImg1.push_back(cv::Point(0,img1.rows));75 vSrcPtsImg1.push_back(cv::Point(img1.cols,img1.rows));76 vSrcPtsImg1.push_back(cv::Point(img1.cols,0));77

78 vSrcPtsImg2.push_back(cv::Point(0,0));79 vSrcPtsImg2.push_back(cv::Point(0,img2.rows));80 vSrcPtsImg2.push_back(cv::Point(img2.cols,img2.rows));81 vSrcPtsImg2.push_back(cv::Point(img2.cols,0));82

83 //计算图像2在图像1中对应坐标信息

84 std::vector<:point>vWarpPtsImg2;85 for(int i = 0;i < vSrcPtsImg2.size();i++)86 {87 cv::Mat srcMat = Mat::zeros(3,1,CV_64FC1);88 srcMat.at(0,0) =vSrcPtsImg2[i].x;89 srcMat.at(1,0) =vSrcPtsImg2[i].y;90 srcMat.at(2,0) = 1.0;91

92 cv::Mat warpMat = H *srcMat;93 cv::Point warpPt;94 warpPt.x = cvRound(warpMat.at(0,0)/warpMat.at(2,0));95 warpPt.y = cvRound(warpMat.at(1,0)/warpMat.at(2,0));96

97 vWarpPtsImg2.push_back(warpPt);98 }99 //计算图像1和转换后的图像2的交点

100 if(!PolygonClip(vSrcPtsImg1,vWarpPtsImg2,vPtsImg1))101 return false;102

103 for (int i = 0;i < vPtsImg1.size();i++)104 {105 cv::Mat srcMat = Mat::zeros(3,1,CV_64FC1);106 srcMat.at(0,0) =vPtsImg1[i].x;107 srcMat.at(1,0) =vPtsImg1[i].y;108 srcMat.at(2,0) = 1.0;109

110 cv::Mat warpMat = H.inv() *srcMat;111 cv::Point warpPt;112 warpPt.x = cvRound(warpMat.at(0,0)/warpMat.at(2,0));113 warpPt.y = cvRound(warpMat.at(1,0)/warpMat.at(2,0));114 vPtsImg2.push_back(warpPt);115 }116 return true;117 }

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐