机器视觉学习(十一)—— 最小矩形和圆形区域、近似轮廓、凸包

目录

一、最小矩形区域与最小圆形区域 

1.1 cv2.minAreaRect()函数

1.2 cv2.minEnclosingCircle()函数

1.3 最小矩形区域与最小圆形区域示例

二、 显示近似轮廓

2.1 cv2.approxPolyDP()函数

2.2 显示近似轮廓示例代码

2.2.1 简约版 

2.2.2 进阶版 

三、 显示凸包

3.1 cv2.convexHull()函数

3.2 显示凸包示例代码


一、最小矩形区域与最小圆形区域 

1.1 cv2.minAreaRect()函数

cv2.minAreaRect()函数是OpenCV中的一个函数,用于计算点集的最小外接矩形。

函数原型如下:

retval = cv2.minAreaRect(points)

参数说明:

  • points:需要计算最小外接矩形的点集。可以是一个numpy数组或者一个contour(轮廓)。

返回值说明:

  • retval:返回一个 Box2D 结构,其中包含以下信息:
    • retval[0]:矩形的中心点坐标 (x, y)。
    • retval[1]:矩形的宽度和高度。
    • retval[2]:旋转角度,表示矩形相对于水平轴的旋转角度。

1.2 cv2.minEnclosingCircle()函数

cv2.minEnclosingCircle()函数是一个OpenCV函数,用于计算给定点集的最小外接圆。

函数的语法如下:

center, radius = cv2.minEnclosingCircle(points)

参数说明:

  • points:输入的点集,可以是一个点的列表或数组。

返回值说明:

  • center:最小外接圆的圆心坐标。
  • radius:最小外接圆的半径。

注意:

  • 输入点集的数据类型应为numpy数组。
  • 函数计算的是最小外接圆,即能包含所有输入点的最小半径的圆。

1.3 最小矩形区域与最小圆形区域示例

使用cv2.minAreaRect()函数来计算最小矩形区域,使用函数cv2.minEnclosingCircle()函数来计算最小圆形区域。

最小矩形区域:

import cv2
import numpy as np# 创建一个轮廓
contours = np.array([[100, 100], [200, 100], [200, 200], [100, 200]])# 计算最小矩形区域
rect = cv2.minAreaRect(contours)
box = cv2.boxPoints(rect)
box = np.int0(box)# 绘制最小矩形
img = np.zeros((300, 300), dtype=np.uint8)
cv2.drawContours(img, [box], 0, (255), 2)
cv2.imshow('Min Area Rectangle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

对于最小矩形区域,返回的是一个包含四个点的数组,可以使用cv2.boxPoints()来获取这四个点的坐标。

函数原型:   cv.boxPoints(rect)      作用:   将 cv2.minAreaRect(contour)得到的结果转化成四个点的坐标

最小圆形区域:

import cv2
import numpy as np# 创建一个轮廓
contours = np.array([[100, 100], [200, 100], [200, 200], [100, 200]])# 计算最小圆形区域
(x, y), radius = cv2.minEnclosingCircle(contours)
center = (int(x), int(y))
radius = int(radius)# 绘制最小圆形
img = np.zeros((300, 300), dtype=np.uint8)
cv2.circle(img, center, radius, (255), 2)
cv2.imshow('Min Enclosing Circle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

对于最小圆形区域,返回的是圆心的坐标和半径。

二、 显示近似轮廓

2.1 cv2.approxPolyDP()函数

cv2.approxPolyDP()函数是OpenCV中用于对轮廓进行近似的函数。

函数语法如下:

approx = cv2.approxPolyDP(curve, epsilon, closed)

参数说明: 

  • curve:输入的曲线/轮廓。
  • epsilon:表示近似精度的参数。它是一个距离阈值,表示轮廓与近似轮廓之间的最大距离。较小的值会产生更准确的近似,但也会导致近似轮廓较长。较大的值会生成更简化的近似轮廓。
  • closed:一个布尔值,表示曲线是否是闭合的。如果为True,函数会将曲线近似为一个闭合的多边形。如果为False,函数会将曲线近似为一个开放的多边形。

函数会返回一个近似轮廓,它是一个由近似点组成的多维数组。

2.2 显示近似轮廓示例代码

要显示近似轮廓,你可以使用cv2.drawContours()函数绘制轮廓。

以下两个示例代码,演示如何使用cv2.approxPolyDP()函数对轮廓进行近似,并绘制近似轮廓:

2.2.1 简约版 
import cv2
import numpy as np# 读取图像并将其转换为灰度图像
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行阈值处理
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 查找轮廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 创建一个空白的图像作为近似轮廓的绘制目标
approx_image = np.zeros_like(image)# 遍历每个轮廓
for contour in contours:# 近似轮廓epsilon = 0.01 * cv2.arcLength(contour, True)approx = cv2.approxPolyDP(contour, epsilon, True)# 绘制近似轮廓cv2.drawContours(approx_image, [approx], -1, (0, 255, 0), 2)# 显示图像
cv2.imshow('Approximated Contours', approx_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,我们首先读取图像并将其转换为灰度图像,并进行阈值处理以获取二值图像。然后使用cv2.findContours()函数查找图像中的轮廓。

接下来,我们遍历每个轮廓,并使用cv2.approxPolyDP()函数对轮廓进行近似。然后,我们创建一个空白的图像approx_image作为近似轮廓的绘制目标。

最后,我们使用cv2.drawContours()函数将近似轮廓绘制到approx_image上,并显示图像。

2.2.2 进阶版 

使用OpenCV中的Canny函数显示近似轮廓更直观

import cv2def show_approx_contour(image_path):# 读取图像image = cv2.imread(image_path)# 将图像转换为灰度gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用Canny函数检测边缘edges = cv2.Canny(gray, 50, 150)# 执行轮廓检测contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 近似轮廓approx_contours = []for contour in contours:epsilon = 0.01 * cv2.arcLength(contour, True)approx = cv2.approxPolyDP(contour, epsilon, True)approx_contours.append(approx)# 在原始图像上绘制轮廓cv2.drawContours(image, approx_contours, -1, (0, 255, 0), 2)# 显示图像cv2.imshow("Approximate Contours", image)cv2.waitKey(0)cv2.destroyAllWindows()# 示例用法
image_path = "path/to/your/image.jpg"
show_approx_contour(image_path)

在这个示例中,我们首先读取输入的图像,并将其转换为灰度图像。然后,我们使用Canny函数来检测图像的边缘。

接下来,我们使用cv2.findContours()函数来执行轮廓检测。然后,我们对每个轮廓应用cv2.approxPolyDP()函数来近似轮廓线。这个函数使用Douglas-Peucker算法,它根据指定的精度参数来逐渐减少轮廓中的点数。

最后,我们使用cv2.drawContours()函数在原始图像上绘制近似的轮廓线,然后使用cv2.imshow()函数显示结果图像。

三、 显示凸包

3.1 cv2.convexHull()函数

cv2.convexHull()函数是OpenCV中的一个函数,用于计算给定点集的凸包。

凸包是包围点集的多边形,使得多边形的所有内角都小于180度,并且所有点都位于多边形的边界上。

函数的语法如下:

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

参数说明:

  • points:输入的点集,可以是一个numpy数组,每个点的数据类型应是int32。
  • hull:可选参数,指定输出的凸包点集的索引,默认为None。
  • clockwise:可选参数,指定是否按顺时针方向输出凸包点集,默认为False。
  • returnPoints:可选参数,指定是否返回凸包点集的坐标,默认为True。

返回值:

  • 如果hull参数为None,则返回凸包点集的索引。
  • 如果hull参数不为None,则返回凸包点集的坐标。

函数的使用示例:

import numpy as np
import cv2points = np.array([[10, 10], [10, 100], [100, 100], [100, 10]], dtype=np.int32)
hull = cv2.convexHull(points)print(hull)

输出结果:

[[[ 10 100]][[100 100]][[100  10]][[ 10  10]]]

3.2 显示凸包示例代码

要在OpenCV中显示凸包,可以使用cv2.convexHull()函数。

下面是显示凸包的示例代码:

import cv2def show_convex_hull(image_path):# 读取图像image = cv2.imread(image_path)# 将图像转换为灰度gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用Canny函数检测边缘edges = cv2.Canny(gray, 50, 150)# 执行轮廓检测contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 寻找凸包convex_hulls = []for contour in contours:hull = cv2.convexHull(contour)convex_hulls.append(hull)# 在原始图像上绘制凸包cv2.drawContours(image, convex_hulls, -1, (0, 255, 0), 2)# 显示图像cv2.imshow("Convex Hull", image)cv2.waitKey(0)cv2.destroyAllWindows()# 示例用法
image_path = "path/to/your/image.jpg"
show_convex_hull(image_path)

在这个示例中,我们首先读取输入的图像并将其转换为灰度图像。然后,我们使用Canny函数检测图像的边缘。

接下来,我们使用cv2.findContours()函数执行轮廓检测。然后,对于每个轮廓,我们使用cv2.convexHull()函数找到凸包。

最后,我们使用cv2.drawContours()函数在原始图像上绘制凸包,然后使用cv2.imshow()函数显示结果图像。

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

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

相关文章

软件测试-用例篇

目录 1 测试用例的基本要素2 测试用例给我们带来的好处3 测试用例的设计方法3.1 基于需求进行测试用例的设计3.1.1 功能需求测试分析3.1.2 非功能需求测试分析 4 具体的设计方法4.1 等价类4.2 边界值4.3 错误猜测法4.4 场景设计法4.5 因果图4.5.1 因果图需要掌握的基本知识4.5.…

用一个程序解决SQLite常见的各项操作(实用篇)

文章说明: 本篇文章是在之前的一篇文章SQLite3进行数据库各项常用操作基础上写的,将SQLite涉及到的常用的几种操作,以函数的形式处理成相互调用的形式。 因为之前的文章对基础操作已经解释过了,所以这里直接放置可执行代码和结果…

kali常用命令功能简介记录

Kali Linux中常用的命令: 1. apt-get update:更新软件源列表。 2. apt-get upgrade:升级系统中已安装的软件包。 3. apt-get install [软件包]:安装指定的软件包。 4. apt-get remove [软件包]:卸载指定的软件包。 5.…

上海开放大学2024春《机械工程导论》简答题参考答案

答案:更多答案,请关注【电大搜题】微信公众号 答案:更多答案,请关注【电大搜题】微信公众号 答案:更多答案,请关注【电大搜题】微信公众号 机械工程导论 - 简答题 一共五个题: 1. 材料力学…

301.【华为OD机试】最小传输时延I(Dijkstra 算法—JavaPythonC++JS实现)

本文收录于专栏:算法之翼 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解代码C/C++题解代码JS题解代码四.代码讲解(Ja…

基于YOLOv8的绝缘子检测系统

💡💡💡本文摘要:基于YOLOv8的绝缘子小目标检测,阐述了整个数据制作和训练可视化过程 1.YOLOv8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&a…

kali Linux上安装docker过程记录

安装情况: 直接安装提示错误!!! 安装程序命令: apt install -y docker.io 安装结果提示安装失败!!!看别人安装直接成功到我这怎么失败!!!找原因…

引用,内联函数,auto函数,指针nullptr

一:引用 1.1 该文章的引用是对上一篇引用的进行补充和完善 按理来说,double可以隐式转换为int,那起别名的时候为什么不可以类型转换呢? 那是因为,在类型转换的时候,会创建一个临时变量,让后再…

如何提高小红书笔记的收录率?

在小红书平台上,笔记的收录率是衡量一篇笔记是否受欢迎和有价值的重要因素。为了提高笔记的收录率,有几个关键点需要注意: 1.内容不涉及广告 在发布笔记前要先确保笔记内容不包含任何形式的广告或推广信息。小红书平台对于广告性质的内容有…

资治通鉴读后感之【顺应人性、联盟、创业切入点、领袖魅力】

目录 顺应人性: 联盟: 防蚁穴: 创业者切入点: 组建团队: 顺应人性: 不着急、不害怕、不要脸的精神 兴衰、人性、道德、权谋 优秀的人才:愿和你交流的时候,多交流,…

【React】在React中如何渲染空格

前言 代码中冒号是英文冒号&#xff0c;以便显示空格是否渲染 方式一&#xff1a;使用花括号 function Message () {return (<p>姓名:{" "}张三</p>) }方式二&#xff1a;使用Html实体 function Message () {return (<p>姓名: 张三</p>)…

题目:练习函数调用

题目&#xff1a;练习函数调用 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should leave quickly…

Day41 动态规划 part03

Day41 动态规划 part03 343. 整数拆分 我的思路&#xff1a; 自己写不了一点… 拿代码debug&#xff0c;dp数组&#xff0c;表示正整数n的最大拆分乘积&#xff0c;当n 2的时候才能拆分&#xff08;2 1 1&#xff09;&#xff0c;且dp[2] 1 我们用 i 遍历&#xff0c;记录…

24年大一训练一(东北林业大学)

前言&#xff1a; 周五晚上的训练赛&#xff0c;以后应该每两周都会有一次。 正文&#xff1a; Problem:A矩阵翻转&#xff1a; #include<bits/stdc.h> using namespace std; int a[55][55]; int main(){int n,m;while(cin>>n>>m){for(int i1;i<n;i){for…

11.最多约数

问题描述 对于以下这些数(6 行&#xff0c;每行6个&#xff0c;共36个)&#xff0c;请问约数数最多的是哪个?(如果有多个&#xff0c;请回答出现最早的那个) 393353 901440 123481 850930 423154 240461 373746 232926 396677 486579 744860 468782 941389 777714 992588 3432…

Mysql数据库:故障分析与配置优化

目录 前言 一、Mysql逻辑架构图 二、Mysql单实例常见故障 1、无法通过套接字连接到本地MySQL服务器 2、用户rootlocalhost访问被拒绝 3、远程连接数据库时连接很慢 4、无法打开以MYI结尾的索引文件 5、超出最大连接错误数量限制 6、连接过多 7、配置文件/etc/my.cnf权…

PDF转成二维码分享

在制作电子产品册之前&#xff0c;你需要思考以下几个问题&#xff1a;你的电子产品册是面向什么人群的&#xff1f;是宣传册、使用手册还是产品介绍册&#xff1f;明确目标与定位有助于我们更好地规划产品册的内容和风格。 一、收集素材与整理信息 在开始制作之前&#xff0c…

latex学习笔记

一 安装latex&#xff08;vscodetexlive&#xff09; 安装latex学习链接&#xff1a; 【超详细】最好用LaTex环境安装配置手把手教学&#xff01;&#xff01;&#xff08;支持双向搜索&#xff0c;附赠所需安装包及竞赛模板&#xff09;_哔哩哔哩_bilibilihttps://www.bilib…

KeepAlived使用介绍

目录 1、Introduce 2、基本使用 &#xff08;1&#xff09;安装 &#xff08;2&#xff09;配置文件 &#xff08;3&#xff09;使用教程 1、Introduce keepalived是一个用于实现高可用性和负载均衡的开源软件。它提供了一种轻量级的方式来管理多个服务器&#xff0c;并确保…

高效解决Ubuntu Server 18.04.1 LTS 64bit更新gdb8.1.1到gdb12.1

文章目录 问题解决步骤 问题 因为需要用到gdb一些指令&#xff0c;但是gdb8.x好像存在普遍的问题&#xff0c;实现不了某些指令&#xff0c;比方说set detach-on-fork on&#xff0c;升级版本也没有比较好的教程 经过我不断的试错&#xff0c;我终于升级成功了&#xff01;&a…