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

opencv轮廓近似,模板匹配

在图像处理领域,轮廓近似和模板匹配是两种非常关键的技术,它们广泛应用于计算机视觉、图像分析和图像识别等多个方面。本文将详细介绍如何使用OpenCV库进行轮廓近似和模板匹配,并给出具体的代码示例。

一、轮廓近似(Contour Approximation)

轮廓近似是指将图像中的轮廓逼近成由直线段组成的多边形或其他简单形状,以减少轮廓的复杂度和数据量。OpenCV提供了cv2.approxPolyDP()函数来实现这一功能。

1. 轮廓近似的原理

cv2.approxPolyDP()函数通过计算轮廓上的点到由轮廓逼近得到的多边形边界的最大距离(即epsilon值),来决定逼近的精度。epsilon值越小,逼近结果越接近原始轮廓;epsilon值越大,逼近结果越粗略。

代码示例

import cv2  
import numpy as np  
  
def cv_show(title, img):  
    cv2.imshow(title, img)  
    cv2.waitKey(0)  
    cv2.destroyAllWindows()  
#建立一个函数展示图片
  
# 读取图像  
img = cv2.imread('your_image.jpg')  
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  
  
# 查找轮廓  
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)  
  
# 选择第一个轮廓进行近似  
cnt = contours[0]  
epsilon = 0.01 * cv2.arcLength(cnt, True)  
approx = cv2.approxPolyDP(cnt, epsilon, True)  
  
# 绘制近似后的轮廓  
draw_img = img.copy()  
cv2.drawContours(draw_img, [approx], -1, (0, 0, 255), 2)  
cv_show('Approx Poly', draw_img)

实例

import cv2

phone = cv2.imread('phone.png')
phone_gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)  # 转换为灰度图
ret, phone_thresh = cv2.threshold(phone_gray, 100, 255, cv2.THRESH_BINARY)  # 二催化
image, contours, hierarchy = cv2.findContours(phone_thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)  # 获取轮
epsilon = 0.01 * cv2.arcLength(contours[0], True)
approx = cv2.approxPolyDP(contours[0], epsilon, True)  # 普对轮靡进行近似
phone_new = phone.copy()

image_contours = cv2.drawContours(phone_new, [approx], contourIdx=-1, color=(0, 255, 0), thickness=3)  # 绘制轮碗
cv2.imshow('phone', phone)
cv2.waitKey(0)
cv2.imshow("image contours", image_contours)
cv2.waitKey(0)
cv2.destroyAllWindows()

二、模板匹配(Template Matching)

模板匹配是一种在较大图像中寻找与模板图像相似区域的方法。OpenCV提供了cv2.matchTemplate()函数来实现模板匹配。

1. 模板匹配的原理

模板匹配通过比较模板图像和原图像中同样大小区域的相似性,来找到最匹配的区域。OpenCV提供了多种比较方法,如平方差匹配(TM_SQDIFF)、相关匹配(TM_CCORR)和系数匹配(TM_CCOEFF)等。

代码示例

import cv2  
import numpy as np  
  
# 读取原图像和模板图像  
img = cv2.imread('your_image.jpg', 0)  
template = cv2.imread('your_template.jpg', 0)  
  
# 模板匹配  
w, h = template.shape[::-1]  
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)  
threshold = 0.8  
loc = np.where(res >= threshold)  
  
# 绘制匹配结果  
for pt in zip(*loc[::-1]):  
    cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 255), 2)  
  
cv2.imshow('Detected', img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

实例:

import cv2

kele = cv2.imread('kele.png')
template = cv2.imread("template.png")
cv2.imshow('kele', kele)
cv2.imshow('template', template)
cv2.waitKey(0)

h, w = template.shape[:2]
res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED)

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # 最小值、最大值、最小值位置、最大值位置
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
kele_template = cv2.rectangle(kele, top_left, bottom_right, (0, 255, 0), 2)  # 绘制矩形
cv2.imshow('kele_template', kele_template)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果


http://www.kler.cn/news/292849.html

相关文章:

  • 10款好用的电脑监控软件推荐丨2024年干货整理,赶紧码住!
  • 睿赛德科技携手先楫共创RISC-V生态|RT-Thread EtherCAT主从站方案大放异彩
  • 挑战亿级数据:安企CMS性能优化的探索之路
  • JSON 包裹 PDF 流的编码问题
  • orcle 数据库 day0903
  • 2025年25届必看:如何用Java SpringBoot+Vue搭建大学生成绩量化管理系统?
  • 基于Netty框架的云快充协议+云快充1.5协议+云快充1.6+云快充桩直连+桩直连协议
  • SpringBoot入门
  • 域内安全:委派攻击
  • 13条自动化测试框架设计原则
  • 自主导航的视觉导航机器人:解析ROS、OpenCV、Qt及路径规划算法的创新应用与实践(代码示例)
  • flutter开发多端平台应用的探索 上(基本操作)
  • Vue+Element多套主题切换
  • MLLM(一)| 文/图生视频任务大升级,BigModel 开源了视频模型CogVideoX
  • mysql开启远程访问
  • TCP/IP网络编程:第18章聊天室
  • 面向GPU计算平台的归约算法的性能优化研究
  • Rust 中 `madvise` 和 `posix_fadvise`的区别
  • python文件自动化(4)
  • 了解一下HTTP 与 HTTPS 的区别
  • FP7195:非同步升压恒流LED区动IC
  • C#实战|大乐透选号器[3]:动态生成大乐透蓝球区选择球及实现拖动窗体功能
  • Flask+LayUI开发手记(六):树型表格的增删改查
  • 网络编程 0905作业
  • 在ABAP开发中,BSEG和BKPF的数据如何做关联查询?
  • Unity(2022.3.41LTS) - UI详细介绍-TMP
  • WordPress的安装与简单开发教程
  • springboot 配置ssl支持https
  • 软通动力子公司鸿湖万联重磅发布SwanLinkOS 5,擘画开源鸿蒙AI PC新篇章
  • 七、装饰器模式