您好,欢迎来到年旅网。
搜索
您的当前位置:首页基于模板匹配的目标检测(1)

基于模板匹配的目标检测(1)

来源:年旅网

模板匹配

相信每一个做计算机视觉算法的同学都不陌生这个名词,专业的定义:模板匹配‌是一种在图像处理中常用的技术,用于在一幅较大的图像中寻找与另一幅较小图像(称为模板)最匹配的部分。模板匹配的基本原理是将模板图像在目标图像上滑动,通过比较模板与目标图像的重叠区域,计算它们的相似度,从而确定模板在目标图像中的位置。–引用百度AI智能回答
通俗点的解释就是,预先建立需要检测目标的模板图像(仅包含目标的图像),然后,在待进行目标检测的图像上使用滑动窗口的方式,逐个位置计算对应区域与目标图像的相似度,选择相似度大于一定阈值的位置,即可认为该位置存在目标。

图像相似度

在上述的定义中有个关键的操作,计算图像相似度,一些常用的相似度计算方法如下。

  • 平方差匹配(SSD, Sum of Squared Differences):
    原理:计算模板图像与待匹配图像各个位置像素值的平方差之和,平方差之和越小,表示匹配程度越高

  • 归一化平方差匹配:
    原理:对平方差匹配进行归一化处理,以消除图像亮度和对比度的影响。

  • 相关匹配(CC, Cross-Correlation)
    原理:计算模板图像与待匹配图像各个位置的像素值的乘积之和,乘积之和越大,表示匹配程度越高。

  • 归一化相关匹配:
    原理:对相关匹配进行归一化处理,以消除图像亮度和对比度的影响。

  • 相关系数匹配:
    原理:计算模板图像与待匹配图像各个位置的相对像素值(即像素值减去均值)的乘积之和,并进行归一化处理。这种方法能够更准确地反映图像之间的相似程度。

opencv的模板匹配

matchTemplate函数是OpenCV中用于模板匹配的重要函数。其函数原型如下:

void cv::matchTemplate(
    cv::InputArray image,    // 用于搜索的输入图像
    cv::InputArray templ,    // 用于匹配的模板,和image类型相同
    cv::OutputArray result,  // 匹配结果图像,类型32F
    int method                // 用于比较的方法,OpenCV提供6种
);

matchTemplate函数原型的详细解释:
参数解释

  • image:输入图像,即待搜索的源图像。它必须是8位整数或32位浮点类型。

  • templ:模板图像,即要在源图像中搜索的小图像。它必须与源图像具有相同的数据类型,并且大小不能超过源图像。

  • result:输出图像,用于存储匹配结果。它是一个单通道的32位浮点类型图像,其大小取决于源图像和模板图像的大小。具体来说,如果源图像的宽度和高度分别为W和H,模板图像的宽度和高度分别为w和h,则结果图像的宽度和高度将分别为W-w+1和H-h+1。

  • method:指定匹配方法,OpenCV提供了6种不同的匹配方法,包括平方差匹配、相关匹配和相关系数匹配等。

匹配方法

  • cv::TM_SQDIFF:计算模板图像与源图像每个位置之间的平方差。最佳匹配位置的值最小(接近0表示完美匹配)。

  • cv::TM_SQDIFF_NORMED:归一化的平方差匹配。它将结果归一化到0和1之间,完美匹配时返回0。

  • cv::TM_CCORR:计算模板图像与源图像每个位置之间的相关匹配。最佳匹配位置的值最大。

  • cv::TM_CCORR_NORMED:归一化的相关匹配。它将结果归一化到0和1之间。

  • cv::TM_CCOEFF:计算模板图像与源图像每个位置之间的相关系数匹配。最佳匹配位置的值最大。

  • cv::TM_CCOEFF_NORMED:归一化的相关系数匹配。它将结果归一化到-1和1之间。

使用模板匹配进行目标检测

下面就C++版的opencv演示如何进行目标检测:

#include <iostream>
#include "opencv2/opencv.hpp"

int main()
{
    //读取待匹配图像
    cv::Mat image = cv::imread("./data/lena.jpg", cv::IMREAD_COLOR);
    cv::imshow("待匹配图像", image);
    //读取模板图像
    cv::Mat template_image = cv::imread("./data/eye.jpg", cv::IMREAD_COLOR);
    cv::imshow("模板图像", template_image);
    //定义模板匹配相似度计算结果矩阵
    cv::Mat ncc;
    //模板匹配操作:使用归一化相关系数的相似度计算方法
    cv::matchTemplate(image, template_image, ncc, cv::TM_CCOEFF_NORMED);
    //获取最佳匹配位置
    double max_ncc = 0.0, min_ncc = 0.0;
    cv::Point max_positon, min_position;
    cv::minMaxLoc(ncc, &min_ncc, &max_ncc, &min_position, &max_positon);
    //在匹配图像上显示最佳匹配位置
    cv::rectangle(image, cv::Rect(max_positon.x, max_positon.y, template_image.cols, template_image.rows),
        cv::Scalar(0, 0, 255), 2);
    cv::imshow("匹配结果", image);
    //相似度矩阵
    cv::imshow("相似度矩阵", ncc);
    cv::waitKey();
}

运行结果如下:

从结果可以看到,matchTemplate函数输出的相似度矩阵后,从相似度矩阵中寻找最大相似度对应的位置,可以得到预期的结果。

基于模板匹配的目标检测的讨论

  • 需提前得到目标的图像切片。
  • 单纯基于灰度值进行匹配,抗干扰性能比较差,如旋转、缩放、光照变化等。对此,一些商用的机器视觉算法库做得比较优秀,如Halcon的模板匹配,能够使用多角度、多尺度等场景。因此,在现行的工业自动化领域内,大量使用模板匹配的方式,对物体进行定位。如STM机器对PBC板卡的定位、自动焊接机器人、自动点胶机器人等等。很遗憾的是,商业算法库是闭源的,无法得知其算法细节。
  • 无法适应目标的柔性形变。
  • 在算法开发实际应用中,除灰度级的相似度计算外,还有基于梯度、直方图、结构相似度等。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务