2012-07-19 454 views
0

我想編譯一個示例openCV項目,它使用SURF進行圖像匹配。OpenCV - 無法使用SurfFeatureDetector類

該代碼是波紋管列出:

#include <stdio.h> 
#include <iostream> 
#include <cv.h> 
#include <cxcore.h> 
#include <highgui.h> 
//#include "opencv2/core/core.hpp" 
//#include "opencv2/features2d/features2d.hpp" 
//#include "opencv2/highgui/highgui.hpp" 

using namespace cv; 

void readme(); 

/** @function main */ 
int main() 
{ 
/* 
if(argc != 3) 
{ readme(); return -1; } 

Mat img_1 = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE); 
Mat img_2 = imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE); 
*/ 

Mat img_1 = imread("D:\\A.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
Mat img_2 = imread("D:\\backImg.jpg", CV_LOAD_IMAGE_GRAYSCALE); 

if(!img_1.data || !img_2.data) 
{ std::cout<< " --(!) Error reading images " << std::endl; return -1; } 

//-- Step 1: Detect the keypoints using SURF Detector 
int minHessian = 400; 

SurfFeatureDetector detector; 

std::vector<KeyPoint> keypoints_1, keypoints_2; 

detector.detect(img_1, keypoints_1); 
detector.detect(img_2, keypoints_2); 

//-- Step 2: Calculate descriptors (feature vectors) 
SurfDescriptorExtractor extractor; 

Mat descriptors_1, descriptors_2; 

extractor.compute(img_1, keypoints_1, descriptors_1); 
extractor.compute(img_2, keypoints_2, descriptors_2); 

//-- Step 3: Matching descriptor vectors using FLANN matcher 
FlannBasedMatcher matcher; 
std::vector<DMatch> matches; 
matcher.match(descriptors_1, descriptors_2, matches); 

double max_dist = 0; double min_dist = 100; 

//-- Quick calculation of max and min distances between keypoints 
for(int i = 0; i < descriptors_1.rows; i++) 
{ double dist = matches[i].distance; 
if(dist < min_dist) min_dist = dist; 
if(dist > max_dist) max_dist = dist; 
} 

printf("-- Max dist : %f \n", max_dist); 
printf("-- Min dist : %f \n", min_dist); 

//-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist) 
//-- PS.- radiusMatch can also be used here. 
std::vector<DMatch> good_matches; 

for(int i = 0; i < descriptors_1.rows; i++) 
{ if(matches[i].distance < 2*min_dist) 
{ good_matches.push_back(matches[i]); } 
} 

//-- Draw only "good" matches 
Mat img_matches; 
drawMatches(img_1, keypoints_1, img_2, keypoints_2, 
    good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), 
    vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 

//-- Show detected matches 
imshow("Good Matches", img_matches); 

for(int i = 0; i < good_matches.size(); i++) 
{ printf("-- Good Match [%d] Keypoint 1: %d -- Keypoint 2: %d \n", i,   good_matches[i].queryIdx, good_matches[i].trainIdx); } 

waitKey(0); 

return 0; 
} 

/** @function readme */ 
void readme() 
{ std::cout << " Usage: ./SURF_FlannMatcher <img1> <img2>" << std::endl; } 

當我嘗試編譯我收到錯誤爲SurfFeatureDetector作爲未聲明的標識符。當我右鍵點擊它並進入定義時,它會打開它。我應該包括其他東西嗎?它位於cv.h文件中包含的features2d.hpp中。你能幫我解決這個問題嗎?

+0

您是否安裝了兩個版本的OpenCV?其中之一是2.4? – Sam 2012-07-19 09:07:46

+0

是的,我有2.3.0和2.4.2 – Simon 2012-07-19 09:16:13

+1

si sper ca votezi NU拉公民投票... – Sam 2012-07-19 11:53:33

回答

1

您的編譯器和編輯器被安裝在系統上的兩個OpenCV版本所困惑。

首先,確保所有的設置(包括在Visual Studio路徑,LIB在Visual Studio連接器設置路徑和路徑 - 可能的環境變量)指向同一個版本。

接下來,請確保包含所有需要的標題。在OpenCV 2.4及以上版本中,SURF和SIFT已移至nonfree模塊,因此您還必須安裝它。不要忘記,一些功能可能會被移動到legacy

如果您卸載了一個版本的OpenCV,編輯器(它不具備編譯器的所有解析功能)不會再被混淆。

5

只需添加非遊離模塊在你的頭文件,如果你正在使用的OpenCV 2.4.2它會解決你的問題..

0

有同樣的問題 只包括

#include <opencv2/nonfree/nonfree.hpp> 

和解決。

0

我有同樣的問題,我做以下步驟

  • 刪除PROGRAMFILES不同版本的OpenCV。
  • 檢查環境變量(僅一個和OpenCV的版本正道)
  • 在我的項目debug文件夾,我加上「cvextern.dll」和「cvextern_gpu.dll」(features2d.dll加入不夠)