我只是想知道,如果使用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
只是第二次,這對我來說似乎非常低效。但我對嗎?
我知道檢測器和提取器是兩個不同的東西。否則,我不會問...但看着源代碼,我發現這兩個內部調用cvExtractSurf()。而且我找不到在第一種情況下跳過描述符計算的地方。也許有人可以指出哪裏發生的代碼行證明我錯了......我真的希望被證明是錯的! – Ben
你能否提供行號?在哪裏看到cvExtractSurf()從探測器中調用? – KMS
在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