Especially, for using surf class, we have to add extra library when build opencv 3.0 rc1.
The extra lib is opened in github named opencv_contrib.
refer to this page.
http://study.marearts.com/2015/01/mil-boosting-tracker-test-in-opencv-30.html
surf(gpu version) is included in xfeatures2d/cuda.hpp
and cpu version is xfeatures2d/nonfree.hpp
As we know, surf, sift are still nonfree. very not good!..-.-
necessary dlls
result
Now, refer this example code.
This cod is converted from http://study.marearts.com/2014/07/opencv-study-surf-gpu-and-matching.html.
#include < stdio.h>
#include < iostream>
#include < opencv2\opencv.hpp>
#include < opencv2\core.hpp>
#include < opencv2\highgui.hpp>
#include < opencv2\cudaarithm.hpp>
#include < opencv2\xfeatures2d\cuda.hpp>
#include < opencv2\cudafeatures2d.hpp>
//#include < opencv2\xfeatures2d\nonfree.hpp>
#ifdef _DEBUG
#pragma comment(lib, "opencv_core300d.lib")
#pragma comment(lib, "opencv_highgui300d.lib")
#pragma comment(lib, "opencv_imgcodecs300d.lib")
#pragma comment(lib, "opencv_cudafeatures2d300d.lib")
#pragma comment(lib, "opencv_xfeatures2d300d.lib")
#pragma comment(lib, "opencv_features2d300d.lib")
#else
#pragma comment(lib, "opencv_core300.lib")
#pragma comment(lib, "opencv_highgui300.lib")
#pragma comment(lib, "opencv_imgcodecs300.lib")
#pragma comment(lib, "opencv_cudafeatures2d300.lib")
#pragma comment(lib, "opencv_xfeatures2d300.lib")
#pragma comment(lib, "opencv_features2d300.lib")
#endif
using namespace cv;
using namespace std;
void main()
{
cuda::GpuMat img1(imread("M:\\____videoSample____\\Image\\A2.jpg", CV_LOAD_IMAGE_GRAYSCALE));
cuda::GpuMat img2(imread("M:\\____videoSample____\\Image\\A3.jpg", CV_LOAD_IMAGE_GRAYSCALE));
/////////////////////////////////////////////////////////////////////////////////////////
unsigned long t_AAtime = 0, t_BBtime = 0;
float t_pt;
float t_fpt;
t_AAtime = getTickCount();
/////////////////////////////////////////////////////////////////////////////////////////
cuda::SURF_CUDA surf(400);
// detecting keypoints & computing descriptors
cuda::GpuMat keypoints1GPU, keypoints2GPU;
cuda::GpuMat descriptors1GPU, descriptors2GPU;
surf(img1, cuda::GpuMat(), keypoints1GPU, descriptors1GPU);
surf(img2, cuda::GpuMat(), keypoints2GPU, descriptors2GPU);
cout << "FOUND " << keypoints1GPU.cols << " keypoints on first image" << endl;
cout << "FOUND " << keypoints2GPU.cols << " keypoints on second image" << endl;
// matching descriptors
vector< vector< DMatch> > matches;
Ptr< cuda::DescriptorMatcher > matcher = cuda::DescriptorMatcher::createBFMatcher();
matcher->knnMatch(descriptors1GPU, descriptors2GPU, matches, 2);
// downloading results Gpu -> Cpu
vector< KeyPoint> keypoints1, keypoints2;
vector< float> descriptors1, descriptors2;
surf.downloadKeypoints(keypoints1GPU, keypoints1);
surf.downloadKeypoints(keypoints2GPU, keypoints2);
//surf.downloadDescriptors(descriptors1GPU, descriptors1);
//surf.downloadDescriptors(descriptors2GPU, descriptors2);
vector< KeyPoint> matchingKey1, matchingKey2;
std::vector< DMatch > good_matches;
for (int k = 0; k < min(descriptors1GPU.rows - 1, (int)matches.size()); k++)
{
if ((matches[k][0].distance < 0.6*(matches[k][1].distance)) && ((int)matches[k].size() <= 2 && (int)matches[k].size()>0))
{
good_matches.push_back(matches[k][0]);
}
}
t_BBtime = getTickCount();
t_pt = (t_BBtime - t_AAtime) / getTickFrequency();
t_fpt = 1 / t_pt;
printf("feature extraction = %.4lf / %.4lf \n", t_pt, t_fpt);
// drawing the results
Mat img_matches;
Mat img11, img22;
img1.download(img11);
img2.download(img22);
//drawMatches(img11, matchingKey1, img22, matchingKey2, good_matches, img_matches);
drawMatches(img11, keypoints1, img22, keypoints2, good_matches, img_matches);
namedWindow("matches", 0);
imshow("matches", img_matches);
waitKey(0);
matcher.release();
}
No comments:
Post a Comment