使用模板匹配在图像中寻找物体

模板匹配

模板匹配就是用来在大图中找小图,也就是说在一副图像中寻找另外一张模板图像的位置:

opencv中用 cv.matchTemplate() 实现模板匹配。
模板匹配的原理其实很简单,就是不断地在原图中移动模板图像去比较,有6种不同的比较方法,详情可参考:TemplateMatchModes
1. 平方差匹配CV_TM_SQDIFF:用两者的平方差来匹配,最好的匹配值为0
2. 归一化平方差匹配CV_TM_SQDIFF_NORMED
3. 相关匹配CV_TM_CCORR:用两者的乘积匹配,数值越大表明匹配程度越好
4. 归一化相关匹配CV_TM_CCORR_NORMED
5. 相关系数匹配CV_TM_CCOEFF:用两者的相关系数匹配,1表示完美的匹配,-1表示最差的匹配
6. 归一化相关系数匹配CV_TM_CCOEFF_NORMED

归一化的意思就是将值统一到0~1,这些方法的对比代码可到源码处查看。模板匹配也是应用卷积来实现的:假设原图大小为W×H,模板图大小为w×h,那么生成图大小是(W-w+1)×(H-h+1),生成图中的每个像素值表示原图与模板的匹配程度。

实验:源图像中匹配模板图像

源图像:

模板图像:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt# 1.模板匹配
img = cv.imread('lena.jpg', 0)
template = cv.imread('face.jpg', 0)
h, w = template.shape[:2]  # rows->h, cols->w# 6种匹配方法
methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED', 'cv.TM_CCORR','cv.TM_CCORR_NORMED', 'cv.TM_SQDIFF', 'cv.TM_SQDIFF_NORMED']for meth in methods:img2 = img.copy()# 匹配方法的真值method = eval(meth)res = cv.matchTemplate(img, template, method)min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)# 如果是平方差匹配TM_SQDIFF或归一化平方差匹配TM_SQDIFF_NORMED,取最小值if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:top_left = min_locelse:top_left = max_locbottom_right = (top_left[0] + w, top_left[1] + h)# 画矩形cv.rectangle(img2, top_left, bottom_right, 255, 2)plt.subplot(121), plt.imshow(res, cmap='gray')plt.xticks([]), plt.yticks([])  # 隐藏坐标轴plt.subplot(122), plt.imshow(img2, cmap='gray')plt.xticks([]), plt.yticks([])plt.suptitle(meth)plt.show()

实验结果

匹配多个物体

前面我们是找最大匹配的点,所以只能匹配一次。我们可以设定一个匹配阈值来匹配多次:

实验:匹配图像中的硬币


import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt# 2.匹配多个物体
img_rgb = cv.imread('mario.jpg')
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
template = cv.imread('mario_coin.jpg', 0)
h, w = template.shape[:2]res = cv.matchTemplate(img_gray, template, cv.TM_CCOEFF_NORMED)
threshold = 0.8
# 取匹配程度大于%80的坐标
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):  # *号表示可选参数bottom_right = (pt[0] + w, pt[1] + h)cv.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2)cv.imshow('img_rgb', img_rgb)
cv.waitKey(0)
cv.destroyAllWindows()

代码难点讲解

第3步有几个Python/Numpy的重要知识:

x = np.arange(9.).reshape(3, 3)
print(np.where(x > 5))
# 结果:(array([2, 2, 2]), array([0, 1, 2]))


zip()函数,功能强大到难以解释,举个简单例子就知道了:

x = [1, 2, 3]
y = [4, 5, 6]
print(list(zip(x, y)))  # [(1, 4), (2, 5), (3, 6)]

实验结果

opencv 模板匹配,在图像中寻找物体相关推荐

  1. OpenCV模板匹配识别图片中的数字

    OpenCV模板匹配识别图片中的数字 前言 本博客主要实现利用OpenCV的模板匹配识别图像中的数字,然后把识别出来的数字输出到txt文件中,如果识别失败则输出"读取失败". 操作 ...

  2. 利用OpenCV的函数matchTemplate()实现在图像中寻找、检索、搜索模板图像【图像模板匹配】

    利用OpenCV的函数matchTemplate()实现在图像中寻找.检索.搜索模板图像[图像模板匹配] 在博文 https://www.hhai.cc/thread-220-1-1.html 中我们 ...

  3. OpenCV之imgproc 模块. 图像处理(5)在图像中寻找轮廓 计算物体的凸包 创建包围轮廓的矩形和圆形边界框 为轮廓创建可倾斜的边界框和椭圆 轮廓矩 多边形测试

    在图像中寻找轮廓 目标 在这个教程中你将学到如何: 使用OpenCV函数 findContours 使用OpenCV函数 drawContours 原理 例程 教程的代码在下面给出. 你也可以从 这里 ...

  4. OpenCV—python 模板匹配与图像特征匹配

    文章目录 一.理论介绍与算法 二.算法代码 单目标匹配 多目标匹配 三 多尺度模板匹配 一.理论介绍与算法 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个 ...

  5. OpenCV在图像中寻找轮廓的实例(附完整代码)

    OpenCV在图像中寻找轮廓的实例 OpenCV在图像中寻找轮廓的实例 OpenCV在图像中寻找轮廓的实例 #include "opencv2/imgcodecs.hpp" #in ...

  6. OpenCV在图像中寻找轮廓

    OpenCV在图像中寻找轮廓 在图像中寻找轮廓 目标 代码 结果 在图像中寻找轮廓 目标 在本教程中,您将学习如何: 使用OpenCV函数cv :: findContours 使用OpenCV函数cv ...

  7. opencv 模板匹配(cvMatchTemplate)

    opencv 模板匹配(cvMatchTemplate) 模板匹配是通过在输入图像上滑动模板图像块对实际的图像块和输入图像进行匹配,并且可以利用函数cvMinMaxLoc()找到最佳匹配的位置.例如在 ...

  8. OpenCV模板匹配Template Matching

    OpenCV模板匹配Template Matching 模板匹配Template Matching 目标 理论 什么是模板匹配? OpenCV提供哪些匹配方法? 代码 解释 结果 模板匹配Templa ...

  9. 图像匹配与OpenCV模板匹配

    介绍 (Introduction) As a data scientist at VATBox, I've mainly worked on projects which at their core ...

最新文章

  1. 2D和3D机器视觉检测技术的优势和局限性
  2. Beetle在Tcp通讯中使用Protobuf
  3. lvm扩张与收缩小结
  4. React antd Descriptions span属性无效问题
  5. mysql数据库连接不稳定_连接 MySQL 数据库失败频繁的原因探秘
  6. python常用排序_python中的各种排序
  7. 人工智能搭档智能云,进入《西部世界》不是梦!
  8. hdu 1250 大数相加并用数组储存
  9. Java基础问题总结
  10. CuteFTP下载大文件时报错
  11. 拓展屏软件(给你的电脑加个屏)
  12. 10000marker_嘉美生物-精准的DNA分子量标准 Marker。
  13. DolphinDB智臾科技CEO周小华:《从反向控制的终极目标谈时序数据库的架构设计》
  14. 在centOS中安装MySQL时遇到Configuring incomplete,errors occurred该怎么办?
  15. 灰关联分析与语音/音乐信号识别
  16. 麻雀优化算法 优化XGBoost的参数 python代码
  17. 小白重装系统教程_小白一键重装系统win8教程
  18. python展开_python实现傅里叶级数展开的实现
  19. 操作系统笔记(二):进程和线程
  20. 阿里云服务器入门基础教程汇总(新手)

热门文章

  1. python是什么类型的语言-python到底是什么类型的语言
  2. 0基础学python要多久-零基础学Python的过程有多难?需要多久?
  3. 自学python需要安装什么-自学python用什么系统好
  4. 长话无需短说 讯飞输入法超长语音输入不限时
  5. java try catch陷阱_java异常捕捉陷阱(内存泄漏,finally块,catch块,继承得到的异常)...
  6. Function的常用属性和方法
  7. elementui el-radio-group 分组排序问题
  8. 元素出现在页面时,添加动画,配合animate.css使用
  9. 【MYSQL笔记】MYSQL监视器
  10. IPTV视频码流分析