目录

图像轮廓

cv2.findContours(img, mode, method)

绘制轮廓

轮廓特征与近似

轮廓特征

轮廓近似

轮廓近似原理

opencv 实现轮廓近似

轮廓外接矩形

轮廓外接圆


图像轮廓

cv2.findContours(img, mode, method)

mode:轮廓检索模式(通常使用第四个模式)

  • RETR_EXTERNAL: 只检索最外面的轮廓;

  • RETR_LIST: 检索所有的轮廓,并将其保存到一条链表当中;

  • RETR_CCOMP: 检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;

  • RETR_TREE: 检索所有的轮廓,并重构嵌套轮廓的整个层次;

method:轮廓逼近方法

  • CHAIN_APPROX_NONE: 以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。

  • CHAIN_APPROX_SIMPLE: 压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。

绘制轮廓

需要注意的是,当我们要进行轮廓检测时,为了更高的准确率,使用黑白二值图像。

轮廓特征与近似

轮廓特征

cnt = contours[0]
# 面积
cv2.contourArea(cnt)
# 周长,True 表示闭合的
cv2.arcLength(cnt, True)

轮廓近似

轮廓近似原理

如上图,设定一个阈值 T,原曲线 AB,曲线 AB 上找一点C距离AB直线最远,距离为d1,如果d1 < T,则曲线AB可以近似为直线 AB,如果d1 > T,则连接直线 AC 与 直线 CB,从曲线AC上找一点 D 距离直线 AC 最远,距离为 d2,如果 d2 < T,则曲线 AC 可以近似为直线 AC,否则继续连线。

整个过程有点类似于“二分法”。只要曲线上最远一点小于阈值,则两点取直线代替曲线。

通过调整阈值,我们就可以做到轮廓近似:(中间和右边为不同阈值下的轮廓近似)

opencv 实现轮廓近似

img = cv2.imread("img1.jpg", cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# binary 为二值图像, contours 为轮廓信息的集合, hierarchy 为轮廓层级信息
binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 获取你想要进行近似操作的轮廓
cnt = contours[0]
# 一般阈值取百分比轮廓周长
epsilon = 0.1 * cv2.arcLength(cnt, True)
# 轮廓近似化
approx = cv2.approxPolyDP(cnt, epsilon, True)
# 需要注意copy,绘制轮廓函数会改变传入原图
draw_img = img.copy()
# 传入绘制图像,轮廓,轮廓索引(-1表示全部轮廓),线条颜色,线条宽度
res = cv2.drawContours(draw_img, approx, -1, (0, 255, 0), 1)cv2.imshow("res", res)
cv2.waitKey(0)
cv2.destroyAllWindows()

原图:

轮廓近似化后:

轮廓外接矩形

# 获取你想要进行近似操作的轮廓
cnt = contours[0]
# 轮廓外接矩形
x, y, w, h = cv2.boundingRect(cnt)
img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

我们也可以算出轮廓面积与边界矩形的比:

area = cv2.contourArea(cnt)
x, y, w, h = cv2.boundingRect(cnt)
rect_area = w * h
extent = float(area) / rect_area
print("轮廓面积与边界矩形比",extent)

轮廓外接圆

# 获取你想要进行近似操作的轮廓
cnt = contours[0]
# 轮廓外接圆
(x, y), radius = cv2.minEnclosingCircle(cnt)
center = (int(x), int(y))  # 圆心
radius = int(radius)       # 半径
img = cv2.circle(img, center, radius, (0, 255, 0), 2)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mtrace定位内存泄漏问题(仅限 GNU glibc 的 Linux)

一、mtrace原理 函数拦截机制&#xff1a;mtrace 利用 glibc 的内部机制&#xff0c;对 malloc() / calloc() / realloc() / free() 等内存函数进行 hook&#xff0c;记录每一次分配和释放行为。日志记录&#xff1a;记录会写入 MALLOC_TRACE 环境变量指定的日志文件中&#xf…

高校合作 | 世冠科技联合普华、北邮项目入选教育部第二批工程案例

近日&#xff0c;教育部学位与研究生教育发展中心正式公布第二批工程案例立项名单。由北京世冠金洋科技发展有限公司牵头&#xff0c;联合普华基础软件、北京邮电大学共同申报的"基于国产软件栈的汽车嵌入式软件开发工程案例"成功入选。该项目由北京邮电大学修佳鹏副…

TOMCAT笔记

一、前置知识&#xff1a;Web 技术演进 C/S vs B/S – C/S&#xff1a;Socket 编程&#xff0c;QQ、迅雷等&#xff0c;通信层 TCP/UDP&#xff0c;协议私有。 – B/S&#xff1a;浏览器 HTTP&#xff0c;文本协议跨网络。 动态网页诞生 早期静态 HTML → 1990 年 HTTP 浏览…

上海一家机器人IPO核心零部件依赖外购, 募投计划频繁修改引疑

作者&#xff1a;Eric来源&#xff1a;IPO魔女8月8日&#xff0c;节卡机器人股份有限公司&#xff08;简称“节卡股份”&#xff09;将接受上交所科创板IPO上会审核。公司保荐机构为国泰海通证券股份有限公司&#xff0c;拟募集资金为6.76亿元。报告期内&#xff0c;节卡股份营…

Linux810 shell 条件判断 文件工具 ifelse

变量 条件判断 -ne 不等 $(id -u) -eq [codesamba ~]$ [ $(id -u) -ne 0 ] && echo "the user is not admin" the user is not admin [codesamba ~]$ [ $(id -u) -eq 0] && echo "yes admin" || echo "no not " -bash: [: 缺少 …

ChatGPT 5的编程能力宣传言过其实

2025年的8月7日&#xff0c;OpenAI 正式向全球揭开了GPT-5的神秘面纱&#xff0c;瞬间在 AI 领域乃至整个科技圈引发了轩然大波。OpenAI对GPT-5的宣传可谓不遗余力&#xff0c;将其描绘成一款具有颠覆性变革的 AI 产品&#xff0c;尤其在编程能力方面&#xff0c;给出了诸多令人…

从MySQL到大数据平台:基于Spark的离线分析实战指南

引言在当今数据驱动的商业环境中&#xff0c;企业业务数据通常存储在MySQL等关系型数据库中&#xff0c;但当数据量增长到千万级甚至更高时&#xff0c;直接在MySQL中进行复杂分析会导致性能瓶颈。本文将详细介绍如何将MySQL业务数据迁移到大数据平台&#xff0c;并通过Spark等…

Mysql笔记-存储过程与存储函数

1. 存储过程(Stored Procedure) 1.1 概述 1.1.1 定义&#xff1a; 存储过程是一组预编译的 SQL 语句和控制流语句&#xff08;如条件判断、循环&#xff09;的集合&#xff0c;​无返回值​&#xff08;但可通过 OUT/INOUT 参数或结果集返回数据&#xff09;。它支持参数传递、…

[论文阅读] 人工智能 + 软件工程 | LLM协作新突破:用多智能体强化学习实现高效协同——解析MAGRPO算法

LLM协作新突破&#xff1a;用多智能体强化学习实现高效协同——解析MAGRPO算法 论文&#xff1a;LLM Collaboration With Multi-Agent Reinforcement LearningarXiv:2508.04652 (cross-list from cs.AI) LLM Collaboration With Multi-Agent Reinforcement Learning Shuo Liu, …

使用OAK相机实现智能物料检测与ABB机械臂抓取

大家好&#xff01;今天我们很高兴能与大家分享来自OAK的国外用户——Vention 的这段精彩视频&#xff0c;展示了他们的AI操作系统在现实中的应用——在演示中&#xff0c;进行实时的自动物料拣选。 OAK相机实时自动AI物料拣选视频中明显可以看到我们的OAK-D Pro PoE 3D边缘AI相…

html5和vue区别

HTML5 是网页开发的核心标准&#xff0c;而 Vue 是构建用户界面的JavaScript框架&#xff0c;两者在功能定位和开发模式上有显著差异&#xff1a; 核心定位 HTML5是 HTML标准 的第五次重大更新&#xff08;2014年发布&#xff09;&#xff0c;主要提供网页结构定义、多媒体嵌入…

【前端八股文面试题】【JavaScript篇3】DOM常⻅的操作有哪些?

文章目录&#x1f9ed; 一、查询/获取元素 (Selecting Elements)✏️ 二、修改元素内容与属性 (Modifying Content & Attributes)&#x1f9ec; 三、创建与插入元素 (Creating & Inserting Elements)&#x1f5d1;️ 四、删除与替换元素 (Removing & Replacing)&am…

内存杀手机器:TensorFlow Lite + Spring Boot移动端模型服务深度优化方案

内存杀手机器&#xff1a;TensorFlow Lite Spring Boot移动端模型服务深度优化方案一、系统架构设计1.1 端云协同架构1.2 组件职责矩阵二、TensorFlow Lite深度优化2.1 模型量化策略2.2 模型裁剪技术2.3 模型分片加载三、Spring Boot内存优化3.1 零拷贝内存管理3.2 堆外内存模…

安全生产基础知识(一)

本文档围绕安全生产基础知识展开&#xff1a; 一、安全用电相关知识 用电安全要点 禁止用湿手触摸灯头、开关、插头插座及用电器具。发现有人触电&#xff0c;切勿用手拉扯&#xff0c;应立即拉开电源开关或用干燥木棍、竹竿挑开电线。电器通电后出现冒烟、烧焦味或着火时&…

Elasticsearch 搜索模板(Search Templates)把“可配置查询”装进 Mustache

1. 什么是 Search Template&#xff1f;能解决什么问题&#xff1f; 搜索模板是存储在 ES 集群里的 Mustache 模板&#xff08;lang: mustache&#xff09;。你把一份标准 _search 请求体写成模板&#xff0c;变量交给 params&#xff0c;每次调用只需传参即可&#xff1a; 搜索…

cocos Uncaught TypeError: Cannot read properties of null (reading ‘SetActive‘)

报错&#xff1a;Uncaught TypeError: Cannot read properties of null (reading SetActive) at b2RigidBody2D.setActive (rigid-body.ts:231:21) at b2RigidBody2D.onEnable (rigid-body.ts:78:14) at RigidBody2D.onEnable (rigid-body-2d.ts:551:24) at OneOffInvoker.invo…

Docker用户组介绍以及管理策略

在Docker环境中&#xff0c;用户组&#xff08;尤其是默认的docker组&#xff09;是管理用户与Docker守护进程交互权限的核心机制。以下从概念介绍和具体管理操作两方面详细说明&#xff1a;一、Docker用户组的核心概念 Docker守护进程&#xff08;dockerd&#xff09;默认通过…

【PyTorch】单目标检测项目部署

【PyTorch】单目标检测项目 两种部署情况&#xff1a;部署在 PyTorch 数据集上&#xff0c;以及部署在本地存储的单个映像上。 目录 定义数据集 搭建模型 部署模型 定义数据集 详细参照前文【PyTorch】单目标检测项目 import torchvision import os import pandas as pd i…

Baumer高防护相机如何通过YoloV8深度学习模型实现火星陨石坑的检测识别(C#代码UI界面版)

《------往期经典推荐------》 AI应用软件开发实战专栏【链接】 序号 项目名称 项目名称 1 1.工业相机 + YOLOv8 实现人物检测识别:(C#代码,UI界面版) 2.工业相机 + YOLOv8 实现PCB的缺陷检测:(C#代码,UI界面版) 2 3.工业相机 + YOLOv8 实现动物分类识别:(C#代码,U…

UniApp Vue3 TypeScript项目中使用xgplayer播放m3u8视频的显示问题

问题背景 在UniApp Vue3 TypeScript项目中使用xgplayer播放m3u8视频时&#xff0c;遇到了一个棘手的问题&#xff1a;视频画面下移&#xff0c;只能听到声音&#xff0c;全屏后才能正常显示。经过排查&#xff0c;发现是<video>元素在DOM渲染时被异常定位&#xff0c;导…