[OpenCV] apporxPolyDP和convexHull有什么不同?轮廓多边形逼近和凸包的区别

机器视觉学习(十一)—— 最小矩形和圆形区域、近似轮廓、凸包 最小矩形区域与最小圆形区域、显示近似轮廓、显示凸包 阅读详情

apporxPolyDP和convexHull的区别?轮廓多边形逼近和凸包有什么不同?apporxPolyDP和convexHull的效果对比

一、背景

学习CV的过程中看到了这两个函数,简单记录一下

1. apporxPolyDP

轮廓多边形逼近 apporxCurve=cv2.apporxPolyDP(curve,epsilon,closed)

2.convexHull

凸包 hull=cv2.convexHull(points[,clockwise,[,returnPoints]])

二、代码及效果

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('hand.jpg', cv.IMREAD_COLOR)
img2 = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
_ret, img2 = cv.threshold(img2, 20, 255, cv.THRESH_BINARY)
img2, contours, hierarchy = cv.findContours(img2, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)

# apporxCurve
# apporxCurve=cv2.apporxPolyDP(curve,epsilon,closed)
COEFF = 0.01
epl = cv.arcLength(contours[0], True) * COEFF
apporx = cv.approxPolyDP(contours[0], epl, True)
app_img = img.copy()
app_img = cv.drawContours(app_img, [apporx], -1, color=(0, 0, 255), thickness=10)

# hull=cv2.convexHull(points[,clockwise,[,returnPoints]])
hull = cv.convexHull(contours[0])
hull_img = img.copy()
hull_img = cv.drawContours(hull_img, [hull], -1, color=(0, 0, 255), thickness=10)

plt.subplot(221), plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB)), plt.title('Org'), plt.axis('off')
plt.subplot(222), plt.imshow(img2, cmap='gray'), plt.title('binary'), plt.axis('off')
plt.subplot(223), plt.imshow(cv.cvtColor(app_img, cv.COLOR_BGR2RGB)), plt.title('apporx'), plt.axis('off')
plt.subplot(224), plt.imshow(cv.cvtColor(hull_img, cv.COLOR_BGR2RGB)), plt.title('hull'), plt.axis('off')

在这里插入图片描述

简单来说,

  1. apporxPolyDP就是以多边形去逼近轮廓,采用的是Douglas-Peucker算法(方法名中的DP);

  2. 逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一一个多边形的凸包来简化它。凸包跟逼近多边形很像,只不过它是物体最外层的「凸多边形。凸包指的是完全包含原有轮廓,并且仅由轮廓上的点所构成的多边形。凸包的每- -处都是凸的,即在凸包内连接任意两点的直线都在凸包的内
    部。在凸包内,任意连续三个点的内角小于180°。

跑出来看图会有一个直观的理解

OpenCV-36 多边形逼近与凸包 findContours后的轮廓信息countours可能过于复杂不平滑,可以用,这就是轮廓的多边形逼近。apporxPolyDP就是以多边形去逼近轮廓,采用的是Douglas-Peucker算法(方法名中的DP)DP算法原理比较简单,核心就是。 阅读详情

相关推荐

opencv基础52-图像轮廓学习05-凸包获取-cv2.convexHull()

逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一个多边形的凸包来简化它。凸包跟逼近多边形很像,只不过它是物体最外层的“凸”多边形。凸包指的是完全包含原有轮 廓,并且仅由轮廓上的点所构成的多边形。凸包的每一处都是凸的,即在凸包内连接任意两点 的直线都在凸包的内部。在凸包内,任意连续三个点的内角小于 180°。例如,在图 12-25 中,最外层的多边形为机械手的凸包,在机械手边缘与凸包之间的部分被称为凸缺陷(Convexity Defect),凸缺陷能够用来处理手势识别等问题。

小海聊智造 3112

OpenCV Java 实现票据、纸张的四边形边缘检测与提取、摆正

参考链接:http://blog.csdn.net/zxw_xzr/article/details/77358815 实习的公司有对增值税发票进行OCR识别的需求。OCR部分实现起来不难(有现成的SDK可以调用),但是实际情况中,用户提供的照片中的发票往往会有一些偏斜,而公司提供的OCR SDK并不能检测偏斜的字符,因此需要先进行图像预处理,摆正发票(效果类似于Office Lens)。要实现...

weixin_30587927的博客 797

cv2 ConvexHull(凸包)

通过cv2中函数convexHull能很容易的得到一系列点的凸包,比如由点组成的轮廓,通过convexHull函数,我们就能得到轮廓的凸包。 下面是对地图进行凸包检测示例代码: import cv2 import numpy as np import sys # 读取图片 img = cv2.imread('./sample.jpg', 1) # 将图片转换到灰度空间 gr...

cchangcs 9025

approxPolyDP函数

1、approxPolyDP函数 函数的作用: 对图像轮廓点进行多边形拟合 2、函数的调用形式 C++: void approxPolyDP (InputArray curve, OutputArray approxCurve, double epsilon, bool closed) 参数详解; InputArray curve:一般是由图像的轮廓点组成的点集 OutputArray appr...

邹氏情歌cium的博客 2217

荔枝派Nano内核编译

上文编译好uboot之后,想刷内核和根文件系统进去。其实官方的网盘里面,已经有打包好的系统镜像,包含所有的东西,可以直接烧录进flash或者TF卡,但是都是基于winbond芯片的,国产的xt25f128b刷进去妥妥的。所以没办法,只能自己再动手重新编译内核了。(PS:搞的我都想直接买一片w25q128换上了,有点麻烦,希望官方直接涨价或者出两版就行,不然对新手不友好啊)

木子点灯的博客 543

Python爬虫实战:手把手教你用Selenium绕过药监局网站的反爬机制(附完整代码)

本文详细介绍了如何使用Selenium绕过药监局网站的反爬机制,提供了一套完整的Python爬虫实战方案。通过浏览器指纹伪装、动态等待策略、会话维持技巧以及分布式采集设计,帮助开发者高效爬取药监局数据,解决政府类网站常见的反爬挑战。

weixin_42620255的博客 735

approxPolyDP函数的介绍

approxPolyDP函数是opencv中利用来对指定的点集进行逼近,其逼近的精度是可设置的对应的函数为: void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed); 例如:approxPolyDP(contourMat, approxCurve, 10, tru

wangmengmeng99的博客 2万+

天龙八部源码深度解析:从宠物系统到副本机制(C++游戏开发实战)

本文深度解析《天龙八部》源码架构,重点剖析宠物系统状态机实现与副本动态加载机制等核心模块。通过C++代码示例展示宠物AI状态迁移逻辑和副本场景管理技术,为现代游戏开发提供兼容性改造方案与设计启示。适合游戏开发者学习经典MMORPG的工程化实现路径。

weixin_29011239的博客 377

OpenCV学习三十:approxPolyDP 多边拟合函数

approxPolyDP 主要功能是把一个连续光滑曲线折线化,对图像轮廓点进行多边形拟合。原理图:对比之前黑点连线,之后蓝色连线:C++: void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)参数详解;InputArray curve:一般是由图像的轮廓点组成的点集Outp...

Thomas会写字 6万+

使用R包PreMSIm预测微卫星不稳定的标题:基于基因表达量的微卫星不稳定性预测

在本文中,我们将介绍如何使用R语言中的PreMSIm包来根据基因表达量进行微卫星不稳定性的预测。需要注意的是,本文仅介绍了使用PreMSIm包进行微卫星不稳定性预测的基本流程和代码示例。在实际应用中,还需要考虑数据的质量控制、模型优化以及结果的解释和验证等因素,以确保预测结果的准确性和可靠性。预测结果将返回一个包含微卫星不稳定性指数的向量,其中每个元素对应一个样本的预测结果。在有了输入数据后,我们可以使用PreMSIm包中的函数进行微卫星不稳定性的预测。函数生成一个包含所有样本的微卫星不稳定性信息的表格。

2301_79330511的博客 377

11、Windows Autopilot 部署与设备注册全攻略

本文详细介绍了Windows Autopilot的完整部署流程,涵盖注册配置文件设置、注册状态页面(ESP)配置、设备注册方法(包括CSV导入、JSON注入、在线注册等)、自动化脚本实现及故障排除技巧。通过手动与PowerShell自动化两种方式指导用户完成配置,并提供流程图、最佳实践和常见问题解答,帮助IT管理员高效实现设备零接触部署与管理。

ii567的博客 337

opencv 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数

凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数 道格拉斯-普克算法(Douglas–Peucker algorithm),亦称为拉默-道格拉斯-普克算法(Ramer–Douglas–Peucker algorithm),这个算法最初由拉默(Urs Ramer)于1972年提出,1973年道格拉斯(David Douglas)和普克(Thomas Peucker)二人又独立于拉默提出了该算法。我们知道,一条曲线上包含着无数...

youandme520的专栏 2122

如何实现一个用STM32F103C8T6作为主控芯片,加上AD8232、MAX30102 、MPU6050模块的用于运动中监测心率变异性??

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1207

CV | 计算几何之凸包(cv2.convexHull)

概念 通俗的话来解释凸包:给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点。 凸包的计算方法有:卷包裹算法(Gift Wrapping Algorithm),Graham扫描法(Graham Scan Algorithm),快速凸包算法(Quickhull Algorithm)等。 具体的凸包原理等在以下链接:https://www.cnblogs.com...

lovetaozibaby的博客 1万+

一文搞懂多速率信号处理中信号插值的本质:从插 0、插原值到线性插值!

信号插值在数字信号处理中经常被使用,但“插值”背后究竟发生了什么,却常被忽略。插0、插原值、线性插值看似只是不同的实现方式,实则对应着完全不同的频域效应与滤波特性。本文将结合公式与MATLAB仿真,深入剖析插0、插原值与线性插值三种典型策略的本质区别。

m0_66360845的博客 915

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python学opencv|读取图像(六十七)使用cv2.convexHull()函数实现图像轮廓凸包标注

掌握了python+opencv通过使用cv2.convexHull()函数对图像轮廓进行凸包标注的技巧。 ​

专注python+工程实践的热心婶子 1554

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OPENCV中用cv2.convexHull(Facial)函数计算凸包

凸包是指一个包含给定二维点集所有点的最小凸多边形。在二维空间中,可以想象凸包为一条刚好包住所有点的橡皮圈,或者用不严谨的话来说,就是将最外层的点连接起来构成的凸多边形。

2301_77444219的博客 1457

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

2021-07-24

轮廓 轮廓可以简单地解释为连接具有相同颜色或强度的所有连续点(沿边界)的曲线。轮廓是用于形状分析以及对象检测和识别的有用工具。 findContours() findcontour()函数中有三个参数,第一个是源图像,第二个是轮廓检索模式,第三个是轮廓逼近方法。然后输出等高线和层次结构。轮廓是图像中所有轮廓的Python列表。每个单独的轮廓是一个(x,y)坐标的Numpy数组的边界点的对象。 轮廓检索模式: 代码 方法 cv2.RETR_LIST 检测的轮廓不建立等级关系 cv2.RET

qq_41032328的博客 350

Python Opencv实践 - 凸包检测(ConvexHull)

【代码】Python Opencv实践 - 凸包检测(ConvexHull)

vivo01的专栏 2397

cv2.convexHull 求凸包函数使用笔记

cv2.convexHull能很方便的用于求多边形凸包 示例代码: import cv2 points = [[1,2],[10,20],[10,50],[1,30],[1,20]] hull = cv2.convexHull(np.array(points)) print(hull) 参考文献: 1.OpenCV学习(29) 凸包(convexhull) 2.CV | 计算几何之凸包(cv2.convexHull) ...

不解不惑 1826

OpenCV-Python (官方)中文教程(部分一)_Day19

轮廓的其他函数 轮廓的层次结构

weixin_45420601的博客 1060

详解OpenCV的函数convexHull()和函数convexityDefects(),并利用它们)做凸包(凸壳)检测及凸包(凸壳)的缺陷检测

要理解凸包(凸壳)检测,首无要知道什么是凸包(凸壳),凸包(凸壳)是指如果在集合A内连接任意两个点的直线段都在A的内部,则称集合A是凸形的。简单点理解,就是一个多边型,没有凹的地方。凸包(凸壳)能包含点集中所有的点,凸包检测常应用在物体识别、手势识别及边界检测等领域。 OpenCV中提供了函数convexHull()用于对物体轮廓凸包进行检测,对形状的凸包缺陷分析时使用convexityDefe...

昊虹AI笔记 2万+

Scipy 和opencv 计算凸包(convexHull)

凸包:在数学中,在实向量空间V中的一组点X的凸包或凸包络是包含X的最小凸集。来自Wikipedia。通俗的来说就是包围一组散点的最小凸边形。在scipy.spatial 和opencv 分别有计算凸包的函数,scipy中convexHull输入的参数可以是m*2的点坐标。其返回值的属性.verticess是所有凸轮廓点在散点(m*2)中的索引值。注意:属性.verticess绘制出来的轮廓点是按照...

大橙子的博客 1万+

OpenCV(24-3):图像轮廓之三:凸包和凸包缺陷

凸包是计算机几何图形学中的概念,简单来说,给定二维平面点集,凸包就是将最外层的点连接起来构成的凸多边形,它能够包含物体中所有的点。物体的凸包常应用在物体识别,手势识别及边界检测等领域。在OpenCV中检测凸包的API是:函数原型:hull = cv2.convexHull(points, clockwise, returnPoints)参数:返回: 凸包和本体的任何偏差都可以认为是凹凸缺陷。在OpenCV中检测凸包的API是:函数原型:defects = cv2.convexityDefects(co

2401_86889724的博客 632
上一篇: [starts]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports
下一篇: [小技巧] 如何复制知乎电子书中的文字和图片
江南蜡笔小新
博客等级 码龄9年 1738粉丝 206原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值