2012-04-13 51 views
1

所以,我試圖提取一些SURF關鍵點,但是我想強加這些關鍵點!所以,我把最後一個參數設置爲「true」,即「useProvidedKeypoints」。cvExtractSURF在useProvidedKeypoints = true時不起作用

此外,當我創建我的關鍵點時,我使用了默認的構造函數(因此有一些默認值)。我只改變點「pt」和我設置爲3的八度。

我在SURF中使用C++接口。但是我知道cvExtractSURF的問題是正確的,因爲我複製了我的部分代碼以幫助我進行調試。

當我調用該函數,設置爲true的最後一個參數,我得到這個錯誤:

OpenCV Error: Bad argument (Unknown array type) in cvarrToMat, file /home/widgg/opencv/trunk/modules/core/src/matrix.cpp, line 651 
terminate called after throwing an instance of 'cv::Exception' 
    what(): /home/widgg/opencv/trunk/modules/core/src/matrix.cpp:651: error: (-5) Unknown array type in function cvarrToMat 

我真的不知道我在做什麼錯了!

編輯:

這是一些代碼。首先,我是如何創建的關鍵點(給我留下了幾個信息,像layer_id的東西,但你的主要的想法):

for (json_pt_info_vector::iterator b_beg = beg->points.begin(); b_beg != b_end; ++b_beg) 
{ 
    int layer_id = b_beg->layer_id; 
    json_point_info_coord &jpic = b_beg->coord; 

    jpic.feature_id = features[layer_id].keypoints.size(); 
    KeyPoint kp; 
    kp.octave = 3; 
    kp.pt.x = jpic.x; 
    kp.pt.y = jpic.y; 
    features[layer_id].keypoints.push_back(kp); 
} 

這裏的調用SURF:

SURF surf(300, 3, 4); 
for (int i = 0; i < nb_img; ++i) 
{ 
    debug_msg("extract_features #4.1"); 
    cv::detail::ImageFeatures &cdif = features[i]; 
    Mat gray_image = imread(param.layer_images[i], 0); // 0 = force to gray scale! 

    debug_msg("extract_features #4.2"); 
    vector<float> descriptors; 
    debug_msg("extract_features #4.3"); 
    surf(gray_image, Mat(), cdif.keypoints, descriptors, true); // MUST BE TRUE TO FORCE THE PROVIDED KEYPOINTS 

    debug_msg("extract_features #4.4"); 
    cdif.descriptors = Mat(descriptors, true).reshape(1, (int)cdif.keypoints.size()); 
    debug_msg("extract_features #4.5"); 
    gray_image.release(); 

    debug_msg("extract_features #4.6"); 
    images[i] = imread(param.layer_images[i]); // keep the image open 
} 

之後崩潰#4.3在調試信息中!

希望有幫助!

編輯2:

我換成CV某些部分:: SurfDescriptorExtracter。我用下面這一行取代了從4.3到4.5:

extractor.compute(gray_image, cdif.keypoints, cdif.descriptors); 

所以,現在,還是有錯誤,但它位於其他地方,沒有必要與此相關的問題!

+0

我們需要查看我們的代碼來幫助您。如果您提供自己的cv :: Keypoint向量,則應該使用(C++ api)cv :: DescriptorExtractor對象來計算描述符。 – Eric 2012-04-13 16:09:59

+0

你如何使用cv :: DescriptorExtractor?另外,我希望我放的代碼可以幫助你一點! – widgg 2012-04-13 18:07:49

回答

0

我很驚訝,即使編譯surf(gray_image, Mat(), cdif.keypoints, descriptors, true)descriptors參數應該是一個cv :: Mat,而不是一個向量。

相關問題