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

相关文章

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

SpringBoot集成MyBatis实现SQL拦截器的实战指南

《SpringBoot集成MyBatis实现SQL拦截器的实战指南》这篇文章主要为大家详细介绍了SpringBoot集成MyBatis实现SQL拦截器的相关知识,文中的示例代码讲解详细,有需要的小伙伴... 目录一、为什么需要SQL拦截器?二、MyBATis拦截器基础2.1 核心接口:Interceptor

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.