OpenCV-36 多边形逼近与凸包

news2025/1/24 14:52:57

目录

一、多边形的逼近

二、凸包


一、多边形的逼近

findContours后的轮廓信息countours可能过于复杂不平滑,可以用approxPolyDP函数对该多边形曲线做适当近似,这就是轮廓的多边形逼近。

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

DP算法原理比较简单,核心就是不断去找多边形最远的点加入形成新的多边形,直到最短距离小于指定的精度(阈值)

approxPolyDP(curve, epsilon, closed[, approxCurvel])

  • curve 要逼近的轮廓
  • epsilon 即DP算法使用的阈值
  • closed 轮廓是否闭合

阈值越大,逼近效果越粗糙;阈值越小,逼近效果越好。

得到的approx本质是一个数组ndarray类型,因此画轮廓的时候需要加上[]变成列表类型。

示例代码如下:

import cv2
import numpy as np
# 导入图片
hand = cv2.imread("hand.png")
# 变为单通道黑白图片
gray = cv2.cvtColor(hand, cv2.COLOR_BGR2GRAY)
# 二值化操作
ret, new_img = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(new_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 复制一份原图
hand_copy = hand.copy()
# 直接在img_copy上面操作
cv2.drawContours(hand_copy, contours, -1, (0, 0, 255), 2)
# 使用多边形逼近,近似模拟手的轮廓
approx = cv2.approxPolyDP(contours[2], 20, closed=True)
# approx本质上是一个轮廓数据,是一个ndarray类型
print(approx)
print(type(approx))
# 二contours是一个元组/列表类型
# 画出近似逼近的轮廓
cv2.drawContours(hand_copy, [approx], -1, (0, 255, 0), 2)
cv2.imshow("img", np.hstack((hand, hand_copy)))
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

二、凸包

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

convexHull(points[,hull [,clockwise[, returnpoints]]]])

  • points 即轮廓
  • colckwise 顺时针绘制

示例代码如下:

import cv2
hand = cv2.imread("hand.png")
# 二值化操作
gray = cv2.cvtColor(hand, cv2.COLOR_BGR2GRAY)
# 二值化操作
thresh, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
cv2.drawContours(hand, contours, 0, (0, 0, 255), 2)
# 多边形逼近
approx = cv2.approxPolyDP(contours[2], 20, True)
# 画出多边形逼近的轮廓
cv2.drawContours(hand, [approx], 0, (0, 0, 255), 2)
# 计算凸包
hull = cv2.convexHull(contours[2])
# 画出凸包
cv2.drawContours(hand, [hull], 0, (255, 0, 0), 2)
cv2.imshow("hand", hand)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

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

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

相关文章

《Linux 简易速速上手小册》第3章: 文件系统与权限(2024 最新版)

文章目录 3.1 Linux 文件系统结构3.1.1 重点基础知识3.1.2 重点案例:设置一个 Web 服务器3.1.3 拓展案例 1:日志文件分析3.1.3 拓展案例 2:备份用户数据 3.2 理解文件权限3.2.1 重点基础知识3.2.2 重点案例:共享项目文件夹3.2.3 拓…

网络编程项目:电子辞典

项目要求: 登录注册功能,不能重复登录,重复注册。用户信息也存储在数据库中。单词查询功能历史记录功能,存储单词,意思,以及查询时间,存储在数据库基于TCP,支持多客户端连接&#x…

python安装cv2失败

问题:安装cv2包失败 解决方法: pip install opencv-python或在Anaconda中conda install opencv-python

二、DataX安装

DataX安装 一、简介二、系统要求三、部署 一、简介 官方地址:https://github.com/alibaba/DataX/blob/master/userGuid.md 二、系统要求 LinuxJDK(1.8以上,推荐1.8) Centos7.9的java1.8安装命令:yum install java-1.8.0-openjdk.x86_64 Py…

【Java程序设计】【C00254】基于Springboot的java学习平台(有论文)

基于Springboot的java学习平台(有论文)) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的学习平台 本系统分为系统功能模块、管理员功能模块、教师功能模块以及学生功能模块。 系统功能模块:在平台…

【国产MCU】-CH32V307-基本定时器(BCTM)

基本定时器(BCTM) 文章目录 基本定时器(BCTM)1、基本定时器(BCTM)介绍2、基本定时器驱动API介绍3、基本定时器使用实例CH32V307的基本定时器模块包含一个16 位可自动重装的定时器(TIM6和TIM7),用于计数和在更新新事件产生中断或DMA 请求。 本文将详细介绍如何使用CH32…

大话设计模式——1.模板方法模式(Template Method Pattern)

定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 例子:比较重大的考试往往有A、B两套试卷,其中一套出现问题可以立马更换另一套。 定义基…

金融信贷风控系统设计

前言 近一年多以来在金融行业负责风控系统,根据自己工作中的经验,写下这篇文章。既是对自己在风控领域工作的总结,也是给刚入行和准备入行的朋友打个样,希望能有所帮助。 为什么要有风控系统 记得 2016 年信贷行业的发展形势还…

NAS如何成为生产力?使用绿联DX4600 Pro搭建图床并实现创作自由

NAS如何成为生产力?使用绿联DX4600 Pro搭建图床并实现创作自由 哈喽小伙伴们好,我是Stark-C~ 关注我的小伙伴都知道,我之前有分享过我的创作过程与工具,其中介绍了我个人其实一直都是使用Markdown的编辑器来进行图文创作的。 我…

多机多卡运行nccl-tests和channel获取

nccl-tests 环境1. 安装nccl2. 安装openmpi3. 单机测试4. 多机测试mpirun多机多进程多节点运行nccl-testschannel获取 环境 Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-91-generic x86_64)cuda 11.8 cudnn 8nccl 2.15.1NVIDIA GeForce RTX 4090 *2 1. 安装nccl #查看cuda版本 nv…

shiny,一个好用的 Python 库!

更多Python学习内容:ipengtao.com 大家好,今天为大家分享一个好用的 Python 库 - shiny。 Github地址:https://github.com/posit-dev/py-shiny Python Shiny 是一个用于创建交互式 Web 应用程序的开源库,它基于 Flask 和 React 技…

[JavaWeb玩耍日记]Maven的安装与使用

目录 一.作用 二.安装 三.使用 2.对项目使用compile命令进行编译,看看新的文件会在哪里产生? 3.需要认识的命令 4.Maven对项目执行不同命令的生命周期特点? 5.如何导入工程外的Maven? 6.如何直观地查看Maven导入了哪些工程或哪些jar包…

行业科普应用分享 | 用于安全和安保的仪器仪表

【前言】 物联网带来了对安全和安保的新要求。利用物联网,运营商可以从复杂和分布式的装置中获益。此外,自主系统在现代工业的运作中正变得越来越重要。 从制造业到农业,这些远程操作需要仪器提供持续监测,以提供安全和保障。这…

一、Docker部署MySQL

Docker部署MySQL 一、安装Docker二、拉取MySQL镜像1.选择拉取版本2.拉取镜像 三、启动MySQL1.确定好挂载目录2.启动3.查看是否启动4.开启远程访问权限 一、安装Docker 安装教程:https://qingsi.blog.csdn.net/article/details/131270071 二、拉取MySQL镜像 1.选择…

使用 FFmpeg 将视频转换为 GIF 动画的技巧

使用 FFmpeg 将视频转换为 GIF 动画 FFmpeg 可以将视频转换为 GIF 动画,方法如下: 1. 准备工作 确保您已经安装了 FFmpeg。 熟悉 FFmpeg 的命令行使用。 了解 GIF 动画的基本知识。 2. 基本命令 ffmpeg -i input.mp4 output.gif 3. 参数说明 -i in…

如何编译zlib?

学习文章:windows zlib库编译步骤_nmake 编译 zlib-CSDN博客 记录关键步骤: 打开 执行: 先cd到该目录: C:\Users\xxx\Downloads\zlib-1.2.11\contrib\masmx86 (这是我的zlib源码的下载路径) 执行bld_ml32.bat 再…

Xcode配置GLFW GLAD (MAC)

这里的GLFW用的是静态链接 博主反复修改,实在是没能找到为什么用动态会出现线程报错 下载GLAD:版本我一般是选倒数第二新,profile记得选core 点击GENRATE 点glad.zip获得下载 下载GLFW 点击download 最后,将两个文件都放到项目里面去 打开…

Mac如何安装python?

一、问题 Mac如何安装python? 二、解决 1、系统自带python Mac系统均自带Python环境,用户在终端输入“python3”命令就可以运行,如图所示 2、官网下载 Download Python | Python.org (1)在Download下找到macOS &am…

数据库基础学习笔记

一.基础概念 数据库、数据库管理系统、SQL 主流数据库: mysql的安装:略 mysql图形化界面的安装:略 二.数据模型 1). 关系型数据库(RDBMS) 概念:建立在关系模型基础上,由多张相互连接的二维表…

【python】Fraction类详解及生成分数四则运算“试卷”

文章目录 一、前言实验所需的库终端指令Fraction类1. Fraction(numerator, denominator):2. Fraction(numerator)3. Fraction()4. 分数作参数5. 负分数作参数6. 字符串作参数7. 小数作参数8. 科学计数法9. 浮点数作参数10. 浮点数精度问题11. Decimal对象作参数 二、…