我在使用OpenCV中的SIFT描述符實現時有點困惑。使用SIFT描述符的OpenCV(C++)增加了檢測到的功能數量?
我想測試各種特徵檢測器+描述符的計算方法,所以我用的cv::FeatureDetector
和cv::DescriptorExtractor
接口,這讓我簡單地不同的檢測方法和描述符之間改變的組合。
當調用cv::DescriptorExtractor::compute(...)
(變體的單個圖像),該文件說,有可能給該算法下降如果無法計算其描述關鍵點的數量,我瞭解爲什麼這樣做。
但是,發生在我身上的是描述符計算後的關鍵點實際數量增加了。顯然是這樣的,我並沒有試圖阻止它的發生,我只是希望能夠解釋爲什麼(只是一種直觀的描述會很酷,儘管我更讚賞那些)。
我在實際的OpenCV上沒有任何代碼(只是設置了一些本地的非OpenCV標誌)的包裝層上有層,所以這裏是OpenCV代碼在底部被調用:
cv::Ptr<cv::FeatureDetector> dect = cv::FeatureDetector::create("MSER");
cv::Mat input = cv::imread("someImg.ppm", 0);
std::vector<cv::KeyPoint> keypoints;
dect->detect(input, keypoints);
cv::Ptr<cv::DescriptorExtractor>deEx=cv::DescriptorCalculator::create("SIFT");
std::cout << "before computing, feats size " << keypoints.size() << std::endl;
// code to print out 10 features
cv::Mat desc;
deEx->compute(input, keypoints, desc);
std::cout << "after computing, feats size " << keypoints.size() << std::endl;
// code to print out 10 features
我之前打印出來的前10個關鍵點和描述符的計算後,所以這裏有一些具體的數字爲例:
before computing, feats size 379
feat[0]: 10.7584 39.9262 176.526 0 12.5396
feat[1]: 48.2209 207.904 275.091 0 11.1319
feat[2]: 160.894 313.781 170.278 0 9.63786
feat[3]: 166.061 239.115 158.33 0 19.5027
feat[4]: 150.043 233.088 171.887 0 11.9569
feat[5]: 262.323 322.173 188.103 0 8.65429
feat[6]: 189.501 183.462 177.396 0 12.3069
feat[7]: 218.135 253.027 171.763 0 123.069
feat[8]: 234.508 353.236 173.281 0 11.8375
feat[9]: 234.404 394.079 176.23 0 8.99652
after computing, feats size 463
feat[0]: 10.7584 39.9262 13.1313 0 12.5396
feat[1]: 48.2209 207.904 69.0472 0 11.1319
feat[2]: 48.2209 207.904 107.438 0 11.1319
feat[3]: 160.894 313.781 9.57937 0 9.63786
feat[4]: 166.061 239.115 166.144 0 19.5027
feat[5]: 150.043 233.088 78.8696 0 11.9569
feat[6]: 262.323 322.173 167.259 0 8.65429
feat[7]: 189.501 183.462 -1.49394 0 12.3069
feat[8]: 218.135 253.027 -117.067 3 123.069
feat[9]: 218.135 253.027 7.44055 3 123.069
我從這個例子可以看出,原始的和feat[7]
已經跨越了每兩個新的關鍵點,但我看不出有任何合乎邏輯的解釋爲compute
方法,這樣做:(
我這裏給出的是使用MSER檢測關鍵點的打印輸出,然後嘗試計算SIFT描述,但同樣增加大小也與STAR,SURF和SIFT發生(即DoG)關鍵點檢測。我沒有嘗試將描述符更改爲其他內容,但如果有人認爲它與問題相關,我會嘗試並在我的問題中對其進行編輯。
你可以添加你使用的部分代碼嗎?瞭解參數將很有用。 – Alex 2012-03-21 11:32:29
呃......我實際上是在圍繞OpenCV代碼的封裝進行封裝,但是我會嘗試挖掘實際的5行代碼,它們將完成所有工作並編輯它。 – penelope 2012-03-21 14:45:34