首页 > 其他分享 >opencv轮廓近似,模板匹配

opencv轮廓近似,模板匹配

时间:2024-09-04 16:54:06浏览次数:13  
标签:img phone cv2 opencv template 轮廓 模板

在图像处理领域,轮廓近似和模板匹配是两种非常关键的技术,它们广泛应用于计算机视觉、图像分析和图像识别等多个方面。本文将详细介绍如何使用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()

结果

标签:img,phone,cv2,opencv,template,轮廓,模板
From: https://blog.csdn.net/2401_84670644/article/details/141897809

相关文章

  • python-pptx将多个ppt文件按照给定模板ppt格式整合
    frompptximportPresentationfrompptx.enum.shapesimportMSO_SHAPE_TYPEpr=Presentation('周彤.pptx')forslideinpr.slides:forshapeinslide.shapes:ifshape.shape_type==MSO_SHAPE_TYPE.TEXT_BOX:print(shape.text_frame.font.name,end='......
  • 【全网独家】OpenCV: 影像格式(Mat)
    OpenCV:影像格式(Mat)介绍在OpenCV中,Mat是一个非常重要的数据结构,用于表示二维的图像数据。它能够支持多种类型的数据存储,包括灰度图、彩色图以及多通道图像。特点多维矩阵:支持多维度矩阵操作。高效内存管理:使用引用计数来确保内存资源安全且高效地释放。灵活性:......
  • pbootcms模板如何调用当前站点网址和当前页面网址
    在PbootCMS中,可以使用特定的标签来获取当前站点的网址和当前页面的URL。这对于需要使用网站路径前缀或者获取当前页面地址的场景非常有用。1.当前站点网址标签: {pboot:httpurl}功能:自适应获取当前访问的网址。2.当前页面标签: {pboot:pageurl}功能:获取当前访......
  • pbootcms模板内页如何调用相关文章
    在PbootCMS中,可以使用 {pboot:list} 标签来调用相关文章。相关文章通常是根据分类或其他条件筛选出来的文章。下面是一个详细的示例,展示如何在模板内页调用相关文章。示例代码假设你想在一个文章详情页中调用与当前文章相同分类下的其他文章,可以使用以下代码:html {pb......
  • pbootcms模板如何输出当前页面的完整url地址
    在PbootCMS中,如果你需要在模板的内容页中调用当前页面的完整URL,可以结合使用 {pboot:httpurl} 和 {content:link} 来实现。这样可以确保生成的URL是完整的,并且包含了当前页面的路径。示例代码假设你需要在模板的内容页中调用当前页面的完整URL,可以使用以下代码:html......
  • pbootcms模板调用幻灯片轮播图标签
    在PbootCMS中,你可以使用 {pboot:slide} 标签来调用幻灯片轮播图。以下是如何在模板中使用该标签的具体方法:幻灯片轮播图标签示例1.基本用法假设你需要在一个页面上显示某个分组的幻灯片轮播图,可以按照以下方式编写模板代码:html <!--示例:幻灯片轮播图--><divclass......
  • 【OpenCV】手势识别实现电脑音量控制
            从AdvanceComputerVisionwithPython-ComputerVisionZone 这个网站上找到了一些有关人脸识别和手势识别的示例代码与课程,记录一下学习的过程和结果,Python初学,写得比较基础。            代码基本是流程类的代码,核心功能在导入的库中......
  • Wx64ST:一款轻松可修改的C语言Shellcode模板
    关于windows_x64_shellcode_templatewindows_x64_shellcode_template简称为Wx64ST,它是一款功能强大的Shellcode模板,该模板基于C语言编写,其简单、可扩展和易于修改等特性可以帮助广大安全研究人员轻松开发适用于Windowsx64的Shellcode。值得一提的是,该模板代码可以加载Load......
  • BAidu快速收录系统模板在哪里下载?泛码网SEOa3。com
    在当今数字化时代,网站优化成为了企业提升在线可见性和吸引潜在客户的关键策略。百度作为中国最大的搜索引擎,其排名机制对网站流量有着决定性的影响。而百度快收程序模板程序,作为一种网站优化工具,正逐渐受到网站管理员和SEO专家的关注。本文将探讨百度快收程序模板程序的作用、......
  • 图像边缘检测技术详解:利用OpenCV实现Sobel算子
    图像边缘检测技术详解:利用OpenCV实现Sobel算子前言Sobel算子的原理代码演示结果展示结语前言  在数字图像处理的广阔领域中,边缘检测技术扮演着至关重要的角色。无论是在科学研究、工业自动化,还是在日常生活中的智能设备中,我们都需要从图像中提取有用的信息。边缘,作......