我正在使用openCV的cvMatchTemplate方法在较大的图像中查找较小的图像。下面的\方法是将现有的图案对象与给定的“当前”图像匹配,找到的图案由当前图像上绘制的矩形标记。当模式可见时,它可靠地找到它,而不是它的绘图某处“ random ”这是有道理的。
我无法计算模板匹配的分数。有一个容易确定吗?我在不同的网站上寻找,但找不到解决方案,也一直在查看cvMinMaxLoc计算的值,但无法找到确定匹配质量的方法。
- (void)detect:(IplImage *)current
{
int patchx = pattern->width;
int patchy = pattern->height;
int iwidth = current->width - patchx + 1;
int iheight = current->height - patchy + 1;
IplImage *result=cvCreateImage( cvSize(iwidth,iheight),IPL_DEPTH_32F, 1);
cvMatchTemplate( current, pattern, result, CV_TM_SQDIFF );
CvPoint minloc, maxloc;
double minval, maxval;
cvMinMaxLoc( result, &minval, &maxval, &minloc, &maxloc, 0 );
/* draw red rectangle */
cvRectangle( current,
cvPoint( minloc.x, minloc.y ),
cvPoint( minloc.x + patchx, minloc.y + patchy ),
cvScalar( 0, 255, 0, 0 ), 1, 0, 0 );
}
答案 0 :(得分:1)
使用CV_TM_CCORR_NORMED
或CV_TM_SQDIFF_NORMED
等标准指标,并将最小值与阈值(0到1.0之间)进行比较。
cvMatchTemplate( current, pattern, result, CV_TM_SQDIFF_NORMED);
if (minval < THRESHOLD) {
/* draw red rectangle */
cvRectangle( current,
cvPoint( minloc.x, minloc.y ),
cvPoint( minloc.x + patchx, minloc.y + patchy ),
cvScalar( 0, 255, 0, 0 ), 1, 0, 0 );
} else {
//not found
}