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

相关文章

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2