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

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()

输出结果如下:

相关文章:

OpenCV-36 多边形逼近与凸包

目录 一、多边形的逼近 二、凸包 一、多边形的逼近 findContours后的轮廓信息countours可能过于复杂不平滑,可以用approxPolyDP函数对该多边形曲线做适当近似,这就是轮廓的多边形逼近。 apporxPolyDP就是以多边形去逼近轮廓,采用的是Doug…...

transformer中的QKV是如何得到的?

多头自注意力机制:...

console.log导致内存泄露 打包时自动去掉console.log方法

webpack通过工具:terser 使用前需要先安装一下 vue.config.js const { defineConfig } require(vue/cli-servise); module.exports defineConfig({transpileDependencies:true,terser:{terserOptions:{compress:{drop_console:true,drop_debugger:true,},},},}…...

《合成孔径雷达成像算法与实现》FIgure6.20

% rho_r c/(2*Fr)而不是rho_r c/(2*Bw) % Hsrcf exp函数里忘记乘pi了 clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; …...

Spring Boot 笔记 015 创建接口_更新文章分类

1.1.1 实体类id增加NotNull注释,并做分组校验 1.1.1.1 定义分组 1.1.1.2 实体类中指定校验项属于哪个分组 如果说某个校验项没有指定分组,默认属于Default分组 分组之间可以继承, A extends B 那么A中拥有B中所有的校验项package com.geji.pojo;import com.faste…...

【Java基础题型】判断是否是回文数

需求:如果给你一个正数x。 如果x是一个回文整数,打印true,否则,返回false 解释: 回文数是指正序(从左到右)和从倒序(从右到左)都是一样的整数数字。 eg.121是回文数,123不是,2112是回文数&…...

Linux paste命令教程:并行合并文件的利器(附案例详解和注意事项)

Linux paste命令介绍 paste 是一个在 Unix 或 Linux 操作系统中非常有用的命令。它用于通过在标准输出中输出由每个指定文件的行组成的行,以制表符为分隔符,来水平(并行)合并文件。 Linux paste命令适用的Linux版本 paste 命令…...

用163邮箱或者outlook接收国科大邮箱的邮件

使用如图下路径,创建一个新的密码,用于在163大师邮箱或者outlook登录即可 如果不行,则需要手动配置邮箱服务器 参考网址:中国科学院邮件系统帮助中心...

VitePress-15- 配置- description 的作用详解

作用描述 1、descriptioin 是站点的描述&#xff0c; 会被解析为 html 页面的 <meta name"description" content "xxx"> 标签 。2、description 本身就是 <meta> 标签的一种&#xff0c;不会在页面上展示出来&#xff0c; 仅仅是作为页面的一…...

寒假学习记录17:包管理器(包管理工具)

概念 包&#xff08;package&#xff09; 包含元数据的库&#xff0c;这些元数据包括&#xff1a;名称&#xff0c;描述&#xff0c;git主页&#xff0c;许可证协议&#xff0c;作者&#xff0c;依赖..... 库&#xff08;library&#xff0c;简称lib&#xff09; 以一个或多个模…...

【AIGC】Stable Diffusion的常见错误

Stable Diffusion 在使用过程中可能会遇到各种各样的错误。以下是一些常见的错误以及可能的解决方案&#xff1a; 模型加载错误&#xff1a;可能出现模型文件损坏或缺失的情况。解决方案包括重新下载模型文件&#xff0c;确保文件完整并放置在正确的位置。 依赖项错误&#x…...

线段树解决-----P1161 开灯 P1047 [NOIP2005 普及组] 校门外的树 python解法

# [NOIP2005 普及组] 校门外的树 ## 题目描述 某校大门外长度为 l 的马路上有一排树&#xff0c;每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴&#xff0c;马路的一端在数轴 0 的位置&#xff0c;另一端在 l的位置&#xff1b;数轴上的每个整数点&#xf…...

学习总结16

# 【模板】最小生成树 ## 题目描述 如题&#xff0c;给出一个无向图&#xff0c;求出最小生成树&#xff0c;如果该图不连通&#xff0c;则输出 orz。 ## 输入格式 第一行包含两个整数 N,M&#xff0c;表示该图共有 N 个结点和 M 条无向边。 接下来 M 行每行包含三个整数 …...

问题:从完整的问题解决过程来看,( )是首要环节。A.理解问题 B.提出假设C.发现问题 D.检验假设 #学习方法#学习方法

问题&#xff1a;从完整的问题解决过程来看&#xff0c;&#xff08; &#xff09;是首要环节。A&#xff0e;理解问题 B&#xff0e;提出假设C&#xff0e;发现问题 D&#xff0e;检验假设 A.理解问题 B.提出假设 C&#xff0e;发现问题 参考答案如图所示...

服务器感染了.mallox勒索病毒,如何确保数据文件完整恢复?

导言&#xff1a; 在当今数字化的世界中&#xff0c;恶意软件已成为企业和个人数据安全的一大威胁&#xff0c;其中.mallox勒索病毒是最为恶劣的之一。本文91数据恢复将介绍.mallox勒索病毒的特点&#xff0c;以及如何恢复被其加密的数据文件以及预防措施。 如果您正在经历勒索…...

Android java基础_多态性

一.Android Java基础_多态性 向上转换:只能定义被子类覆写的方法&#xff0c;不能调用在子类中定义的方法。 class Father {private int money; public int getMoney() {return money; }public void setMoney(int money) {this.money money; }public void printInfo() {Syst…...

面试前的准备

目录&#xff1a; 面试前的准备Java程序员校招与社招的区别校招与社招的区别&#xff1a;Java程序员投递简的正确方式投递简历时的误区简历投递时间Java程序员如何应对面试邀约Java程序员如何对公司做背调面试前的技术准备 面试前的准备 Java程序员校招与社招的区别 校招和社招…...

前端架构: 本地调试脚手架的2种方式

一、 调试简单的脚手架方式 假定脚手架名称是 xxx 1 &#xff09;方式1 在xxx脚手架项目目录的上一级&#xff0c;执行 npm i -g xxx这时候&#xff0c;就可以本地调试脚手架&#xff0c;在前文中已经说明软链的作用参考&#xff1a;https://blog.csdn.net/Tyro_java/article…...

现阶段适用于 单一架构 还是 分布式架构 ?

单体架构&#xff1a; 优势&#xff1a;简单直接&#xff0c;易于理解和开发&#xff0c;适用于小型应用或刚刚开始的项目。劣势&#xff1a;扩展性受限&#xff0c;只能通过增加服务器的数量来提高处理能力&#xff1b;所有模块都部署在一个单独的服务器或容器中&#xff0c;…...

掌握Go并发:Go语言并发编程深度解析

&#x1f3f7;️个人主页&#xff1a;鼠鼠我捏&#xff0c;要死了捏的主页 &#x1f3f7;️系列专栏&#xff1a;Golang全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...