1.
find features in each images using SurfFeaturesFinder function.
Features value is contained in the ImageFeatures structure.
2.
Matching features.
Matcher(features, pairwise_matches, matching_mask)
in the source code, features is vector.
So the Matcher function get matcing value of each pair images.
3.
leave biggest component,
Using conf_threshold, the function leaves largest correlation images.
Input
Input image is 6 images.
4 images are sequence images, 2 images is another sequence images.
Output
The souce code gives the result that is index of subset images of 4 images component.
////
#include < stdio.h > #include < opencv2\opencv.hpp > #include < opencv2\features2d\features2d.hpp > #include < opencv2\nonfree\features2d.hpp > #include < opencv2\stitching\detail\matchers.hpp > #include < opencv2\stitching\stitcher.hpp > #ifdef _DEBUG #pragma comment(lib, "opencv_core247d.lib") //#pragma comment(lib, "opencv_imgproc247d.lib") //MAT processing //#pragma comment(lib, "opencv_objdetect247d.lib") //#pragma comment(lib, "opencv_gpu247d.lib") #pragma comment(lib, "opencv_features2d247d.lib") #pragma comment(lib, "opencv_highgui247d.lib") //#pragma comment(lib, "opencv_ml247d.lib") #pragma comment(lib, "opencv_stitching247d.lib"); #pragma comment(lib, "opencv_nonfree247d.lib"); #else #pragma comment(lib, "opencv_core247.lib") //#pragma comment(lib, "opencv_imgproc247.lib") //#pragma comment(lib, "opencv_objdetect247.lib") //#pragma comment(lib, "opencv_gpu247.lib") #pragma comment(lib, "opencv_features2d247.lib") #pragma comment(lib, "opencv_highgui247.lib") //#pragma comment(lib, "opencv_ml247.lib") #pragma comment(lib, "opencv_stitching247.lib"); #pragma comment(lib, "opencv_nonfree247.lib"); #endif using namespace cv; using namespace std; void main() { vector< Mat > vImg; Mat rImg; vImg.push_back( imread("./m7.jpg") ); vImg.push_back( imread("./B1.jpg") ); vImg.push_back( imread("./m9.jpg") ); vImg.push_back( imread("./m6.jpg") ); vImg.push_back( imread("./B2.jpg") ); vImg.push_back( imread("./m8.jpg") ); //feature extract detail::SurfFeaturesFinder FeatureFinder; vector< detail::ImageFeatures> features; for(int i=0; i< vImg.size(); ++i) { detail::ImageFeatures F; FeatureFinder(vImg[i], F); features.push_back(F); features[i].img_idx = i; printf("Keypoint of [%d] - %d points \n", i, features[i].keypoints.size() ); } FeatureFinder.collectGarbage(); //match vector< int> indices_; double conf_thresh_ = 1.0; Mat matching_mask; vector< detail::MatchesInfo> pairwise_matches; detail::BestOf2NearestMatcher Matcher; Matcher(features, pairwise_matches, matching_mask); Matcher.collectGarbage(); printf("\nBiggest subset is ...\n"); // Leave only images we are sure are from the same panorama indices_ = detail::leaveBiggestComponent(features, pairwise_matches, (float)conf_thresh_); Matcher.collectGarbage(); for (size_t i = 0; i < indices_.size(); ++i) { printf("%d \n", indices_[i] ); } }////