当前位置: 首页 > news >正文

OpenCV 之 模版匹配多个对象、图片旋转 综合应用

引言

在图像处理和计算机视觉中,模板匹配是一种常用的技术,用于在一幅较大的图像中查找与给定模板图像相似的部分。然而,在实际应用中,目标物体可能会出现在不同的角度,这就需要我们在匹配之前对模板进行旋转处理。本文将介绍如何使用 OpenCV 进行模板匹配,并演示如何处理旋转模板。

模板匹配原理

模板匹配是通过比较模板图像与目标图像中的每一个可能位置来完成的。OpenCV 提供了多种模板匹配的方法,其中 cv2.matchTemplate 是一个常用函数,它可以计算模板与目标图像之间的相似度。常见的匹配方法包括:

  • cv2.TM_SQDIFF:平方差匹配。
  • cv2.TM_CCORR:相关匹配。
  • cv2.TM_CCOEFF:相关系数匹配。
  • cv2.TM_CCOEFF_NORMED:归一化相关系数匹配。

在本文中,我们将使用 cv2.TM_CCOEFF_NORMED 方法进行模板匹配。

实验素材

代码讲解
  1. 读取图像和转换为灰度图

    import cv2
    import numpy as npimg_rgb = cv2.imread('picture_video/image.jpg')
    img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
    template = cv2.imread('picture_video/res.jpg', 0)

    解释:

    • 使用 cv2.imread 读取原始图像和模板图像。
    • 将原始图像转换为灰度图 img_gray,因为模板匹配通常在灰度图上进行。
  2. 旋转模板图像

    # 旋转 90 度,k=-1 表示顺时针旋转 90 度
    rotated_image1 = np.rot90(template, k=-1)
    # 旋转 90 度,k=1 表示逆时针旋转 90 度
    rotated_image2 = np.rot90(template, k=1)

    解释:

    • 使用 np.rot90 函数旋转模板图像。k=-1 表示顺时针旋转 90 度,k=1 表示逆时针旋转 90 度。
  3. 获取模板图像的尺寸

    h, w = template.shape[:2]

    解释:

    • 获取模板图像的高度 h 和宽度 w
  4. 使用模板匹配方法 cv2.matchTemplate 进行模板匹配

    res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
    res1 = cv2.matchTemplate(img_gray, rotated_image1, cv2.TM_CCOEFF_NORMED)
    res2 = cv2.matchTemplate(img_gray, rotated_image2, cv2.TM_CCOEFF_NORMED)

    解释:

    • 使用 cv2.matchTemplate 函数进行模板匹配,cv2.TM_CCOEFF_NORMED 方法用于计算归一化的相关系数。
  5. 设定匹配阈值并获取匹配结果

    threshold = 0.9
    loc = np.where(res >= threshold)
    loc1 = np.where(res1 >= threshold)
    loc2 = np.where(res2 >= threshold)

    解释:

    • 设定匹配阈值 threshold,只有匹配分数大于等于这个阈值的区域才会被认为是匹配成功的位置。
    • 使用 np.where 函数获取所有匹配分数大于等于阈值的点的坐标。
  6. 在原图上绘制匹配区域的矩形框

    for pt in zip(*loc[::-1]):cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 1)for pt in zip(*loc1[::-1]):cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 1)for pt in zip(*loc2[::-1]):cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 1)

    解释:

    • 使用 cv2.rectangle 函数在原图 img_rgb 上绘制矩形框,标出匹配成功的区域。
    • 矩形框的颜色为红色 (0, 0, 255),线宽为 1
  7. 显示结果图像

    cv2.imshow('res.jpg', img_rgb)
    cv2.waitKey(0)

    解释:

    • 使用 cv2.imshow 显示带有匹配区域的图像。
    • 使用 cv2.waitKey(0) 等待用户按键关闭窗口。
  8. 输出结果:

总结

通过上述代码演示,我们展示了如何在 OpenCV 中进行模板匹配,并处理旋转模板。模板匹配是一种基本的图像处理技术,广泛应用于目标检测、图像识别等领域。通过旋转模板,我们可以提高匹配的鲁棒性,即使目标物体在图像中处于不同的角度,也能准确地识别出来。这种方法在实际应用中非常有用,特别是在需要检测旋转目标物体的情况下。

http://www.lryc.cn/news/434050.html

相关文章:

  • ZooKeeper 中的 Curator 框架解析
  • 机械学习—零基础学习日志(Python做数据分析02)
  • BRAM IP Native模式使用
  • react的useRef用什么作用
  • 10.2 TCP IP模型、IP协议、IPv4、子网掩码
  • 工业相机飞拍的原理及工作原理
  • 通过AI来创建一个_____html css网页制作成品 例子演示
  • C ++ 从单链表到创建二叉树到二叉树的遍历(结构体)
  • Python 编程:如何巧妙运用 `abc` 模块解锁面向对象设计的新维度?
  • Jenkins 执行 shell 时报错 Host key verification failed.
  • MyBatis-Plus&Druid数据源
  • MTPA控制分析与推导
  • Spring Boot 的Web项目如何直接显示html
  • 【回收站选址】
  • Springboot整合websocket(附详细案例代码)
  • 微信小程序:navigateTo跳转无效
  • C++ 设计模式——解释器模式
  • 【开源大模型生态6】生态大咖与产品布局
  • 虚拟机苹果系统的QT安装体验
  • 多路转接之poll(接口介绍,struct pollfd介绍,实现原理,实现非阻塞网络通信代码)
  • 两个月冲刺软考——位示图题型的例题讲解与分析;索引文件的详细解读
  • SprinBoot+Vue校园数字化图书馆系统的设计与实现
  • python如何加速计算密集型任务?
  • 握手的方式展现人的性格及行为倾向
  • Java 排序算法详解
  • vue3实现拖拽移动位置,拖拽过程中鼠标松开后元素还吸附在鼠标上并随着鼠标移动
  • 没有屋檐的房子-011
  • Puppeteer-Cluster:并行处理网页操作的新利器
  • 使用Protocol Buffers传输数据
  • chmod修改文件权限