模板匹配
模板匹配是在一张图像中需要另一幅模板图像最相似部分的方法。
opencv 库中集成的模板匹配函数 cv::matchTemplate()
可以得到模板匹配的结果。
其原理为模板图片在匹配图像中进行滑动,每次计算模板和掩盖部分图像的相似度,得到带匹配图像的匹配结果,通过筛选出最大值,找出图像中的最大匹配度的位置。
void cv::matchTemplate(InputArray image,InputArray templ, OutputArray result,
int method,InputArray mask = noArray())
python:
cv.matchTemplate(image,templ,method[, result[, mask]])->result
matchTemplate 函数解析-opencv文档
匹配方式:
cv::TM_SQDIFF
为平方差匹配,计算模板和掩盖图像的平方差,匹配最好结果为0,差值越大,匹配度越差。cv::TM_SQDIFF_NORMED
为标准平方差匹配,将匹配结果限制在0~1之间,结果接近0为匹配度高,接近1为匹配度差。公式如下图:
cv::TM_CCORR
为相关匹配,计算模板和掩盖图像的乘法结果,结果越大匹配结果越好。结果越接近0,匹配度越差。cv::TM_CCORR_NORMED
为标准相关匹配,将匹配结果限制在0~1之间,结果接近0为匹配度差,接近1为匹配度好。公式如下图:
cv::TM_CCOEFF
为相关系数匹配,计算模板和掩盖图像的相关性,结果越大匹配结果越好。cv::TM_CCOEFF_NORMED
为标准相关系数匹配,将匹配结果限制在0~1之间,结果接近0为匹配度差,接近1为匹配度好。公式如下图:
一般使用 TM_SQDIFF_NORMED |TM_CCORR_NORMED| TM_CCOEFF_NORMED
这三种标准化之后的方式。
经过模板匹配后的结果使用函数:
void cv::minMaxLoc(cv::InputArray src,double *minVal,
double *maxVal = (double*)0,cv::Point *minLoc = (cv::Point*)0,
cv::Point *maxLoc = (cv::Point*)0,cv::InputArray mask = npArray())
通过确定匹配结果的最大值最小值的位置,选择图像中的最佳匹配位置。
博文参考-opencv 模板匹配
如果图像中需要找多个匹配位置,可以通过设置阈值的方式来进行粗定位查找。
例如:棋盘格角点检测
opencv提供的方法:
cv::findCheseboardCorners() //寻找角点
cv::cornerSubpix() //压像素检测
cv::drawChessboardCorners() // 绘制角点
根据模板匹配的方式寻找角点:
void BuildChessBoardCornerTemplate(); //建立棋盘格角点模板
bool GetChessBoardCorners(); // 匹配得到棋盘格角点
注: 由于当匹配图像较大时,模板匹配所需时间长,所以该方法当角点较少时可以适用,只是提供模板匹配的思路。