OpenCV 对轮廓进行多边形逼近(Polygon Approximation)
在 OpenCV 中,cv::approxPolyDP 是一个函数,用于对轮廓进行多边形逼近(Polygon Approximation)。它可以将复杂的轮廓逼近为简化的多边形,从而减少轮廓的数据点,使轮廓更加紧凑。
函数原型如下:
cv::approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed);
参数说明:
curve: 输入的轮廓点,可以是一个std::vector<cv::Point>或cv::Mat类型的数据。approxCurve: 输出的多边形逼近点,返回一个std::vector<cv::Point>或cv::Mat类型的数据,代表多边形逼近的点。epsilon: 控制逼近精度的参数。较小的值会产生更精细的逼近,较大的值会产生更简化的逼近。closed: 一个布尔值,用于指定多边形是否闭合。如果设置为true,则多边形是闭合的,如果设置为false,则多边形是非闭合的。
以下是一个简单的示例代码,演示如何使用 cv::approxPolyDP 对轮廓进行多边形逼近:
#include <opencv2/opencv.hpp>int main() {// 读取图像并转换为灰度图像cv::Mat image = cv::imread("path/to/your/image.jpg", cv::IMREAD_GRAYSCALE);// 二值化处理,将图像转换为黑白图像,以便寻找轮廓cv::Mat binary;cv::threshold(image, binary, 128, 255, cv::THRESH_BINARY);// 寻找轮廓std::vector<std::vector<cv::Point>> contours;cv::findContours(binary, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);// 多边形逼近std::vector<std::vector<cv::Point>> approxContours(contours.size());for (size_t i = 0; i < contours.size(); ++i) {cv::approxPolyDP(contours[i], approxContours[i], 5, true); // 使用 epsilon = 5 进行多边形逼近}// 绘制轮廓和多边形逼近cv::Mat result;cv::cvtColor(binary, result, cv::COLOR_GRAY2BGR);cv::drawContours(result, contours, -1, cv::Scalar(0, 0, 255), 2); // 绘制原始轮廓(红色)cv::drawContours(result, approxContours, -1, cv::Scalar(0, 255, 0), 2); // 绘制多边形逼近(绿色)// 显示结果cv::imshow("Original and Approximated Contours", result);cv::waitKey(0);return 0;
}
在上述示例中,我们首先读取图像并转换为灰度图像,然后进行二值化处理,找到图像中的轮廓。接着,使用 cv::approxPolyDP 对每个轮廓进行多边形逼近,并绘制原始轮廓(红色)和多边形逼近(绿色)的结果。
使用 Python 和 OpenCV 实现多边形逼近的示例代码:
import cv2
import numpy as np# 读取图像并转换为灰度图像
image = cv2.imread("path/to/your/image.jpg", cv2.IMREAD_GRAYSCALE)# 二值化处理,将图像转换为黑白图像,以便寻找轮廓
_, binary = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY)# 寻找轮廓
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 多边形逼近
approxContours = []
for contour in contours:epsilon = 0.01 * cv2.arcLength(contour, True) # epsilon 控制逼近精度的参数approx = cv2.approxPolyDP(contour, epsilon, True)approxContours.append(approx)# 绘制轮廓和多边形逼近
result = cv2.cvtColor(binary, cv2.COLOR_GRAY2BGR)
cv2.drawContours(result, contours, -1, (0, 0, 255), 2) # 绘制原始轮廓(红色)
cv2.drawContours(result, approxContours, -1, (0, 255, 0), 2) # 绘制多边形逼近(绿色)# 显示结果
cv2.imshow("Original and Approximated Contours", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
在 Python 版本的代码中,我们使用了 cv2.threshold 函数进行二值化处理,使用 cv2.findContours 函数找到图像中的轮廓,然后通过 cv2.approxPolyDP 函数对每个轮廓进行多边形逼近。最后,使用 cv2.drawContours 函数将原始轮廓和多边形逼近结果绘制在图像上,并显示结果。
Python 版本的代码与 C++ 版本的代码相比,在函数调用时稍有不同,但整体逻辑是相同的。
相关文章:
OpenCV 对轮廓进行多边形逼近(Polygon Approximation)
在 OpenCV 中,cv::approxPolyDP 是一个函数,用于对轮廓进行多边形逼近(Polygon Approximation)。它可以将复杂的轮廓逼近为简化的多边形,从而减少轮廓的数据点,使轮廓更加紧凑。 函数原型如下:…...
Docker的数据管理和Dockerfile的指令
Docker的数据管理 一、Docker数据的概念1、数据卷2、数据卷容器 二、端口映射三、容器互联(使用centos镜像)四、Docker 镜像的创建1、基于现有镜像创建(1)首先启动一个镜像,在容器里做修改(2)然…...
[SQL挖掘机] - 交叉连接: cross join
介绍: 交叉连接是一种多表连接方式,它返回两个表的笛卡尔积,即将一个表的每一行与另一个表的每一行进行组合。换句话说,交叉连接会生成一个包含所有可能组合的结果集。 交叉连接的工作原理如下:它会将左表的每一行与右表的每一行…...
Python web实战 | 使用 Django 搭建 Web 应用程序 【干货】
概要 从社交媒体到在线购物,从在线银行到在线医疗,Web 应用程序为人们提供了方便快捷的服务。Web 应用程序已经成为了人们日常生活中不可或缺的一部分。搭建一个高效、稳定、易用的 Web 应用程序并不是一件容易的事情。本文将介绍如何使用 Django 快速搭…...
UE5自定义蓝图节点(二)
继承于UBlueprintAsyncActionBase的类,异步输出节点的实现方法,代码测试正常 .h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "Kismet/BlueprintA…...
Bean容器中的ThreadPoolTaskExecutor需要手动关闭吗
ThreadPoolTaskExecutor 是 Spring 提供的一个方便的线程池实现,用于异步执行任务或处理并发请求。 在使用 ThreadPoolTaskExecutor 作为 Spring Bean 注册到容器中后,Spring 会负责在应用程序关闭时自动关闭所有注册的线程池,所以不需要手动…...
Redis学习路线(3)——Redis的Java客户端
一、如何使用Redis的Java客户端 官方文档: https://redis.io/docs/clients/java/ Java-Redis客户端使用场景Jeids 以Redis命令作为方法名称,学习成本低,简单实现,但是Jedis实例是线程不安全的,多线程环境下需要基于连…...
行车遥控接线图
这个一般只有电工才会用。 主要是 【共线和总电】让人疑惑。 这图实际就是PLC的梯形图。 共电:接主电源。【它串联10A保险丝,再到继电器】 总电:它是所有继电器的公共端。【共电的继电器吸合,共电和总电就直通了。】共电的继电器…...
区块链实验室(11) - PBFT耗时与流量特征
以前面仿真程序为例,分析PBFT的耗时与流量特征。实验如下,100个节点构成1个无标度网络,节点最小度为5,最大度为38. 从每个节点发起1次交易共识。统计每次交易的耗时以及流量。本文所述的流量见前述仿真程序的说明:区块链实验室(3)…...
Shell编程基础(三)环境变量 位置变量 系统内置变量
环境变量 & 环境变量环境变量范围父子进程之间有效指定用户有效所有用户有效 位置变量系统内置变量 环境变量 在脚本种直接定义的变量,只能在当前shell进程中使用 若想要在其他shell进程中使用,可以将变量声明为 环境变量 export 变量名 ÿ…...
P5718 【深基4.例2】找最小值
题目描述 给出 n n n 和 n n n 个整数 a i a_i ai,求这 n n n 个整数中最小值是什么。 输入格式 第一行输入一个正整数 n n n,表示数字个数。 第二行输入 n n n 个非负整数,表示 a 1 , a 2 … a n a_1,a_2 \dots a_n a1,a2……...
C++——STL容器之list链表的讲解
目录 一.list的介绍 二.list类成员函数的讲解 2.2迭代器 三.添加删除数据: 3.1添加: 3.2删除数据 四.排序及去重函数: 错误案例如下: 方法如下: 一.list的介绍 list列表是序列容器,允许在序列内的任何…...
使用for循环输出左上三角、右上三角、左下三角、右下三角、上下三角
1、输出如下图形: #include<stdio.h> int main() {/*输出图形 666666666666666*/for(int i1;i<5;i){for(int j1;j<i;j){putchar(6);}printf("\n"); } return 0; } 2、输出如下图形: #include<stdio.h> int main() {/*输出图…...
CAXA中.exb或者.dwg文件保存为PDF
通常CAXAZ中的文件为.exb或者.dwg格式,我们想打印或者保存为PDF文件格式,那么就用一下的方法: CAXA文件如图所示: 框选出你要打印的图纸!!!! 我们选择"菜单"->"…...
华为刷题:HJ3明明随机数
import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);int N scan.nextInt();int[] arr new int[N];for (int i 0; i < N; i) {int n sca…...
ENVI提取NDVI与植被覆盖度估算
目标是通过ENVI计算植被覆盖度结合ArcGIS出图得到植被覆盖图。 一、植被覆盖度的定义: 植被覆盖度( FractionalVegetation Cover,FVC) 通常定义为植被( 包括叶、茎、枝) 在地面的垂直投影面积占统计区总面积的百分比,它量化了植被的茂密程度,反应了植被的生长态势,是刻画…...
Arm 扩大开源合作伙伴关系,加强投入开放协作
作者:Arm 开源软件副总裁 Mark Hambleton Arm 和我们的生态系统的关键信念之一是与开源社区合作,共创一个高度发达的 Arm 架构,使软件的落地更加稳定,从而让全球数百万开发者能够测试并创建自己的应用。 为此,Arm 支…...
Kubernetes 的核心概念:Pod、Service 和 Namespace 解析
🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~ἳ…...
互联网搜索的学习笔记
1. 参考资料 《Internet Search Tips》《Google Search Operators: The Complete List (42 Advanced Operators)》 2. 预备知识 2.1 查询语法 2.1.1 -:排除符 用于排除指定关键字。例如,如果想搜索“苹果”但不想看到“苹果手机”的结果,…...
vue事件修饰符
vue事件修饰符 1、目标2、语法 1、目标 在事件后面.修饰符名-给事件带来强大功能 2、语法 事件名.修饰符“methods里的函数” 修饰符列表 .stop - 阻止事件冒泡 示例: <template><div id"app"><div click"fatherFn"><…...
Phi-3-Mini-128K高并发服务架构设计:负载均衡与自动扩缩容策略
Phi-3-Mini-128K高并发服务架构设计:负载均衡与自动扩缩容策略 你是不是也遇到过这种情况?自己部署的AI模型服务,平时用着挺好,一旦用户量稍微上来点,或者有人发了个长请求,服务就卡死甚至直接挂掉。然后就…...
别再傻傻分不清!一文讲透华为设备CRU与FRU区别及SmartKit工具的正确打开方式
华为设备维护进阶指南:CRU与FRU的深度解析及SmartKit高效应用 在数据中心运维和IT设备管理领域,华为设备的可靠性和性能一直备受认可。然而,即便是经验丰富的运维团队,在面对设备部件更换决策时,也常常陷入概念混淆和操…...
告别黑屏!手把手教你为NT35510屏幕适配TouchGFX显示驱动(基于STM32CubeIDE)
深度解析NT35510屏幕与TouchGFX的驱动适配实战 在嵌入式GUI开发领域,TouchGFX凭借其流畅的动画效果和高效的渲染引擎,已成为STM32平台上的首选框架之一。然而,当开发者尝试在非官方支持的屏幕上使用TouchGFX时,底层显示驱动的适配…...
Youtu-VL-4B-Instruct多模态模型部署教程:预防磁盘空间不足的5个实用技巧
Youtu-VL-4B-Instruct多模态模型部署教程:预防磁盘空间不足的5个实用技巧 1. 引言:多模态模型部署的磁盘挑战 部署大型多模态模型时,磁盘空间管理往往是第一个需要面对的挑战。Youtu-VL-4B-Instruct作为腾讯优图实验室开发的视觉语言模型&a…...
Qwen3-0.6B-FP8与ComfyUI工作流结合:可视化AI应用搭建
Qwen3-0.6B-FP8与ComfyUI工作流结合:可视化AI应用搭建 最近在折腾AI应用的时候,我发现了一个挺有意思的组合:把轻量级的文本生成模型Qwen3-0.6B-FP8,接到ComfyUI这个可视化工作流工具里。听起来可能有点技术,但实际做…...
别再只盯着model.score()了!Python机器学习模型评估的5种实用方法对比
超越model.score():Python机器学习模型评估的五大实战工具 当你的机器学习模型在测试集上表现不佳时,model.score()给出的单一数值往往无法揭示问题的全貌。就像医生不能仅凭体温判断病情一样,数据科学家也需要更丰富的诊断工具来全面评估模型…...
ZLUDA技术破局:跨厂商GPU的CUDA生态兼容之道
ZLUDA技术破局:跨厂商GPU的CUDA生态兼容之道 【免费下载链接】ZLUDA CUDA on Intel GPUs 项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA 作为开源兼容层领域的创新之作,ZLUDA正在重塑GPU计算生态格局。这款突破性工具通过专利的指令翻…...
手把手教你用AI手势识别镜像:上传图片秒出彩虹骨骼图
手把手教你用AI手势识别镜像:上传图片秒出彩虹骨骼图 1. 快速了解AI手势识别镜像 今天要介绍的是一个非常实用的AI工具——基于MediaPipe Hands模型的手势识别镜像。这个工具最大的特点就是简单易用,你只需要上传一张包含手部的图片,它就能…...
SAM3优化指南:如何调节掩码精细度获得更好边缘效果
SAM3优化指南:如何调节掩码精细度获得更好边缘效果 1. 引言:为什么需要调节掩码精细度 在实际使用SAM3进行图像分割时,很多用户会遇到一个共同的问题:生成的物体边缘不够精细。比如分割一只猫时,毛发边缘显得生硬&am…...
CentOS虚拟机启动卡在紧急模式?别慌,手把手教你用xfs_repair修复XFS元数据损坏
CentOS虚拟机启动卡在紧急模式?手把手教你用xfs_repair拯救XFS元数据 当你正准备开始一天的工作,突然发现CentOS虚拟机无法正常启动,屏幕上赫然显示着"emergency mode"的红色警告。这种突如其来的系统崩溃,往往让运维人…...
