问题描述
我有这个代码
cvMatchTemplate(image2, templat2, result, CV_TM_CCORR_NORMED);
如果存在匹配项,如何使程序执行以下行:
How do I make the program execute the following lines if there is a match:
double min_val, max_val;
CvPoint min_loc, max_loc;
cvMinMaxLoc(result, &min_val, &max_val, &min_loc, &max_loc);
cvRectangle(image3, max_loc, cvPoint(max_loc.x+templat->width,
max_loc.y+templat->height), cvScalar(0,1,1), 1);
谢谢.
推荐答案
您需要同时执行cvMatchTemplate和cvMinMaxLoc:
You need to execute both cvMatchTemplate and cvMinMaxLoc together:
cvMatchTemplate(image2, templat2, result, CV_TM_CCORR_NORMED);
double min_val, max_val;
CvPoint min_loc, max_loc;
cvMinMaxLoc(result, &min_val, &max_val, &min_loc, &max_loc);
然后,您可以通过检查max_val来确定是否有匹配项.
Then you can determine whether you have a match or not by checking max_val.
如果max_val为1,则在搜索图片中max_loc的位置上逐像素完全匹配. max_val越低,则最佳匹配中的错误就越多.
if max_val is 1, you have an exact match, pixel-for-pixel, at the position max_loc in your search picture. The lower max_val is, the more errors are in the best match.
尝试一些测试用例,以确定您的阈值应该是什么.
Try it out for some test cases to determine what your threshold should be.
请注意,如果您使用CV_TM_SQDIFF_NORMED而不是CV_TM_CCORR_NORMED,则完美匹配对应的是零值而不是1,因此您将必须检查min_val而不是max_val
Be aware that if you use CV_TM_SQDIFF_NORMED instead of CV_TM_CCORR_NORMED, a perfect match corresponds to a value of zero instead of one, so you will have to check for min_val instead of max_val
这篇关于使用CV_TM_CCORR_NORMED的openCV模板匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!