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,模板匹配的主要内容,如果未能解决你的问题,请参考以下文章