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

news2024/11/14 17:24:28

一、轮廓近似

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)

运行结果为:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2101717.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java SpringBoot构建助农平台,三步实现高效捐赠,2025届设计新思路!

✍✍计算机毕业编程指导师** ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java…

如何应对 Android 面试官 -> 内存如何进行优化?玩转 LeakCanary

前言 本章主要围绕内存相关的知识点讲解; 内存分配 在内存优化中,我们通常需要借助一些常用的 adb 命令,方便我们快速定位,下面是一些常用的 adb 命令总结 常用 adb 命令 adb shell getprop ro.product.model // 手机型号adb s…

HTTP“请求”和“响应”的报头及正文详解

目录 一、请求 "报头" (header) 二、请求 "正文" (body) 2.1 application/x-www-form-urlencoded 2.2 multipart/form-data 2.3 application/json 三、HTTP 响应状态码 四、响应 "报头" (header) 五、响应 "正文" (body) 5.1…

如何设置Word文档部分内容无法编辑?

工作中,我们可能会在word中制作一些请柬、表格之类的,有些文件内容不想要进行修改,为了防止他人随意修改内容。我们可以设置限制编辑,可以对一部分内容设置限制编辑,具体方法如下: 我们将需要将可以编辑的…

记录 PyQt6 / PySide 6 自定义边框窗口的 Bug 及可能可行的解决方案:窗口抖动和添加 DWM 环绕阴影的大致原理

前言: 本篇文章将要讨论我在前不久发表的关于 PyQt6 / PySide6 自定义边框窗口代码及内容中的问题: (终)PyQt6 / PySide 6 Pywin32 自定义标题栏窗口 完全还原 Windows 原生窗口边框特效_pyside6 win32 无边框窗口-CSDN博客ht…

【C++11(一)之入门基础)】

文章目录 C简介统一的列表初始化{}初始化 std::initializer_liststd::initializer_list是什么类型:std::initializer_list使用场景: 声明autodecltypenullptr STL中一些变化 C简介 在2003年C标准委员会曾经提交了一份技术勘误表(…

报告 | 以消费者为中心,消费品零售行业数字化建设持续深化

​2024年是“消费促进年”,国内消费市场稳步复苏。在消费需求多样化、国家政策的推动下,“数字化转型”仍是消费品零售行业的年度主题词,是品牌方获取核心竞争力的必要途径。消费品零售行业的数字化转型重心有所调整,从线上渠道布…

ARM架构

一、内存分布结构 栈:局部变量 函数参数 函数返回地址 堆:程序员自己管理的内存区域,使用是需要动态申请,使用捷顺后需要释放 bss: 初始化为0和未初始化的全局及静态变量 data:初始化不为0全局及静态变量…

Opencv中的直方图(4)局部直方图均衡技术函数createCLAHE()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 创建一个指向 cv::CLAHE 类的智能指针并初始化它。 函数原型 Ptr<CLAHE> cv::createCLAHE (double clipLimit 40.0,Size tileGridSize…

JavaScript的BOM模型

一、浏览器环境概述(BOM) JavaScript 是浏览器的内置脚本语言&#xff0c;一旦网页内嵌了 JavaScript 脚本&#xff0c;浏览器加载网页&#xff0c;就会去执行脚本&#xff0c;从而达到操作浏览器的目的&#xff0c;实现网页的各种动态效果 二、script 元素工作原理 浏览器加…

网络编程 0903作业

作业 1、将TCP的CS模型再敲一遍 tcpserver.c #include <myhead.h> #define SERPORT 1111 #define SERIP "192.168.58.128" #define BACKLOG 40 int main(int argc, const char *argv[]) {int oldfd socket(AF_INET,SOCK_STREAM,0);//1、产生一个原始套接字…

pikachu文件包含漏洞靶场

File inclusion(local) 创建1.php 步骤一&#xff1a;选择一个球员提交 ../../../../1.php File Inclusion(remote)&#xff08;远程文件包含&#xff09; 步骤一&#xff1a;更改参数 php.ini ⾥有两个重要的参数 allow_url_fopen 、allow_url_include &#xff1b; 步骤二…

玩机进阶教程-----如何通过boot查看当前机型版本号 型号以及启动分区 提升保资料写固件成功率

在玩机过程中我们会遇到一些无法开机进系统的机型。而有需要其中的数据。如果简单的写入固件。可能会由于与当前机型版本不符或者版本差别太大的缘故而导致资料无法保存。如果当前机型有版本仿回滚机制。那么有可能误刷系统也会不开机。那么如何通过简单的操作来查看当前机型的…

GAMES202——作业5 实时光线追踪降噪(联合双边滤波、多帧的投影与积累、À-Trous Wavelet 加速单帧降噪)

任务 1.实现单帧降噪 2.实现多帧投影 3.实现多帧累积 Bonus:使用-Trous Wavelet 加速单帧降噪 实现 单帧降噪 这里实现比较简单&#xff0c;直接根据给出的联合双边滤波核的公式就能实现 Buffer2D<Float3> Denoiser::Filter(const FrameInfo &frameInfo) {int heigh…

科研小白教程|如何远程连接实验室服务器跑代码?

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a; 【计算机系统架构】从0开始构建一台现代计算机|时序逻辑、主存储器|第3章每日一言&#x1f33c;: 总之岁月漫长&#xff0c;然而值得等待。—…

国内可以免费使用的gpt网站【九月持续更新】

GPT Hub 是我最近使用的一款智能文本生成工具平台&#xff0c;它支持多种AI模型&#xff0c;包括最新的GPT-4模型&#xff0c;并且可以在国内网络环境中直接访问。以下是我在使用过程中发现的一些特点&#xff1a; 多功能支持&#xff1a;不仅支持代码生成&#xff0c;还涵盖了…

【主机入侵检测】Wazuh解码器之JSON解码器

前言 Wazuh 是一个开源的安全平台&#xff0c;它使用解码器&#xff08;decoders&#xff09;来从接收到的日志消息中提取信息。解码器将日志信息分割成字段&#xff0c;以便进行分析。Wazuh 解码器使用 XML 语法&#xff0c;允许用户指定日志数据应该如何被解析和规范化。解码…

Java基础(10)- 学生管理系统项目

一、JavaBean编写 public class Student {private int id;private String name;private int age;private String sex;public Student() {}public Student(int id, String name, int age, String sex) {this.id id;this.name name;this.age age;this.sex sex;}public int g…

绝对定位导致内容自动换行问题解决

今天在做一个定位元素的时候遇到一个嵌套定位之后&#xff0c;使用绝对定位的元素的内容自动换行的问题&#xff0c;希望不换行只在一行显示。 可以通过添加 white-space: nowrap; 样式控制不换行 <div class"box"><div class"box1"><div …

深入剖析:中国国际大学生创新大赛中不可忽视的12个扣分点

深入剖析&#xff1a;中国国际大学生创新大赛中不可忽视的12个扣分点 前言1. 项目名称&#xff1a;第一印象的力量2. 项目逻辑&#xff1a;清晰的思路是关键3. 问题分析&#xff1a;深入挖掘痛点4. 需求分析&#xff1a;解决方案的导向5. 科研课题与评审维度的匹配6. 团队介绍&…