OpenCV-36 多边形逼近与凸包

目录

一、多边形的逼近

二、凸包


一、多边形的逼近

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.hqwc.cn/news/466428.html

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

相关文章

MySQL篇----第二十一篇

系列文章目录 文章目录 系列文章目录前言一、什么是乐观锁二、什么是悲观锁三、什么是时间戳四、什么是行级锁前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、…

【记录】电容的作用,调试Arduino及ESP8266

最近调试Arduino结合ESP8266进行WIFI传输和云端控制,准备用Arduino的3.3V输出直接作为ESP8266的电源,不想竟掉坑里了。 Arduino的3.3V输出接上ESP8266后,Arduino的程序就跑飞了。ESP8266刚上电还是相当生猛的,要吃掉一百多毫安的…

C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(2)折线图显示

对上一篇的工作C学习笔记 | 基于Qt框架开发实时成绩显示排序系统1-CSDN博客继续优化,增加一个显示运动员每组成绩的折线图。 1)在Qt Creator的项目文件(.pro文件)中添加对Qt Charts模块的支持: QT charts 2&#xf…

回归预测模型:MATLAB岭回归和Lasso回归

1. 岭回归和Lasso回归的基本原理 1.1 岭回归: 岭回归(Ridge Regression) 是一种用于共线性数据分析的技术。共线性指的是自变量之间存在高度相关关系。岭回归通过在损失函数中添加一个L2正则项( λ ∑ j 1 n β j 2 \lambda \s…

基于JAVA的软件学院思政案例库系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理员2.2 普通教师 三、系统展示四、核心代码4.1 查询思政案例4.2 审核思政案例4.3 查询思政课程4.4 思政案例点赞4.5 新增思政案例评语 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的软件学…

【Linux】基础命令 第二篇

目录 echo 输出重定向:(本质都是写入) 输入重定向cat more 指令 && less指令 head && tail && 管道初步使用 grep:行文本过滤工具(文本按行搜索) date:获取时间 date 命令用于 显示 或 设置系统的…

MATLAB Coder从入门到放弃

一、MATLAB Coder入门 1 MATLAB Coder是什么 从 MATLAB 代码生成 C 和 C 代码 MATLAB Coder™ 可从 MATLAB 代码生成适用于各种硬件平台(从桌面计算机系统到嵌入式硬件)的 C 和 C 代码。它支持大多数 MATLAB 语言和广泛的工具箱。您可以将生成的代码作…

4核8g服务器能支持多少人访问?2024新版测评

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线?通用型-4核8G-180G-2000G,2000GB月流量,系统盘为180GB SSD盘,12M公网带宽,下载速度峰值为1536KB/s,即1.5M/秒,假设网站内页平均大小为60KB…

IM聊天系统为什么需要做消息幂等?如何使用Redis以及Lua脚本做消息幂等【第12期】

0前言 消息收发模型 第一张图是一个时序图,第二张图是一个标清楚步骤的流程图,更加清晰。消息的插入环节主要在2步。save部分。主要也是对这个部分就行消息幂等的操作。 前情提要:使用Redis发布 token 以及lua脚本来共同完成消息的幂等 目…

如何进行前端自动化测试

如何进行前端自动化测试使用Puppeteer进行前端自动化测试 使用Puppeteer进行前端自动化测试步骤使用示例 如何进行前端自动化测试 前端自动化测试是确保前端应用程序在各种情况下都能正常工作的关键。以下是进行前端自动化测试的一般步骤: 选择适合的测试框架 选…

2024.02.12

使用STM32Cubemx创建一个工程并且给出每一步的含 选择芯片创建工程 开启调试功能 配置时钟 配置时间树 工程管理 配置仿真器

STM32 USART串口通信

目录 USART串口 串口发送 串口发送接收 串口收发HEX数据包 串口收发文本数据包 USART串口 串口发送 Serial.c #include "stm32f10x.h" // Device header #include "stdio.h" #include "stdarg.h"/*** brief 初始化串口以…