图像处理之模板匹配(C++)

ops/2024/9/23 6:22:48/

图像处理之模板匹配(C++)


文章目录

  • 图像处理之模板匹配(C++)
  • 前言
  • 一、基于灰度的模板匹配
    • 1.原理
    • 2.代码实现
    • 3.结果展示
  • 总结


前言

模板匹配的算法包括基于灰度的匹配、基于特征的匹配、基于组件的匹配、基于相关性的匹配以及局部变形匹配。本文对常见的模板匹配方法进行C++实现和应用。

常见模板匹配种类和应用场景:

  1. 基于灰度的匹配一般应用在没有缩放和旋转,颜色变化不大的场合。
  2. 基于特征的匹配一般应用在具有缩放和旋转,颜色变化较大的场合。
  3. 在模板各个组件有相对位移的情况下,使用基于组件的匹配算法。
  4. 在图像模糊,目标定位不依赖于边缘的情况下一般使用基于相关性的匹配。
  5. 目标有局部变形的情况使用局部变形匹配算法。

一、基于灰度的模板匹配

1.原理

基于灰度的模板匹配原理是在给定图像中寻找与预先定义的模板图像最相似的部分。该方法的基本思想是通过模板图像对给定图像(源图像)进行遍历计算两个图像之间的相似度。
相似度计算公式:
1.平方差匹配(匹配度越高,值越接近于0)
方差匹配方法
2.标准平方差匹配(匹配度越高,值越接近于0)
标准平方差匹配
3.相关匹配(匹配度越高,值越接近于1)
相关匹配
4.标准相关匹配(匹配度越高,值越接近于1)
标准相关匹配
5.相关系数匹配(匹配度越高,值越接近于1)
相关系数匹配
6.标准相关系数匹配(匹配度越高,值越接近于1)
标准相关系数匹配
参数解释:
T‘表示模板图像,I表示源图像;
x‘,y’对应模板矩阵对应的元素坐标;
x,y对应模板遍历源图像时左上角元素在源图像上的坐标;
T’(x’,y’)表示模板在(x’,y’)位置对应的灰度值;
I’ (x’+x,y’+y)表示源图像在(x’+x,y’+y)位置对应的灰度值;
备注:上述的0和1不是实际值,而是对实际值进行归一化后的结果。
备注:图片来自opencv.org截图

2.代码实现

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>using namespace std;
using namespace cv;/*
* @param cv::Mat src    源图像,CV_8U或CV_32F
* @param cv::Mat temp   模板图像,CV_8U或CV_32F,src数据类型一致
* @param cv::Mat result 结果图
* @apram int method     相似度计算准则
* (cv::TM_SQDIFF、 cv::TM_SQDIFF_NORMED指方差匹配法、归一化方差匹配法)
* (cv::TM_CCORR、cv::TM_CCORR_NORMED、cv::TM_CCOEFF、cv::TM_CCOEFF_NORMED指相关、标准相关、相关系数、标准相关系数匹配)
* @brief 基于OpenCV实现的灰度模板匹配
*/
void MatchFunction(const cv::Mat& src,const cv::Mat& templ,cv::Mat& result,int match_method,cv::Point& matchLoc)
{// 计算结果图的尺寸int result_cols = src.cols - templ.cols + 1;int result_rows = src.rows - templ.rows + 1;result.create(result_rows, result_cols, CV_32FC1);//执行模板匹配matchTemplate(src, templ, result, match_method);//归一化normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());//定位模板匹配最相似的位置double minVal; double maxVal; Point minLoc; Point maxLoc;minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());if (match_method == cv::TM_SQDIFF || match_method == cv::TM_SQDIFF_NORMED){matchLoc = minLoc;}else{matchLoc = maxLoc;}rectangle(result, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar::all(0), 2, 8, 0);
}int main()
{/// 以灰度图的形式加载源图像和模板图像cv::Mat img = cv::imread("F://work_study//algorithm_demo//baby.jpg", cv::IMREAD_GRAYSCALE);cv::Mat templ = cv::imread("F://work_study//algorithm_demo//template.jpg", cv::IMREAD_GRAYSCALE);if (img.empty() || templ.empty()){cout << "Can't read one of the images" << endl;return -1;}cv::Mat result;Point matchLoc;MatchFunction(img,templ, result, 0, matchLoc);cv::rectangle(img, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar::all(0), 2, 8, 0);cv::imshow("result", result);cv::imshow("src_result", img);waitKey(0);return 0;
}

3.结果展示

模板图片
模板图片
结果图
结果图


总结

`本文实现了基于Opencv的灰度模板匹配技术,后续扩展多目标多角度、基于(边缘)特征、局部变形等的模板匹配技术,以提高模板在不同光照、不同角度下的鲁棒性。
因为笔者水平有限,有错误欢迎指出,代码本人均在本地运行实验正确,大家放心使用。


http://www.ppmy.cn/ops/12724.html

相关文章

安卓手机APP开发__媒体开发部分__播放器的接口

安卓手机APP开发__媒体开发部分__播放器的接口 目录 概述 组件之间的共同的接口 媒体3的播放的架构 播放器的状态 对改变的监听 当前的播放 定制的播放器实现 概述 一个播放器是你的APP中完成媒体项的播放的组件. 媒体3的播放器接口提供了一个关于播放器处理的功能的总…

vue 实现懒加载

目录 什么是懒加载&#xff1f; 组件级懒加载 方法一&#xff1a;使用Webpack的代码分割能力 方法二&#xff1a;使用Vue异步组件 Vue 2 vue 3 图片懒加载 原理 方法一&#xff1a;lazyload 插件 方法二 &#xff1a;IntersectionObserve()API&#xff1a;Intersectio…

Redisson - 看门狗机制(Watch Dog)禁用方案

问题描述 Redis - Redisson tryLock 函数参数分析-CSDN博客 我们在这篇文章有提到过看门狗机制&#xff0c;其实有时候我们不想要看门狗机制的时候&#xff0c;如何禁用呢&#xff1f;&#xff01;因为有时候不想续期&#xff0c;需要实时性比较高的业务&#xff0c;但是看门…

前端 -- Flex布局

Flex布局&#xff08;Flexible Box Layout&#xff09;是一种CSS布局方式&#xff0c;旨在提供一种更有效的方式来布局、对齐和分配容器内项目的空间&#xff0c;即使它们的大小未知或是动态变化的。Flex布局能够让容器的子元素能够灵活地增长和缩小以最佳地填充可用空间。 Fl…

oracle操作系统OS认证和密码文件认证

1 说明 1.1 常见认证方式 Oracle登录认证方式主要涉及到如何验证用户身份以访问数据库。Oracle数据库提供了多种认证机制来确保数据的安全性和访问控制&#xff0c;每种方式都有其特定的使用场景和安全性考虑。以下是Oracle中常见的登录认证方式&#xff1a; 1、基于操作系统…

数据分析-pandas1

数据分析-pandas Pandas 是 Wes McKinney 在2008年开发的一个强大的分析结构化数据的工具集。Pandas 以 NumPy 为基础&#xff08;实现数据存储和运算&#xff09;&#xff0c;提供了专门用于数据分析的类型、方法和函数&#xff0c;对数据分析和数据挖掘提供了很好的支持&…

3.SpringCloud版本

1.SpringCloud与SpringBoot之间版本对应 2.服务拆分的注意事项 1.不同微服务&#xff0c;不要重复开发相同业务。 2.微服务的数据独立&#xff0c;每个微服务都有自己独立的数据库&#xff0c;不要访问其他微服务的数据库。 3.微服务可以将自己的的业务暴露为接口&#xff…

考研党打印资料怎么使用云打印服务?

对于准备考研的同学们来说&#xff0c;在备考的时候需要准备许多资料&#xff0c;这些资料的打印费用成为了考研党的巨额支出。那么在生活费有限的情况下&#xff0c;考研党打印资料最好是选择云打印服务&#xff0c;因为易绘创云打印服务低至5分钱/页还包邮。那么考研党打印资…