您好,登錄后才能下訂單哦!
小編給大家分享一下opencv2基于SURF特征提取實現兩張圖像拼接融合的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
本文實例為大家分享了opencv2實現兩張圖像拼接融合的具體代碼,供大家參考,具體內容如下
要用到兩個文件,estimate.cpp和matcher.h(在有關魯棒匹配這篇博文中有)
estimate.cpp的頭文件也需要添加一些東西才行,以下是對的,已經成功運行。
加了using namespace std;之后,cv::可以去掉了。
estimate.cpp:
#include <iostream> #include <vector> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/calib3d/calib3d.hpp> #include<opencv2/nonfree/nonfree.hpp> #include<opencv2\legacy\legacy.hpp> #include "matcher.h" using namespace std; using namespace cv; int main() { // Read input images讀入圖像 cv::Mat image1= cv::imread("parliament1.bmp",0); cv::Mat image2= cv::imread("parliament2.bmp",0); if (!image1.data || !image2.data) return 0; // Display the images顯示圖像 cv::namedWindow("Image 1"); cv::imshow("Image 1",image1); cv::namedWindow("Image 2"); cv::imshow("Image 2",image2); // Prepare the matcher準備匹配 RobustMatcher rmatcher; rmatcher.setConfidenceLevel(0.98); rmatcher.setMinDistanceToEpipolar(1.0); rmatcher.setRatio(0.65f); cv::Ptr<cv::FeatureDetector> pfd= new cv::SurfFeatureDetector(10); rmatcher.setFeatureDetector(pfd); // Match the two images std::vector<cv::DMatch> matches; std::vector<cv::KeyPoint> keypoints1, keypoints2; cv::Mat fundemental= rmatcher.match(image1,image2,matches, keypoints1, keypoints2); // draw the matches畫匹配結果 cv::Mat imageMatches; cv::drawMatches(image1,keypoints1, // 1st image and its keypoints第一張圖像及其關鍵點 image2,keypoints2, // 2nd image and its keypoints第二張圖像及其關鍵點 matches, // the matches匹配結果 imageMatches, // the image produced產生的圖像 cv::Scalar(255,255,255)); // color of the lines線的顏色 cv::namedWindow("Matches"); cv::imshow("Matches",imageMatches); // Convert keypoints into Point2f將關鍵點轉換為Point2f std::vector<cv::Point2f> points1, points2; for (std::vector<cv::DMatch>::const_iterator it= matches.begin(); it!= matches.end(); ++it) {H // Get the position of left keypoints得到左圖關鍵點位置 float x= keypoints1[it->queryIdx].pt.x; float y= keypoints1[it->queryIdx].pt.y; points1.push_back(cv::Point2f(x,y)); // Get the position of right keypoints得到右圖關鍵點位置 x= keypoints2[it->trainIdx].pt.x; y= keypoints2[it->trainIdx].pt.y; points2.push_back(cv::Point2f(x,y)); } std::cout << points1.size() << " " << points2.size() << std::endl; // Find the homography between image 1 and image 2找到圖像1和圖像2之間的單應性矩陣 std::vector<uchar> inliers(points1.size(),0); cv::Mat homography= cv::findHomography( cv::Mat(points1),cv::Mat(points2), // corresponding points對應點 inliers, // outputed inliers matches 輸出內點匹配 CV_RANSAC, // RANSAC method RANSAC 方法 1.); // max distance to reprojection point到對應點的最大距離 // Draw the inlier points畫內點 std::vector<cv::Point2f>::const_iterator itPts= points1.begin(); std::vector<uchar>::const_iterator itIn= inliers.begin(); while (itPts!=points1.end()) { // draw a circle at each inlier location在每一個內點畫一個圈 if (*itIn) cv::circle(image1,*itPts,3,cv::Scalar(255,255,255),2); ++itPts; ++itIn; } itPts= points2.begin(); itIn= inliers.begin(); while (itPts!=points2.end()) { // draw a circle at each inlier location在每一個內點畫一個圈 if (*itIn) cv::circle(image2,*itPts,3,cv::Scalar(255,255,255),2); ++itPts; ++itIn; } // Display the images with points顯示畫點的圖像 cv::namedWindow("Image 1 Homography Points"); cv::imshow("Image 1 Homography Points",image1); cv::namedWindow("Image 2 Homography Points"); cv::imshow("Image 2 Homography Points",image2); // Warp image 1 to image 2變形圖像1到圖像2 cv::Mat result; cv::warpPerspective(image1, // input image輸入的圖像 result, // output image輸出的圖像 homography, // homography單應性矩陣 cv::Size(2*image1.cols,image1.rows)); // size of output image輸出圖像的大小 // Copy image 1 on the first half of full image復制圖像1的上一部分 cv::Mat half(result,cv::Rect(0,0,image2.cols,image2.rows)); image2.copyTo(half); // Display the warp image顯示變形后圖像 cv::namedWindow("After warping"); cv::imshow("After warping",result); cv::waitKey(); return 0; }
以上是“opencv2基于SURF特征提取實現兩張圖像拼接融合的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。