2013-02-11 148 views
0

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

因此,例如,您有主图片和模板。你知道,至少在主图中有一个模板条目。它工作正常。但是,如果您不知道主图片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); 
     } 
    } 

} 

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