用于 N 个最佳匹配的 OpenCV 模板匹配不起作用



我已经为此苦苦挣扎了很长时间,似乎在这里找不到问题。让我尝试引导您完成整个过程。

我正在尝试为我的模板匹配获取 10 个最佳边界框。

不打算在这里显示整个图像,但这是我在cv::mat中循环搜索最低值(结果(时cv::mat

int a,b;
for ( a = 0; a < final_image_height; a++){
for ( b = 0; b < final_image_width; b++){
if (result_scores_mat.at<float>(a, b) < 70 ){
printf("%.2f ", result_scores_mat.at<float>(a, b));
}
}
}

这给了我一些cv::mat中"较低值"的值

68.50 68.93 54.50 68.92 64.62 57.12 62.69 65.86 63.52 68.35 68.65 61.93 69.18 67.69 

然后我进入一个循环,我打电话给minMaxLoc()找到minVal (using TM_SQDIFF, so minVal)

for ( i = 0; i < 10; i++){
minMaxLoc(result_scores_mat, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat());
cout<<minVal<<endl;
// for match_method TM_SQDIFF we take lowest values
matchLoc = minLoc;
drawRadius = result_radius_mat.at<float>(matchLoc.x, matchLoc.y); 
// display source image and result matrix , draw rectangle around highest possible matching area
cv::rectangle( img_display_mat, matchLoc, cv::Point( matchLoc.x + 2*drawRadius, matchLoc.y + 2*drawRadius), cv::Scalar::all(255), 2, 8, 0);  
result_scores_mat.at<float>(minLoc.x, minLoc.y)= 255;
}

我在最后一行所做的是替换minLoc处浮点数的值,以便我运行的下一个循环minMaxLoc找不到该点并给我下一个最小值cv::mat

但是,我一直收到这样的输出,cout<<minVal<<endl;

54.5003
54.5003
54.5003
54.5003
54.5003
54.5003
54.5003
54.5003
54.5003
54.5003

它正确地检测到cv::mat中存在的 54.50 ,但我想要循环中的所有最小值。

我做错了什么,或者有什么解决方法吗?非常感谢!

似乎您以错误的方式将最小值替换为 255,这意味着您正确检测了最小值,但您将 255 替换在错误的位置,您应该替换以下行

result_scores_mat.at<float>(minLoc.x, minLoc.y)= 255;

通过这一行:

result_scores_mat.at<float>(minLoc.y, minLoc.x)= 255;

要了解为什么我们互相替换这些行,您可以查看.at方法的源代码。就像下面一样

template<typename _Tp> _Tp& at(int row, int col);
/** @overload
@param row Index along the dimension 0
@param col Index along the dimension 1
*/

最新更新