0

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

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

4

1 回答 1

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);
        }
    }

}

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

于 2013-02-11T14:56:02.903 回答