2013-07-31 27 views
4

我使用OpenCV模板匹配在另一圖像中查找圖像。迭代通過cv ::包含在cv中的點:: Mat

具體matchTemplate()它返回一個cv::Mat包含匹配的相似度圖。

除了使用minMaxLoc()之外,還有什麼辦法可以通過cv::Mat中包含的cv::Point進行排序嗎?

minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc); 

我曾嘗試:

cv::Mat_<uchar>::iterator it = result.begin<uchar>(); 
    cv::Mat_<uchar>::iterator end = result.end<uchar>(); 
    for (; it != end; ++it) 
    { 
     cv::Point test(it.pos()); 
    } 

了有限的成功。

+0

你試圖完成的結果是什麼?點應該如何排序? – Aurelius

+0

我希望能夠將這些點與基線進行比較,以獲得模板匹配的置信因子。我試圖通過從最佳比賽到最差比賽的積分進行迭代。 – RubenSandwich

回答

3

如果我理解正確,您希望按其匹配分數排序像素,然後按排序順序獲取與這些像素對應的點。您可以通過將result重塑爲單行,然後調用cv::sortIdx()以排序順序獲取像素的索引來實現此目的。然後,您可以使用索引作爲result開頭的偏移量來獲取該特定像素的位置。

更新:我注意到你的代碼中有一個可能的問題。看起來你假設result包含uchar數據。 cv::matchTemplate()要求result包含float數據。

cv::Mat_<int> indices; 
cv::sortIdx(result.reshape(0,1), indices, CV_SORT_DESCENDING + CV_SORT_EVERY_ROW); 

cv::Mat_<float>::const_iterator begin = result.begin<float>(); 
cv::Mat_<int>::const_iterator it = indices.begin(); 
cv::Mat_<int>::const_iterator end = indices.end(); 
for (; it != end; ++it) 
{ 
    cv::Point pt = (begin + *it).pos(); 
    // Do something with pt... 
} 
+0

是的,這是我正在尋找的。不幸的是,與MinMaxLoc()相比,您的解決方案給我的值有所差異。 MinMaxLoc()的最大值和你手卷最大值的值是不同的。即'Console Output:MinMax:{52,40} handrolled:{90,229}' – RubenSandwich

+0

@RubenSandwich查看更新的答案。 'result'需要用'float'來訪問,而不是'uchar'。此外,排序順序將取決於您的匹配方法。有些方法會使得分數越高,其他方法的分數越低。 – Aurelius

+0

用float代替uchar的確有竅門。謝謝,我剛剛開始熟悉OpenCV,我對它周圍的社區有多麼棒。 – RubenSandwich