opencv 使用常见问题

[问题 1] templatematch 出现size不对的问题

OpenCV Error: Assertion failed (corrsize.height <= img.rows + templ.rows - 1 && corrsize.width <= img.cols + templ.cols - 1) in crossCorr, file /tmp/opencv20160107-54198-1duzac3/opencv-2.4.12/modules/imgproc/src/templmatch.cpp, line 70
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /tmp/opencv20160107-54198-1duzac3/opencv-2.4.12/modules/imgproc/src/templmatch.cpp:70: error: (-215) corrsize.height <= img.rows + templ.rows - 1 && corrsize.width <= img.cols + templ.cols - 1 in function crossCorr

[秘方]

通常是图片读取时出现了问题,比如文件目录不对,文件名写错了等等,文件读取时出现的问题。

[问题 2] Template Match 算法分析

在 opencv 中 TemplateMatch 函数由三种不同的方式构成,具体参见opencv doc

对于这三种方法来说,主要核心思想是 SSD (Sum of Squared Difference, 即差值平方和) ,从公式上来看 SSD 值约小,目标区域与模板越相似。

opencv 使用常见问题
Opencv templatematch 参数分析

SQDIFF 即为 SSD 思想的实现,而 CCORR 则是由 SSD 衍生出来的相关系数的方式来评估,具体参看Relationship Between the Sum of Squared Difference (SSD)
and Cross Correlation for Template Matching

即, SSD 的公式如下,其中 R(x, y) 表示 图像(x, y)处图像与模板的相似度, T(x, y) 表示模板(x, y) 处信息, I(x, y) 表示图片(x, y)处的图片信息:

opencv 使用常见问题
SSD 公式

将 SSD 公式进行展开之后的形式如下:

opencv 使用常见问题
SSD 公式展开形式

对于单张图片来说,模板和图像的信息都是固定值,因此图像信息的平方及模板信息平方均为固定值,这时唯一需要关注的是在不同位置的模板与带偏移位置的图像之间的乘积和值的大小。这时即变成为:

opencv 使用常见问题
CCORR 公式说明

从公式可看出 CCORR 值越大,说明 SSD 值越小,即该位置与模板匹配度越高。