This is GPU version of this page ->http://feelmare.blogspot.kr/2013/12/finding-largest-subset-images-that-is.html
Please refer detail description on that page.
The gpu mode is showed about 10 times faster than gpu processing.
I think GPU programing is very ensential in computer vision, if you don't have contraint on the performance of equipment.
...
#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() { //processign tiem measurement unsigned long AAtime=0, BBtime=0; //processing time measure AAtime = getTickCount(); vector< Mat > vImg; Mat rImg; vImg.push_back( imread("./stitching_img/m7.jpg",0) ); vImg.push_back( imread("./stitching_img/S1.jpg",0) ); vImg.push_back( imread("./stitching_img/m9.jpg",0) ); vImg.push_back( imread("./stitching_img/m6.jpg",0) ); vImg.push_back( imread("./stitching_img/S6.jpg",0) ); vImg.push_back( imread("./stitching_img/m8.jpg",0) ); //feature extract gpu::SURF_GPU FeatureFinder_gpu(400); gpu::GpuMat inImg_g; gpu::GpuMat src_keypoints_gpu, src_descriptors_gpu; vector< cv::KeyPoint> src_keypoints; vector< float> src_descriptors; vector< detail::ImageFeatures> features; for(int i=0; i< vImg.size(); ++i) { detail::ImageFeatures F; inImg_g.upload(vImg[i]); FeatureFinder_gpu(inImg_g, gpu::GpuMat(), src_keypoints_gpu, src_descriptors_gpu, false); //descriptor down FeatureFinder_gpu.downloadKeypoints(src_keypoints_gpu, src_keypoints); FeatureFinder_gpu.downloadDescriptors(src_descriptors_gpu, src_descriptors); //make ImageFeatures F.img_idx=i; F.img_size = Size(vImg[i].cols, vImg[i].rows); F.keypoints = src_keypoints; Mat M = Mat(src_descriptors.size()/64.0, 64, CV_32FC1); F.descriptors = M; memcpy(M.data, src_descriptors.data(), src_descriptors.size()*sizeof(float)); //Add vector features.push_back(F); //data confirm printf("%d - key:%d \n", features[i].img_idx, features[i].keypoints.size() ); printf(" des:cols:%d, rows:%d \n", features[i].descriptors.cols, features[i].descriptors.rows); } //match vector< int> indices_; double conf_thresh_ = 1.0; Mat matching_mask; vector< detail::MatchesInfo> pairwise_matches; detail::BestOf2NearestMatcher Matcher(true); Matcher(features, pairwise_matches, matching_mask); Matcher.collectGarbage(); //grouping 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] ); } //Processing time measurement BBtime = getTickCount(); printf("Processing time = %.2lf(sec) \n", (BBtime - AAtime)/getTickFrequency() ); }
No comments:
Post a Comment