2011-11-18 50 views
1

我只是想知道,如果使用SurfFeatureDetector檢測關鍵點,並使用SurfDescriptorExtractor提取SURF描述符(請參閱here中所述的代碼)不會提取兩次描述符。openCV SurfFeatureDetector在內部不必要地提取描述符嗎?

SurfFeatureDetector detector(minHessian); 

    std::vector<KeyPoint> keypoints; 
    detector.detect(img, keypoints); //detecting keypoints, extracting descriptors without returning them 

    SurfDescriptorExtractor extractor; 
    Mat descriptors; 

    extractor.compute(img, keypoints, descriptors); // extracting descriptors a second time 

openCV文檔說,這兩個類是SURF()類的包裝器。 SURF::operator()被重載,一個版本只取一個關鍵點向量,另一個版本另外爲描述符取一個向量。 什麼使我感興趣...然後調用cvExtractSURF()函數,這似乎提取描述符,不管怎樣......(我沒有深入研究C代碼,因爲我發現它很難理解,所以也許我' m wrong) 但是這意味着SurfFeatureDetector會提取描述符而不返回它們。在下一步中使用SurfDescriptorExtractor只是第二次,這對我來說似乎非常低效。但我對嗎?

回答

3

您可以放心,探測器實際上並不計算描述符。要查看的關鍵語句是Surf.cpp if(!descriptors) continue;的第687行。在檢測期間不計算功能,應該是這樣。這種體系結構最有可能是因爲衝浪代碼在設計/開發自己工作之後被「添加」到OpenCV中。

作爲背景:請注意,檢測器和特徵提取器是不同的東西。您首先使用SurfFeatureDetector「檢測」點,其中本地功能被提取(使用SurfDescriptorExtractor)。你有一個片段是一個很好的指導。

+1

我知道檢測器和提取器是兩個不同的東西。否則,我不會問...但看着源代碼,我發現這兩個內部調用cvExtractSurf()。而且我找不到在第一種情況下跳過描述符計算的地方。也許有人可以指出哪裏發生的代碼行證明我錯了......我真的希望被證明是錯的! – Ben

+0

你能否提供行號?在哪裏看到cvExtractSurf()從探測器中調用? – KMS

+0

在OpenCV中2.2.0源碼: features2d - > detectors.cpp: 線442:衝浪(grayImage,掩模,關鍵點)稱爲 這應該是指: features2d-> surf.cpp: 線960:無效SURF ::運算符()(常量墊&IMG,常量墊&掩模, 矢量&關鍵點)常量 然後,在線路968: cvExtractSURF(&_ IMG,PMASK,&kp.seq,0,存儲,*(常量CvSURFParams * )this,0); 然後它進入C代碼,這很難閱讀(對我來說) – Ben