opencv,模板匹配

时间:2013-02-11 11:07:01

标签: opencv

我正在使用opencv进行某些项目。并有一个应该解决的任务。 任务很简单。我有一张主图片,并且有一个模板,而不是我将主图片与模板进行比较。我使用matchTemplate()函数。我只是好奇一下。 在文档中,我发现以下信息: 为了识别匹配区域,我们必须通过滑动来比较模板图像和源图像。 通过滑动,我们的意思是一次一个像素地移动补丁(从左到右,从上到下)。在每个位置处,计算度量以使其表示该位置处的匹配“好”或“坏”(或者补丁与源图像的特定区域有多相似)。 对于T over I的每个位置,将度量存储在结果矩阵(R)中。 R中的每个位置都包含匹配指标。

因此,例如,您有主图片和模板。而且你知道至少在主图片中有一个模板条目。它工作正常。但是如果您不知道主图片0或10中有多少个模板?有什么方法可以计算吗?应该使用哪种算法?我如何理解结果矩阵中的指标是什么意思? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

matchTemplate()函数创建一个新矩阵,其中每个像素都保存给定模板在该点与图像匹配的值。为了检测与模板匹配的所有区域,您需要检查结果矩阵,并检查每个像素是否超过某个阈值。
如果像素超过阈值,则意味着它是图像中与模板匹配的区域的左上角。一个简单的实现可能如下所示:

double PATT_THRESH = 0.4
IplImage *result = cvCreateImage(cvSize(imageW, imageH), IPL_DEPTH_32F, 1);
vector<CvPoint> foundTemplates;
cvMatchTemplate(image, pattern, result, CV_TM_SQDIFF_NORMED);
for (int i = 0 ; i < result->width ; ++i) {
    for (int j = 0 ; j < result->height ; ++j) {
        if (cvGet2D(result, j, i).val[0] < PATT_THRESH) {
            foundTemplates.push_back(cvPoint(i, j);
        }
    }

}

我不知道您使用的是哪种语言,但很容易翻译成其他语言。希望有所帮助。