首页 > 其他分享 >《深度学习》OpenCV轮廓检测 轮廓近似、模板匹配 解析及实现

《深度学习》OpenCV轮廓检测 轮廓近似、模板匹配 解析及实现

时间:2024-09-03 20:56:04浏览次数:11  
标签:kele 匹配 cv2 近似 OpenCV 图像 轮廓 模板

一、轮廓近似

1、什么是轮廓近似

        指对轮廓进行逼近或拟合,得到近似的轮廓。在图像处理中,轮廓表示了图像中物体的边界,因此轮廓近似可以用来描述和识别物体的形状

2、参数解析

1)用法
import cv2
approx =cv2.approxPolyDP(curve,epsilon, closed)

2)参数

        • curve:表示要输入的轮廓

        • epsilon: 表示近似的精度,即两个轮廓之间最大欧氏距离,该参数越小,得到的近似结果越接近实际轮廓,反之得到的近似结果会更加粗糙

         • closed:表示布尔类型的参数,表示是否封闭轮廓,如果是True,表示输入的轮廓是封闭的,近似结果也会是封闭的,否则表示输入的轮廓不是封闭的,近似结果也不会封闭

3)返回值

        approx:表示近似结果,是一个ndarray数组,为一个近似后的轮廓,包含了被近似出来的轮上的点的坐标

4)代码解析及实现
import cv2
img = cv2.imread('phone.png')  # 导入原图
phone_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  # 原图转换为灰度图
ret,phone_thresh = cv2.threshold(phone_gray,100,25,cv2.THRESH_BINARY)  # 二值化,将大于100灰度值的像素更改为0,小于100像素值的更改为25
# 返回值ret为阈值,phone_thresh为二值化后的图像

image, contours, hierarchy = cv2.findContours(phone_thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)  # 将二值化后的图像进行获取轮廓处理
# 轮廓检测方式为cv2.RETR_TREE,返回所有轮廓及完整层次结构,CV2.CHAIN_APPROX_NONE为存储所有的轮廓点

epsilon = 0.001 * cv2.arcLength(contours[0],True)  # 设置近似值,计算轮廓为contours[0]的周长,参数true表示轮廓为封闭的,0.001表示精度,计算的结果越小,近似的精度越高
approx = cv2.approxPolyDP(contours[0],epsilon,True)  # 对轮廓进行近似,轮廓号为contours[0],近似的精度为epsilon,封闭轮廓
phone_new = img.copy()  # 对原图生成一个副本


image_contours = cv2.drawContours(phone_new, [approx],contourIdx=-1,color=(0,255,0),thickness=3)  # 在副本图像上进行绘制轮廓,[approx]表示要回值得轮廓,contourIdx=-1表示绘制所有的轮廓
cv2.imshow('phone',img)   # 展示原图
cv2.waitKey(0)
cv2.imshow('image_contours',image_contours)   # 展示绘制轮廓的近似图像
cv2.waitKey(0)
运行结果为:

前者为原图,后者为在原图副本上进行绘制轮廓

二、模型匹配

1、什么是模型匹配

        模型匹配是一种通过在图像中查找识别特定形状或物体的方法。模型匹配基于图像中的特征点,并尝试找到与预定义的模型或样本最匹配的图像区域。

2、步骤

        1)提取模型的特征

                对于模型或样本图像,使用特征提取算法(如SIFT、SURF或ORB)来检测和描述关键点和特征描述符。

        2)在图像中查找特征点

                对于待匹配的图像,同样使用相同的特征提取算法来检测和描述关键点和特征描述符。

        3)进行特征匹配

                通过计算模型特征点和待匹配图像中特征点之间的距离或相似度,找到最合适的匹配点。

        4)模型匹配

                根据特征匹配的结果,通过应用各种匹配算法(如RANSAC)来估算模型在图像中的位置和姿态。

3、参数及用法

1、用法
cv2.matchTemplate(image, templ, method, result=None, mask=None)

2、参数
        1)image:待搜索对象
        2)templ:模板对象
        3)method:计算匹配程度的方法
                • TM_SQDIFF:平方差匹配法

                        该方法采用平方差来进行匹配,匹配越好,值越小,匹配越差,值越大

                • TM_CCORR:相关匹配法

                       该方法采用乘法操作,数值越大表示匹配程度越好

                • TM_CCOEFF:相关系数匹配法

                        数值越大表示匹配程度越好

                • TM_SQDIFF_NORMED:归一化平方差匹配法

                        匹配越好,值越小,匹配越差,值越大

                • TM_CCORR_NORMED:归一化相关匹配法

                        数值越大表明匹配程度越好

                • TM_CCOEFF_NORMED:归一化相关系数匹配法

                        数值越大表明匹配程度越好

3、代码实现

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)  # 对模版和模型进行匹配,cv2.TM_CCOEFF_NORMED为匹配程度的方法,返回匹配结果的矩阵,其中每个元素表示该位置与模板的匹配程度
# cv2.minMaxLoc可以获取矩阵中的最小值和最大值,以及最小值的索引号和最大值的索引号
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)    # 绘制矩形,图像为kele,左上角坐标为top_left,右下角坐标为bottom_right,绘制矩形的颜色为绿色,线条粗细为2

cv2.imshow('kele_template',kele_template)
cv2.waitKey(0)

运行结果为:

标签:kele,匹配,cv2,近似,OpenCV,图像,轮廓,模板
From: https://blog.csdn.net/qq_64603703/article/details/141869511

相关文章

  • 每日OJ_牛客_最长公共子序列(dp模板)
    目录牛客_最长公共子序列(dp模板)解析代码牛客_最长公共子序列(dp模板)最长公共子序列__牛客网解析代码子序列即两个字符串中公共的字符,但不一定连续。        从题干中可以提取出问题:求字符串s和t的最长公共子序列假设LCS(m,n)为长度为m的字符串s与长度为n的......
  • opencv学习:转换为二值图像,均值滤波、高斯模糊和中值滤波
    "Threshold"在图像处理中是一个非常重要的概念,它涉及到将图像的像素值转换为二值图像(即图像中的像素值只有两种可能:0或1,或者在某些情况下是其他两个指定的值)。通过设置一个阈值(threshold),可以将图像中的像素分为两类:一类是高于阈值的像素,另一类是低于或等于阈值的像素。以......
  • pbootcms模板首页如何调用指定栏目的子栏目
    在PbootCMS中,可以通过 {pboot:nav} 标签来调用指定栏目的子栏目。以下是具体的实现方法和示例代码。示例代码html {pboot:navparent=4num=7}<ahref="[nav:link]">[nav:name]</a>{/pboot:nav}参数说明parent:指定父栏目的ID。示例中的 parent=4 表示调......
  • pbootcms模板标签序数从2开始
    在PbootCMS中,{pboot:nav} 和 {pboot:list} 标签用于处理导航和列表数据。本文将详细介绍这两种标签的使用方法,并结合实际示例进行说明。1.导航标签({pboot:nav})基本用法{pboot:nav} 标签用于遍历导航数据。可以结合条件判断和参数来控制显示的内容。参数说明num:......
  • PbootCMS模板如何调用友情链接
    在PbootCMS中,{pboot:link} 标签用于输出指定分组的友情链接。以下是一个详细的示例,展示了如何使用 {pboot:link} 标签来输出指定分组的友情链接,并控制显示的数量。示例代码假设您需要从指定分组(如分组ID为1)中输出10个友情链接,并将其显示在页面上:html <!DOCTYPE......
  • 在 PbootCMS 模板首页调用指定栏目的名称和链接
    在PbootCMS中,可以在模板首页调用指定栏目的名称和链接。以下是具体的实现方法和示例代码。示例代码html {pboot:sortscode=12}<p><span>[sort:name]</span><ahref="[sort:link]">+更多</a></p>{/pboot:sort}参数说明scode:指定栏目的编号。示例中的 scod......
  • 在 PbootCMS 模板详情页中调用指定栏目的文章
    在PbootCMS中,可以在模板详情页中调用指定栏目的文章。以下是具体的实现方法和示例代码:示例代码html {pboot:listscode=2num=5order=sorting}<li><ahref="[list:link]">标题:[list:titlelencn=20]</a><span>[list:datestyle=Y-m-d]</span>描述:[list:desc......
  • 前端Vue项目iHRM人力资源后台管理从Vue模板到整体开发Nginx部署上线
    前端Vue项目iHRM人力资源后台管理:‌从Vue模板到整体开发Nginx部署上线引言随着企业信息化的不断深入,‌人力资源管理系统的自动化和智能化成为企业提升管理效率的重要手段。‌本文将详细介绍一个基于Vue.js开发的人力资源后台管理系统(‌iHRM)‌的完整开发流程,‌包括从Vue模板的选......
  • 若楠带你初识OpenCV(1)-- 视频、图片基础处理,颜色获取
    文章目录OpenCV一、核心功能二、初识OpenCV1.安装OpenCV2.读取图片3.读取灰度图4.图片保存5.视频文件读取6.区域截取7.提取RGB通道颜色8.合并颜色通道总结OpenCVOpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉和机器学习库,它主要用于实......
  • OpenCV(cv::findContours())
    目录1.函数定义2.示例3.常见应用4.注意事项cv::findContours()是OpenCV中用于检测图像中的轮廓的函数。1.函数定义voidfindContours(InputOutputArrayimage,OutputArrayOfArrayscontours,OutputArrayhierarchy,intmode,intmethod......