我已经为此苦苦挣扎了很长时间,似乎在这里找不到问题。让我尝试引导您完成整个过程。
我正在尝试为我的模板匹配获取 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
*/