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

Opencv查找、绘制轮廓、圆形矩形轮廓和近似轮廓

查找、绘制轮廓、圆形矩形轮廓和近似轮廓

目录

  • 查找、绘制轮廓、圆形矩形轮廓和近似轮廓
    • 1 轮廓查找和绘制
      • 1.1 轮廓查找
        • 1.1.1 函数和参数
        • 1.1.2 返回值
      • 1.2 轮廓绘制
        • 1.2.1 函数和参数
      • 1.3 步骤
      • 1.4 实际测试绘制轮廓
    • 2 绘制近似轮廓
      • 2.1 函数和参数
      • 2.2 查找特定轮廓
      • 2.3 近似轮廓测试
    • 3 绘制圆形矩形轮廓
      • 3.1 圆形函数和参数
      • 3.2 矩形函数和参数
      • 3.3 实际测试

1 轮廓查找和绘制


1.1 轮廓查找

1.1.1 函数和参数

cv2.findContours(图片,检索方式,轮廓近似方法)

  • 图片最好为二值图,即非黑即白,非0即255
  • 检索方式
    • cv2.RETR_TREE,只检测外轮廓
    • cv2.RETR_LIST,检测轮廓,不建立等级关系,所有轮廓在同一等级
    • cv2.RETR_CCOMP,检测轮廓,建立两个等级关系,一个对象的外轮廓是第一级组织结构,内部空洞轮廓为第二级组织机构,空洞中的任何对象的轮廓又是第一级组织机构
    • cv2.RETR_TREE,返回所有轮廓,建立一个完整的组织机构轮廓
  • 轮廓近似方法
    • cv2.CHAIN_APPROX_NONE,存储所有轮廓点
    • cv2.CHAIN_APPROX_SIMPLE,压缩模式,只保留该方向的终点坐标
1.1.2 返回值

_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

  • contours,包括查找的所有轮廓的list对象,其中每一个独立的轮廓信息以边界点坐标(x,y)存在numpy数组中
  • hierarchy,轮廓层次结构,[当前轮廓同层下一轮廓,当前轮廓同层上衣轮廓,当前轮廓子轮廓,当前轮廓父轮廓]

1.2 轮廓绘制

1.2.1 函数和参数

con_con = cv2.drawContours(img片,contours=contours,contourIdx=-1,color=(255,0,0),thickness=3)

  • img绘制轮廓的图片
  • contours=contours轮廓,
  • contourIdx=-1轮廓索引值,-1表示全部
  • color=(255,0,0)绘制线条颜色,
  • thickness=3线条大小
    返回值为根据设置绘制轮廓的图像

1.3 步骤

  • 图片
  • 灰度图
  • 二值图
  • 根据二值图查找轮廓返回轮廓
  • 根据返回轮廓在图像上绘制轮廓,返回图像

1.4 实际测试绘制轮廓

原图:在这里插入图片描述

代码展示:

import cv2
con = cv2.imread('con.png')
con_0 = cv2.imread('con.png',0)
r,con_binary = cv2.threshold(con_0,125,255,cv2.THRESH_BINARY)
_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
con_copy = con.copy()
con_con_1 = cv2.drawContours(con_copy,contours=contours,contourIdx=-1,color=(255,0,0),thickness=3)
con_copy = con.copy()
con_con1 = cv2.drawContours(con_copy,contours=contours,contourIdx=1,color=(255,0,0),thickness=3)
cv2.imshow('con',con )
cv2.waitKey(0)
cv2.imshow('con_binary',con_binary)
cv2.waitKey(0)
cv2.imshow('con_con1',con_con1)
cv2.waitKey(0)
cv2.imshow('con_con_1',con_con_1)
cv2.waitKey(0)

运行结果:
在这里插入图片描述

2 绘制近似轮廓


2.1 函数和参数

  • arc_0005=0.005*cv2.arcLength(contours[1],True),计算轮廓长度
    • 0.005表示近似的程度,值越小,近似的点越多,值越大近似的点越少,线条越多少
    • contours[1]为要近似的目标轮廓,True,表示曲线是闭合
    • arc_0005为返回值,为近似后的轮廓周长数值,
  • apporx_0005 = cv2.approxPolyDP(max_area_con,arc_0005,True),返回值为逼近的轮廓,需要加[]使用
  • cv2.drawContours(con_copy,[apporx_0005],contourIdx=-1,color=(0,0,255),thickness=3)
    • con_copy,绘制轮廓的图像,
    • [apporx_0005],返回的轮廓
    • contourIdx=-1,表示索引全部
    • color=(255,0,0)绘制线条颜色
    • thickness=3线条大小

2.2 查找特定轮廓

这里找的是最大的轮廓
原图:
在这里插入图片描述

代码展示:

import cv2
con = cv2.imread('wang.png')
con_0 = cv2.imread('wang.png',0)
r,con_binary = cv2.threshold(con_0,125,255,cv2.THRESH_BINARY)
_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
con_area = [(i,cv2.contourArea(i)) for i in contours]
## 排序
con_area_sorted = sorted(con_area,key=lambda x:x[1],reverse=True)
max_area_con = con_area_sorted[1][0]
arc_0005 = 0.005*cv2.arcLength(max_area_con,True)
apporx_0005 = cv2.approxPolyDP(max_area_con,arc_0005,True)
con_copy = con.copy()
con_0005 = cv2.drawContours(con_copy,[apporx_0005],contourIdx=-1,color=(255,0,0),thickness=3)
cv2.imshow('con',con)
cv2.waitKey(0)
cv2.imshow('con_0005',con_0005)
cv2.waitKey(0)

运行结果:

在这里插入图片描述

2.3 近似轮廓测试

原图:
在这里插入图片描述

代码展示:

import cv2
con = cv2.imread('kl.jpg')
con_0 = cv2.imread('kl.jpg',0)
r,con_binary = cv2.threshold(con_0,125,255,cv2.THRESH_BINARY)
_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
arc_0005= 0.005*cv2.arcLength(contours[1],True)
arc_001 = 0.01*cv2.arcLength(contours[1],True)
arc_005 = 0.05*cv2.arcLength(contours[1],True)
apporx_0005 = cv2.approxPolyDP(contours[1],arc_0005,True)
apporx_001 = cv2.approxPolyDP(contours[1],arc_001,True)
apporx_005 = cv2.approxPolyDP(contours[1],arc_005,True)
con_copy = con.copy()
con_0005 = cv2.drawContours(con_copy,[apporx_0005],contourIdx=-1,color=(0,0,255),thickness=3)
con_copy = con.copy()
con_001 = cv2.drawContours(con_copy,[apporx_001],contourIdx=-1,color=(0,0,255),thickness=3)
con_copy = con.copy()
con_005 = cv2.drawContours(con_copy,[apporx_005],contourIdx=-1,color=(0,0,255),thickness=3)
cv2.imshow('con',con)
cv2.waitKey(0)
cv2.imshow('con_0005 ',con_0005)
cv2.waitKey(0)
# #
cv2.imshow('con_001',con_001)
cv2.waitKey(0)
cv2.imshow('con_005 ',con_005)
cv2.waitKey(0)

运行结果:
在这里插入图片描述

3 绘制圆形矩形轮廓


3.1 圆形函数和参数

  • (x,y),m = cv2.minEnclosingCircle(contours[7])
    • x,y)坐标,m,圆形轮廓半径
    • contours[7],轮廓
  • circle = cv2.circle(con_copy,(int(x),int(y)),int(m),(255,0,0),2)
    • con_copy,绘制图像
    • (int(x),int(y)),int(m),坐标和半径,要求是整数
    • (255,0,0)颜色,2线条大小
    • circle,返回的绘制好的图像

3.2 矩形函数和参数

  • x,y,w,h = cv2.boundingRect(contours[7])
    • x,y,w,h (x,y)起始坐标,矩形轮廓宽高
  • rectangle = cv2.rectangle(con_copy,(x,y),(x+w,y+h),(255,0,0),2)
  • (x,y)起始坐标,(x+w,y+h)矩形结束坐标

3.3 实际测试

原图:
在这里插入图片描述

代码展示:

import cv2
con = cv2.imread('con.png')
con_0 = cv2.imread('con.png',0)
r,con_binary = cv2.threshold(con_0,125,255,cv2.THRESH_BINARY)
_,contours,hier = cv2.findContours(con_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
(x,y),m = cv2.minEnclosingCircle(contours[7])
con_copy = con.copy()
circle = cv2.circle(con_copy,(int(x),int(y)),int(m),(255,0,0),2)
x,y,w,h = cv2.boundingRect(contours[7])
con_copy = con.copy()
rectangle = cv2.rectangle(con_copy,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('circle',circle)
cv2.waitKey(0)
cv2.imshow('rectangle',rectangle)
cv2.waitKey(0)

运行结果:
在这里插入图片描述

相关文章:

Opencv查找、绘制轮廓、圆形矩形轮廓和近似轮廓

查找、绘制轮廓、圆形矩形轮廓和近似轮廓 目录 查找、绘制轮廓、圆形矩形轮廓和近似轮廓1 轮廓查找和绘制1.1 轮廓查找1.1.1 函数和参数1.1.2 返回值 1.2 轮廓绘制1.2.1 函数和参数 1.3 步骤1.4 实际测试绘制轮廓 2 绘制近似轮廓2.1 函数和参数2.2 查找特定轮廓2.3 近似轮廓测试…...

深入解析 Python 2 与 Python 3 的差异与演进

Python 2 和 Python 3 是 Python 编程语言的两个主要版本。Python 3 于 2008 年发布,旨在解决 Python 2 中的一些设计缺陷,并引入了许多新特性。虽然 Python 2 在很长一段时间内仍然被广泛使用,但自 2020 年 1 月 1 日起,Python 2…...

后端:Spring(IOC、AOP)

文章目录 1. Spring2. IOC 控制反转2-1. 通过配置文件定义Bean2-1-1. 通过set方法来注入Bean2-1-2. 通过构造方法来注入Bean2-1-3. 自动装配2-1-4. 集合注入2-1-5. 数据源对象管理(第三方Bean)2-1-6. 在xml配置文件中加载properties文件的数据(context命名空间)2-1-7. 加载容器…...

排序:插入、选择、交换、归并排序

排序 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,…...

认识+安装ElasticSearch

1. 为什么要学习ElasticSearch? 一般的来说,项目中的搜索功能尤其是电商项目,商品的搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的,存在很多问题。 1.1 数据库搜索所存在的问题 1.1.1 查询效率较低 由于数据库模糊查询不走索引&…...

一个模块实现期货分钟 K 线计算、主连行情合成

由于不同期货品种的交易时间存在差异,且不同期货合约的活跃度各不相同,因此基于期货快照行情数据合成分钟K线的计算方法在时间对齐上需要进行不同的处理。 本教程旨在提升 DolphinDB 在具体业务场景中的应用效率,并降低其在实际业务中的开发…...

PyTorch:.max(1)和.max(0)的使用

目录 1).max(1)的使用: 2).max(0)的使用: 1).max(1)的使用: 假设有一个形状为 ( m , n ) 的 Tensor x ,其中m表示行数,n表示列数。 x.max(1) ,相当于x.max(dim1) 。作…...

ASP.NET Core 中使用 Cookie 身份验证

在 ASP.NET Core 中使用 Cookie 身份验证,通常是为了实现用户的登录和授权。以下是配置 Cookie 身份验证的步骤。 1. 安装必要的 NuGet 包 首先,确保项目中包含 Microsoft.AspNetCore.Authentication.Cookies 包。你可以通过 NuGet 包管理器或命令行安…...

Ollama私有化部署大语言模型LLM

目录 一、Ollama介绍 二、安装Ollama 1、标准安装 2、国内加速 三、升级Ollama版本 四、使用Ollama 1、启动ollama服务 systemctl start ollama.service ollama serve 2、使用ollama命令 ollama run 运行模型 ollama ps 查看正在运行的模型 ollama list 查看(本地)…...

安卓app抓包总结(精)

前言 这里简单记录一下相关抓包工具证书的安装 burp证书安装 安装证书到移动设备(安卓7以后必须上传到设备系统根证书上) 导出证书 openssl x509 -inform DER -in cacert.der -out cacert.pem 转换格式 openssl x509 -inform PEM -subject_hash_old -in cacert.pem …...

Three.js 性能优化:打造流畅高效的3D应用

文章目录 前言一、减少几何体复杂度(Reduce Geometry Complexity)二、合并几何体(Merge Geometries)三、使用缓冲区几何体(Use BufferGeometries)四、纹理压缩与管理(Texture Compression and M…...

PHP 在 2025 年的现状与展望

PHP 在 2025 年依然强劲,继续为超过 77% 使用已知服务器端编程语言的网站提供动力。这并非仅仅依靠遗留代码,像 WordPress、Shopify 和 Laravel 这样的主流平台持续推动 PHP 的发展,使其保持着 актуальность 并不断进化。 为什么…...

力扣经典二分题:4. 寻找两个正序数组的中位数

题目链接:4. 寻找两个正序数组的中位数 - 力扣(LeetCode) 一、题目分析 这道题目是让我们在 两个正序的数组中寻找中位数已知两个数组的大小分别是:int m nums1.size(),n nums2.size();中位数性质1:中位数左侧元素 …...

解决WordPress出现Fatal error: Uncaught TypeError: ftp_nlist()致命问题

错误背景 WordPress版本:wordpress-6.6.2-zh_CN WooCommerce版本:woocommerce.9.5.1 WordPress在安装了WooCommerce插件后,安装的过程中没有问题,在安装完成后提示: 此站点遇到了致命错误,请查看您站点管理…...

Excel 技巧07 - 如何计算到两个日期之间的工作日数?(★)如何排除节假日计算两个日期之间的工作日数?

本文讲了如何在Excel中计算两个日期之间的工作日数,以及如何排除节假日计算两个日期之间的工作日数。 1,如何计算到两个日期之间的工作日数? 其实就是利用 NETWORKDAYS.INTL 函数 - weekend: 1 - 星期六,星期日 2,如…...

快速实现一个快递物流管理系统:实时更新与状态追踪

物流管理是电商、仓储和配送等行业的重要组成部分。随着电子商务的快速发展,快递物流的高效管理和实时状态更新变得尤为关键。本文将演示如何使用Node.js、Express、MongoDB等技术快速构建一个简单的快递物流管理系统,该系统支持快递订单的实时更新和追踪…...

kvm 解决 安装windows 虚拟机cpu 核数问题

通过lscpu命令查到我本机的cpu信息如下 CPU(s): 12 —— 系统的总逻辑处理单元数量(包括所有核心和逻辑处理器)。Thread(s) per core: 2 —— 每个物理核心支持 2 个线程(表示启用了超线程技术)。Core(s) per socket: 6 —— 每个…...

Ansys Fluent Aeroacoustics 应用

探索 Ansys Fluent 在气动声学领域的前沿功能,彻底改变各行各业解决降噪和提高音质的方式。 了解气动声学 气动声学是声学的一个分支,它处理湍流流体运动产生的噪声以及这些声音通过流体介质(如空气)的传播。这个领域在工程中至…...

119.使用AI Agent解决问题:Jenkins build Pipeline时,提示npm ERR! errno FETCH_ERROR

目录 1.Jenkins Build时的错误 2.百度文心快码AI智能体帮我解决 提问1:jenkins中如何配置npm的源 提问2:jenkins pipeline 类型为pipeline script from SCM时,如何配置npm源 3.最终解决方法-Jenkinsfile的修改 4.感触 1.Jenkins Build时…...

istio-proxy内存指标

在 Istio 环境中,istio-proxy 是 Envoy 的边车代理容器。通过运行命令 curl localhost:15000/memory,或者curl localhost:15000/stats 可以查询 Envoy 的内存统计信息。以下是典型返回结果的结构和意义: 返回结果单位是bytes,需/…...

华硕笔记本终极控制工具G-Helper:如何用免费轻量软件完全替代臃肿的Armoury Crate?

华硕笔记本终极控制工具G-Helper:如何用免费轻量软件完全替代臃肿的Armoury Crate? 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Stri…...

告别编译报错!手把手教你为最新版Keil MDK安装ARM Compiler 5(保姆级图文)

嵌入式开发者的救星:彻底解决Keil MDK缺失ARM Compiler 5的终极方案 当你满怀信心地打开一个历史遗留的嵌入式项目,准备进行功能迭代时,Keil MDK突然弹出一个冰冷的错误窗口:"Error: Compiler V5.06 update 7 (build 960) no…...

从SPEF到STA:一份寄生参数文件如何影响你的芯片时序签核?

SPEF文件在芯片时序签核中的关键作用与实战解析 芯片设计工程师们常说:"SPEF文件是物理世界与逻辑世界的翻译官。"这句话精准概括了SPEF在芯片设计流程中的核心价值。当设计从逻辑综合进入物理实现阶段,金属连线的电阻电容效应开始显著影响信号…...

Escrcpy终极指南:简单高效的Android图形化投屏完整方案

Escrcpy终极指南:简单高效的Android图形化投屏完整方案 【免费下载链接】escrcpy 📱 Display and control your Android device graphically with scrcpy. 项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy 你是否厌倦了复杂的命令行操…...

K210+STM32F103C8T6低成本送药小车全流程:从硬件选型到代码调试避坑

K210STM32F103C8T6低成本送药小车全流程:从硬件选型到代码调试避坑 当电子竞赛遇上嵌入式开发,一个融合视觉识别与运动控制的送药小车项目,往往成为检验技术实力的试金石。本文将带你从零开始,用K210视觉模块与STM32F103C8T6主控芯…...

百考通:AI让每一份调研与设计都高效落地

在数字化时代,市场调研、产品设计、学术研究等场景中,问卷设计作为核心环节,直接影响着数据收集的质量与工作推进的效率。传统问卷设计往往面临流程繁琐、耗时耗力、问题设计不精准等痛点,而百考通(https://www.baikao…...

别再硬编码了!用Unity动画事件实现音效与攻击判定的动态解耦(附完整C#脚本)

告别硬编码:Unity动画事件驱动的模块化开发实战 在游戏开发中,动画系统与游戏逻辑的耦合常常成为后期维护的噩梦。想象一下这样的场景:每次调整动画帧数都需要同步修改代码中的硬编码数值,或者音效资源路径被直接写在脚本里导致资…...

GO-Surf:基于神经特征网格的快速高保真三维表面重建技术解析

1. 项目概述:从点云到高保真表面的跨越在三维视觉与机器人领域,从一组稀疏的RGB-D图像序列中,快速、高质量地重建出物体的完整表面模型,一直是一个核心且富有挑战性的任务。传统的基于体素或点云的方法,要么在精度上难…...

Kubernetes集群能耗监测:RAPL与Prometheus方案对比

1. 项目概述在Kubernetes集群中实现精确的能耗监测一直是系统优化领域的难点问题。作为一名长期从事分布式系统性能调优的工程师,我最近完成了一项关于RAPL与Prometheus在Kubernetes集群能耗监测中的对比研究。这项研究源于我们在实际工作中遇到的一个具体问题&…...

Day33-1: Serilog(日志中间件)VS OperLogHelper(操作日志帮助类)

一、一句话分清它们的作用 1. Serilog(日志中间件) 作用:记录系统运行日志 → 给程序员看的 控制台打印文件保存报错、异常、请求信息用于排查问题、调试、监控 2. OperLogHelper(操作日志帮助类) 作用&#xff1…...