opencv实战项目二十:检测箱盖的旋转角度以及位置

news2024/9/20 1:15:09

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、算法流程:
  • 二、算法实现:
    • 2.1 二值化箱盖并获取最大轮廓:
    • 2.2 凸包与多边形近似提取矩形
    • 2.3 最小外接矩形获取角度与位置
  • 三,整体代码实现:
  • 四,实现效果:


前言

在当今的工业自动化领域,精密制造和智能控制技术的发展正推动着生产流程的持续优化。随着机器视觉技术的不断成熟,其在工业应用中的角色愈发重要,特别是在产品质量监控和自动化装配过程中。本文将深入探讨一种基于计算机视觉的先进技术,旨在实现对箱盖旋转角度与位置的精确检测,从而为高端制造业提供一种高效、可靠的解决方案。本文将详细介绍如何运用计算机视觉技术,结合图像处理、等算法,实现对箱盖旋转角度及位置的自动检测。

一、算法流程:

本次算法流程首先读取并二值化图像,随后寻找并筛选出最大轮廓,通过近似处理确保其为凸四边形,接着计算该轮廓的凸包及最小包围矩形,从而得到其旋转角度和中心点,并在图像上绘制凸包以展示结果,最后输出相关信息并等待用户操作后关闭图像显示窗口。需识别的料盖:在这里插入图片描述

二、算法实现:

2.1 二值化箱盖并获取最大轮廓:

本次获取最大轮廓使用python内置函数max()进行实现,key选cv2.contourArea意为根据面积进行排序。
实现代码:

_, binary_image = cv2.threshold(image, 200, 255, cv2.THRESH_BINARY_INV)
mask = np.zeros_like(binary_image)
# 寻找轮廓
contours, _ = cv2.findContours(binary_image, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
max_contour = max(contours, key=cv2.contourArea)

2.2 凸包与多边形近似提取矩形

凸包(Convex Hull)和多边形近似(Polygon Approximation)是计算机视觉和几何处理中不可或缺的概念,广泛应用于图像处理、机器人导航和计算机辅助设计等领域。凸包定义为一个包含所有给定点并确保任何不在其上的点与凸包上点构成的线段完全位于凸包内部的凸多边形。计算凸包的常见算法包括格雷厄姆扫描、Jarvis March和Quickhull,它们通过逐步添加新点来扩展凸包。凸包在图像处理中用于边缘检测、形状识别和三维重建,在机器人导航中用于路径规划,在计算机辅助设计中用于图形处理。多边形近似则涉及将复杂的曲线或多边形简化为一个更简单的多边形,以减少计算和存储需求,同时保留原始形状的主要特征。多边形近似通常使用曲线或曲面的参数化表示,并通过插值或逼近来近似这些参数化曲线或曲面。
在本次算法中,首先使用凸包对最大轮廓进行简化,然后根据近似多边形进一步筛选矩形轮廓,增强箱盖检测的泛化性。
函数介绍:
凸包:
在OpenCV中,实现凸包的函数是cv2.convexHull。这个函数用于计算给定轮廓的凸包,即包含这些点并且对于任何不在凸包上的点,凸包上的所有点构成的线段都在凸包内部的凸多边形。
hull = cv2.convexHull(points)

points:一个轮廓点列表,这些点可以是二维的([x, y]),也可以是三维的([x, y, z])。
hull:返回的凸包点列表,这些点是凸包的顶点。
cv2.convexHull函数支持不同的轮廓类型,包括封闭的轮廓(cv2.CHAIN_APPROX_CLOSED)和开放的轮廓(cv2.CHAIN_APPROX_OPEN)。

多边形近似:
在OpenCV中,实现多边形近似的函数是cv2.approxPolyDP。这个函数用于对给定的多边形进行近似,即用更少的点来近似原来的多边形,同时尽可能保留其形状。approx = cv2.approxPolyDP(contour, epsilon, closed)

contour:一个轮廓点列表,这些点可以是二维的([x, y]),也可以是三维的([x, y, z])。
epsilon:近似精度,即保留原始轮廓细节的比例。
closed:一个布尔值,如果为True,则近似封闭的轮廓;如果为False,则近似开放的轮廓。
approx:返回的近似多边形的点列表,这些点是近似后的多边形的顶点。

实现代码:

perimeter = cv2.arcLength(max_contour, True)
hull = cv2.convexHull(max_contour)

cv2.drawContours(image, hull, -1, (0, 255, 0), 3)

#
approx = cv2.approxPolyDP(hull, 0.14 * perimeter, True)



2.3 最小外接矩形获取角度与位置

在OpenCV中,实现最小外接矩形的函数是cv2.minAreaRect。这个函数用于计算包含给定轮廓的最小面积矩形,即该轮廓外接的最小矩形。rect = cv2.minAreaRect(points)。

points:一个轮廓点列表,这些点可以是二维的([x, y]),也可以是三维的([x, y, z])。
rect:返回的最小面积矩形的矩形对象,包含以下四个元素:
rect[0]:矩形的中心点坐标。
rect[1]:矩形的尺寸,即宽度和高度。
rect[2]:矩形的旋转角度,相对于水平轴的角度。
cv2.minAreaRect函数返回的矩形对象是一个包含四个元素的元组,这些元素代表了矩形的中心点坐标、尺寸和旋转角度。

使用:

 rect = cv2.minAreaRect(approx)
    # 获取旋转角
    angle = rect[2]
    center  = tuple(map(int, rect[0]))# 将小数转化为整数便于后面绘制

三,整体代码实现:

import cv2
import numpy as np

# 读取图像
image = cv2.imread(r'F:\cv_traditional\024a01!450450.jpg', cv2.IMREAD_GRAYSCALE)

# 确保图像是二值的
_, binary_image = cv2.threshold(image, 200, 255, cv2.THRESH_BINARY_INV)
mask = np.zeros_like(binary_image)

# 寻找轮廓
contours, _ = cv2.findContours(binary_image, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
max_contour = max(contours, key=cv2.contourArea)

# 计算最大轮廓的周长
perimeter = cv2.arcLength(max_contour, True)

# 计算最大轮廓的凸包
hull = cv2.convexHull(max_contour)

# 在图像上绘制凸包
cv2.drawContours(image, [hull], -1, (0, 255, 0), 3)

# 近似最大轮廓的凸包,保留一定比例的周长
approx = cv2.approxPolyDP(hull, 0.14 * perimeter, True)

# 检查近似后的轮廓是否为凸四边形
if len(approx) == 4 and cv2.isContourConvex(approx):

    # 计算最小面积矩形,获取旋转角度和中心点
    rect = cv2.minAreaRect(approx)
    # 获取旋转角
    angle = rect[2]
    center = tuple(map(int, rect[0]))

    # 在图像上绘制中心点
    cv2.circle(image, center, 10, (0, 0, 0), -1)
    # 在图像上显示旋转角度
    cv2.putText(image, str(angle), (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 1)

# 显示结果
cv2.imshow('Convex Hulls of Squares', image)

# 等待按键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

四,实现效果:

在这里插入图片描述

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

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

相关文章

动能方案 | 血糖监测仪解决方案

随着糖尿病患者数量的增加和人们健康意识的提升,血糖监测仪成为了日常健康管理的重要设备。市场对便携、智能且易于使用的血糖监测仪需求持续增长,而无线通信技术,尤其是蓝牙技术,已成为现代血糖监测仪的核心组件,提供…

【数据分享】2000-2022年我国省市县三级的逐日O3数据(免费获取\excel\shp格式)

空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2000-2022年的省市县三级的逐日PM2.5数据、2013-2022年的省市县三级的逐日CO数据、2013-2022年的省市县三级的逐日SO2数据、2008-2022年我国省市县三级的逐日NO2数据和2000-2022年我国省市县三级…

监控台在特定场所的应用需要注意哪些?

监控台作为监控系统的核心操作平台,其在特定场所的应用显得尤为重要。然而,不同场所因其功能、环境及安全需求的差异,对监控台的应用提出了不同的要求与注意事项。本文将给大家从几个关键方面探讨监控台在特定场所应用时需要注意的事项。 1. …

自定义查询模板,调起查询弹框

查询模板初始化 导入一个新的查询模板 配置模板查询内容 将导入的模板 分配到对应的单据上 调起查询弹框private IBillReferQuery setConditionClient(String templateId,Container parent, String pkOperator, String funNode, String pkCorp) {TemplateInfo ti = new Temp…

图片尺寸不合适?这3款免费好用的AI绘图神器帮你免费无缝拓展!一键扩展画面之外的内容,真的泰裤啦!

大家好,我是画画的小强 在处理图片素材时,大家有没有遇到过尺寸不合适但又不能裁切的情况?是不是也想过图像要是能自己“长”出一块就好了?这种要求在以前或许很难实现,但生产式 AI 技术出现后它就不再是问题了&#…

python文件自动化(4)

接上节课内容,在开始正式移动文件到目标文件夹之前,我们需要再思考一个问题。在代码运行之前,阿文的下载文件夹里已经存在一些分类文件夹了,比如图例中“PDF文件”这个文件夹就是已经存在的。这样的话,在程序运行时&am…

【CFD教程】水中翼型空化现象模拟

一、案例背景 空化是液体中出现局部低压产生空泡的现象,比如螺旋桨、水泵等空化会造成金属腐蚀。通过本案例模拟,将定性地看到具有翼型截面的水泵叶片高速运动时,表面出现的低压空泡区域。 本案例需要的输入文件和参数信息如下表&#xff1…

【游戏杂谈】游戏设计者必备的一些软技能(一)

游戏设计者必备的一些软技能(二) - 游戏干饭之家 本文所说的设计师有可能是策划、也有可能是运营或者其他什么岗位。 许多学校提供游戏设计方面的素质训练,但接受这种培训并不足以成为一名真正的游戏设计师。要在真实的团队中茁壮成长&#…

基于udp的socket网络编程

套接字 网络套接字 原始套接字 unix套接字 windows下SOCKET 为整数。 协议家族 套接字种类 协议 udpServer.cc #pragma warning(disable:4996) #include<iostream> #include<string> #include<cstdlib> #include<WinSock2.h>#pragma comment(li…

若楠带你初识OpenCV(3)--图像平滑处理和图像形态学

文章目录 OpenCV图像平滑处理1. 添加噪声2. 均值滤波3. 方框滤波4. 高斯滤波5. 中值滤波 图像形态学1. 腐蚀2. 膨胀3. 开运算4. 闭运算5. 梯度运算6. 顶帽和黑帽顶帽黑帽 总结 OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视…

佰朔资本:北交所,突现惊人一幕!

进入9月份以来&#xff0c;北交一切7只股票产生了大宗生意。大宗生意并不乖僻&#xff0c;让人吃惊的是这些股票的生意折价起伏很大。北交所的蓝筹股贝特瑞折价逾越30%&#xff0c;连城数控亦逾越26%&#xff0c;并且这些股票较其高位本就现已跌幅巨大。 那么&#xff0c;终究…

新型PyPI攻击技术可能导致超2.2万软件包被劫持

一种针对 Python 软件包索引&#xff08;PyPI&#xff09;注册表的新型供应链攻击技术已在野外被利用&#xff0c;并且目前正试图渗透到下游组织中。 软件供应链安全公司 JFrog 将其代号定为Revival Hijack&#xff0c;并称这种攻击方法可用于劫持 2.2万个现有 PyPI 软件包&am…

JavaScript - Api学习 Day03 (日期对象、节点操作、两种定时器、本地存储)

文章目录 一、日期对象1.1 实例化1.2 日期对象方法 二、节点操作2.1 父子兄弟节点1. 父节点查找2. 子节点查找3. 兄弟关系查找 2.2 增删节点1. 创建节点 - createElement2. 添加节点2.1 appendChild() 方法2.2 insertBefore() 方法2.3. 克隆节点 - cloneNode 3. 删除节点3.1 re…

开放式运动耳机评测怎么样?真人实测总结分享

其实对于很多人来说&#xff0c;为了保持身体的健康&#xff0c;还是蛮喜欢适当运动的。不过&#xff0c;跑步有时候还是有点枯燥的&#xff0c;所以能提升运动兴趣的装备必须提前安排。除了舒服的衣服&#xff0c;耳机也是必不可少的&#xff0c;跟着节奏踩点跑步也很容易分泌…

【数据库】MySQL-基础篇-SQL

专栏文章索引&#xff1a;数据库 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、SQL通用语法 二、SQL分类 三、DDL 1.数据库操作 1.1 查询所有数据库 1.2 查询当前数据库 1.3 创建数据库 1&#xff09;案例&#xff1a; 1.4 删除数据库 1.5 切换数据库…

Hadoop运行jps没有datanode节点【已解决】

1 原因&#xff1a; 格式化NameNode后&#xff0c;如果DataNode的clusterID与新的NameNode的clusterID不匹配&#xff0c;DataNode将无法加入集群&#xff0c;导致HDFS无法正常提供服务。 2 解决方式&#xff1a; 将新的NameNode的clusterID与DataNode的clusterID保持一致 &…

C#使用MQTT(二):MQTT客户端

上一篇我们初步设计了MQTT服务端 C#使用MQTT(一):MQTT服务端-CSDN博客 这里我们设计客户端MQTT Client,接上一篇 新建Windows窗体FormMqttClient 窗体FormMqttClient设计如图&#xff1a; 窗体FormMqttClient设计器相关代码如下 文件FormMqttClient.Designer.cs namespace…

【软件测试】软件测试-----什么是Bug?Bug是如何分级的?Bug的生命周期是怎样的?如何描述一个Bug?

博客目录 一.软件测试的生命周期二.BUG的定义和级别2.1 bug的概念.2.2 如何描述一个bug.2.3bug的级别2.3.1 bug分级的意义.2.3.2 bug的四种级别. 三.BUG的生命周期.四.当与开发人员发生冲突该如何处理(高频面试)五.总结 一.软件测试的生命周期 软件测试贯穿于软件的整个生命周…

Day-02-QPushButton设置信号与槽一在UI界面直接设置槽函数

1.点击UI界面 2.选择Push Button按键 3.右键选择转到槽 4.根据自己的需要选择信号事件 5.在自动生成的函数内编写自己需要完成的动作

【网络安全】服务基础第一阶段——第十一节:Windows系统管理基础----PKI技术与应用

目录​​​​​​​ 一、加密技术 1.1 基本保密通信模型 1.2 密码学发展 1.2.1 古典密码学&#xff08;1949年前&#xff09; 1.2.2 近代密码学&#xff08;1949&#xff5e;1975年&#xff09; 1.2.3 现代密码学&#xff08;1976年以后&#xff09; 1.3 古典密码 1.3.…