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

2024-09-06 02:20

本文主要是介绍opencv实战项目二十:检测箱盖的旋转角度以及位置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

文章目录

  • 前言
  • 一、算法流程:
  • 二、算法实现:
    • 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()

四,实现效果:

在这里插入图片描述

这篇关于opencv实战项目二十:检测箱盖的旋转角度以及位置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140725

相关文章

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.