opencv,模板匹配

Posted

技术标签:

【中文标题】opencv,模板匹配【英文标题】:opencv, template match 【发布时间】:2013-02-11 11:07:01 【问题描述】:

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

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

【问题讨论】:

【参考方案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);
        
    


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

【讨论】:

以上是关于opencv,模板匹配的主要内容,如果未能解决你的问题,请参考以下文章

opencv 中自带的模板匹配算法出处

使用Python,OpenCV进行模板匹配单对象多对象及多尺度模板匹配

OpenCV模板匹配 - 如何确定匹配模板的角度

使用OpenCV进行模板匹配(原图-模板图)

opencv 模板匹配,在图像中寻找物体

opencv —— matchTemplate 模板匹配