The souce code flow is like that...
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] );
}
}
////