首页 > 其他分享 >opencv实战项目二十:检测箱盖的旋转角度以及位置

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

时间:2024-09-05 13:54:18浏览次数:6  
标签:实战 矩形 箱盖 image cv2 近似 凸包 opencv 轮廓

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

文章目录


前言

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

一、算法流程:

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

二、算法实现:

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()

四,实现效果:

在这里插入图片描述

标签:实战,矩形,箱盖,image,cv2,近似,凸包,opencv,轮廓
From: https://blog.csdn.net/HanWenKing/article/details/141926228

相关文章

  • OPenCV结构分析与形状描述符(5)查找图像中的连通组件的函数connectedComponents()的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述connectedComponents函数计算布尔图像的连通组件标签图像。该函数接受一个具有4或8连通性的二值图像,并返回N,即标签总数(标签范围为[0,N-1],其中0代表背景标签)。ltype参数指......
  • OPenCV结构分析与形状描述符(3)计算一个点集的最小外接矩形的函数boundingRect()的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述计算一个点集的最小右上边界矩形或灰度图像中的非零像素。该函数计算并返回指定点集或灰度图像中非零像素的最小右上边界矩形。在OpenCV中,boundingRect函数用于找到一个点集的最......
  • 用Python实现时间序列模型实战——Day 11: 指数平滑模型
    一、学习内容1.简单指数平滑法简单指数平滑法:简单指数平滑法(SimpleExponentialSmoothing,SES)是一种用于平滑时间序列数据的技术,通过对数据赋予不同的指数权重,较新的数据点权重更高。SES适用于平稳的时间序列数据,即没有显著趋势和季节性成分的时间序列。SES模型的......
  • opencv全面详解教程
    opencv全面详解教程1.OpenCV简介2.安装OpenCV2.1使用pip安装(适用于Python)2.2通过conda安装2.3从源码编译(高级)3.OpenCV基本操作3.1读取和显示图像3.2保存图像3.3视频处理4.图像处理操作4.1调整大小和裁剪4.2颜色空间转换4.3图像平滑(滤波)4.4边......
  • 数仓建模:如何有效构建DWB/DWM层? | 基于案例实战分析
    目录0为什么要构建DWB层?1DWB层功能及定义2DWB/DWM层如何实现?3项目案例实战3.1案例1:订单明细事实宽表构建3.2案例2:工单事实表指标分析4小结0为什么要构建DWB层?该层可以理解为DWS层逻辑的优化和沉淀,如果直接放到DWS层则会使得DWS层变得代码逻辑很复杂,不好维......
  • MySQL零基础入门教程-5 单行处理函数、分组函数、mysql关键字执行顺序,基础+实战
     教程来源:B站视频BV1Vy4y1z7EX001-数据库概述_哔哩哔哩_bilibili我听课整理的课程的完整笔记,供大家学习交流下载:夸克网盘分享本文内容为完整笔记的第五篇17、单行数据处理函数P30-36&分组函数17.1、数据处理函数又被称为单行处理函数单行处理函数的特点:一个输入对应一个......
  • OpenCV使用RTMP流
    使用RTMP流之前使用nginx进行推流sudoapt-getinstallnginxlibnginx-mod-rtmp配置文件中添加以下内容:rtmp{server{listen1935;chunk_size4096;applicationlive{liveon;recordoff;}}}Linux下安......
  • 《OpenCV计算机视觉》—— 图像轮廓检测与绘制
    文章目录一、轮廓的检测二、轮廓的绘制图像轮廓检测与绘制的代码实现三、轮廓的近似一、轮廓的检测轮廓检测是指在包含目标和背景的数字图像中,忽略背景和目标内部的纹理以及噪声干扰的影响,采用一定的技术和方法来实现目标轮廓提取的过程注意:做轮廓检测前需要将图片......
  • 《OpenCV计算机视觉》—— 模板匹配
    文章目录一、模板匹配简单介绍二、三个主要函数的介绍1.执行模板匹配函数-cv2.matchTemplate()2.查找最佳匹配函数-cv2.minMaxLoc()3.在原图上绘制匹配区域函数-cv2.rectangle()三、代码实现一、模板匹配简单介绍在Python中,模板匹配是一种在图像中查找与给定模板最......
  • OpenCV 之图像平滑处理
    引言图像平滑处理(也称为“模糊处理”)是计算机视觉中一项非常基础的技术,常用于减少图像噪声或失真,提高图像质量。平滑处理可以通过各种滤波器实现,常见的滤波器包括均值滤波、方框滤波、高斯滤波和中值滤波。本文将详细介绍这些滤波器的原理及其在OpenCV中的具体实现。基础概......