2016-04-18 39 views
1

編輯:我在看OpenCV2的錯誤代碼示例,在OpenCV3中沒有FeatureDetector::create - 這讓我感到困惑。OpenCV 3:可用的FeatureDetector :: create()和DescriptorExtractor :: create()選項的列表?


嘿新的OpenCV和通過拉開其他人C++代碼學習。

我想嘗試所有可用的選項:

detector = FeatureDetector::create(str_detector); 
descriptor = DescriptorExtractor::create(str_descriptor); 

目前str_detector是FAST和str_descriptor是我無法找到什麼可用的檢測和描述符可我BRISK

有沒有辦法輸出當前所有可用選項的列表?

(我剛剛建立了最新的OpenCV + OpenCV的-contrib請從GitHub上一個新的Linux安裝)

我已經找到了第三方文件的列表,在這裏https://github.com/Itseez/opencv_contrib/tree/master/modules/xfeatures2d/src - 我覺得這些都是第三描述符和探測器,因爲這些在某些文件中提到了單詞。不過,最好有一個當前編譯/可用選項的完整列表。

謝謝!


試圖找到自己的答案,編輯,因爲我去:

  1. 發現typedef Feature2D FeatureDetectortypedef Feature2D DescriptorExtractormodules/features2d/include/opencv2/features2d.hpp
  2. 現在挖Feature2D ...
  3. 我很困惑,我的C++失敗我,沒有createhttps://github.com/Itseez/opencv/blob/master/modules/features2d/src/feature2d.cpp
  4. 確定,所以只是希望通過代碼(https://github.com/Itseez/opencv/blob/master/modules/features2d/include/opencv2/features2d.hpp
    • BRISK
    • ORB
    • MSER
    • FastFeatureDetector/FAST
    • AgastFeatureDetector/AGAST
    • G FTTDetector
    • SimpleBlobDetector
    • KAZE/AKAZE
  5. 並於contrib代碼(https://github.com/Itseez/opencv_contrib/blob/master/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp
    • FREAK
    • StarDetector
    • BriefDescriptorExtractor
    • LUCID
    • LATCH
    • DAISY
    • MSDDetector
  6. 和從非遊離的contrib代碼(https://github.com/Itseez/opencv_contrib/blob/master/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp
    • SIFT
    • SURF
  7. 仍然不確定其上面可以/應當用於FeatureDetector或DescriptorExtractor

回答

6

也有OpenCV的文檔有OpenCV的功能列表:

我哪知道,如果該功能只在關鍵點檢測或描述可用提取或兩者都是讀取文檔中鏈接的相應文件。它還允許具有的功能的簡要說明(例如,如果它是一個二進制描述符,主要優點等)

其他的解決方案是測試每個特徵:

  • 如果調用detect()爲OK(無例外拋出)==>特徵檢測
  • 如果調用compute()是確定==>特徵提取
  • 如果調用detectAndCompute()是確定==>二者
  • 或直視源碼。

也許更優化的解決方案存在...

無論如何,從我的知識(隨時糾正我,如果我錯了):

  • 乾脆利索:探測器+描述
  • ORB:檢測器+描述符
  • MSER:檢測器
  • FAST:檢測器
  • AGAST:檢測器
  • GFFT:檢測器
  • SimpleBlobDetector:檢測器
  • KAZE:檢測器+描述符
  • AKAZE:檢測器+描述符
  • FREAK:描述符
  • StarDetector:檢測器
  • BriefDescriptorExtractor:描述符
  • LUCID:描述符
  • LATCH:描述符
  • DAISY:描述符
  • MSDDetector:檢測器
  • SIFT:檢測器+描述符
  • SURF:檢測器+描述符

還與OpenCV的3.1,代碼:

cv::Ptr<cv::Feature2D> kaze = cv::KAZE::create(); 
std::vector<cv::KeyPoint> kpts; 
cv::Mat descriptors; 
kaze->detect(matImg, kpts); 
kaze->compute(matImg, kpts, descriptors); 
kaze->detectAndCompute(matImg, cv::noArray(), kpts, descriptors); 

cv::Ptr<cv::Feature2D> daisy = cv::xfeatures2d::DAISY::create(); //Contrib 

要知道使用哪種標準類型:

std::cout << "AKAZE: " << akaze->descriptorType() << " ; CV_8U=" << CV_8U << std::endl; 
    std::cout << "AKAZE: " << akaze->defaultNorm() << " ; NORM_HAMMING=" << cv::NORM_HAMMING << std::endl; 

最後,爲什麼

No more features2d::create?

+0

非常感謝您分享知識! :) 我剛剛意識到這個代碼中有一個'#if CV_MAJOR_VERSION> 2',它使用了新的'detector = cv :: FastFeatureDetector :: create();'而不是舊的'detector = FeatureDetector: :創建(str_detector);'。這更有意義,並與文檔/源代碼相匹配。乾杯 – dtbaker