当前位置: 首页 > news >正文

基于OpenCV的红绿灯识别

基于OpenCV的红绿灯识别

技术背景

为了实现轻舟航天机器人实现红绿灯的识别,决定采用传统算法OpenCV视觉技术。

技术介绍

航天机器人的红绿灯识别主要基于传统计算机视觉技术,利用OpenCV算法对视频流进行处理,以获取红绿灯的状态信息。具体而言,该系统通过连接工控机摄像头读取视频流,将视频帧转换成HSV色彩空间的图像,以便更好地识别出图像中的红色像素。

HSV是一种将RGB色彩空间中的点在倒圆锥体中的表示方法,其中色相、饱和度和亮度分别用于描述颜色的不同属性。色调(H)用角度度量,其取值范围为0°~360°,从红色开始按逆时针方向计算,具体的光谱色如黄色、青色和品红等的色调取值为60°、180°和300°,而它们的补色则分别为青色、洋红和黄色。饱和度(S)用于描述颜色接近光谱色的程度,其取值范围为0%~100%,值越大,颜色越饱和。亮度(V)表示颜色明亮的程度,其取值范围为0%(黑)到100%(白)。

在红绿灯识别过程中,系统将视频帧转换成HSV图像后,通过筛选出所有红色像素值,利用切片技术切出图像中的红绿灯兴趣区域。接着,系统通过统计区域中红色像素块数量,设定阈值来判断红绿灯的状态,如果红色像素块数量超过阈值,则判定红绿灯为红灯闪烁,小车禁止通行;反之,如果红色像素块数量小于阈值,则判定红绿灯为绿灯闪烁,小车可以通行。

这种基于传统计算机视觉技术的红绿灯识别系统具有精度高、鲁棒性强等优点,可以在复杂的环境下准确地判断红绿灯的状态,从而为机器人的自主导航和交通安全提供可靠的技术支持。

HSV 模型的三维表示从 RGB 立方体演化而来。设想从 RGB 沿立方体对角线的白色顶点 向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度, 明度沿垂直轴测量。HSV 颜色空间可以用一个圆锥空间模型来描述。圆锥的顶点处,V=0,H 和 S 无定义,代表黑色。圆锥的顶面中心处 V=max,S=0,H 无定义,代表白色。

在这里插入图片描述

代码实现


import cv2
import numpy as np# from cv_nano3_good import Img, Video
def gstreamer_pipeline(capture_width=1280,capture_height=720,display_width=1280,display_height=720,framerate=120,flip_method=0,
):return ("nvarguscamerasrc ! ""video/x-raw(memory:NVMM), width=(int)%d, height=(int)%d, format=(string)NV12, framerate=(fraction)%d/1! ""nvvidconv flip-method=%d ! ""video/x-raw, width=(int)%d, height=(int)%d, format=(string)BGRx ! ""videoconvert ! ""video/x-raw, format=(string)BGR ! ""appsink"% (capture_width,capture_height,framerate,flip_method,display_width,display_height,))def extract_red(img):#转换为hsv颜色空间img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)rows,cols,channels=img.shapelower_red=np.array([156,43,46])# lower_red=np.array([157,177,122])# print(lower_red)upper_red=np.array([180,255,255])# print(upper_red)mask1=cv2.inRange(img_hsv,lower_red,upper_red)#拼接两个区间mask=mask1return maskif __name__=='__main__':# if cv2.VideoCapture.isOpened():Video = cv2.VideoCapture(gstreamer_pipeline(flip_method=0), cv2.CAP_GSTREAMER)print('open cam success')while True:while True:ret, Img = Video.read()# cap=cv2.VideoCapture("./test/light.mp4")# Img=cv2.imread("./test/02.jpg")# ret, Img = img.read()# cv2.imshow('./',Img)# print(Img.)img = extract_red(Img)# print(img)h, w = Img.shape[0], Img.shape[1]# print(h)# print(w)# img_cut = img[100:400, 330:600]img_cut=img[450:600,800:1100] #截取roiraw_cut = Img[450:600, 800:1100]# cv2.imshow('./',raw_cut)# cv2.waitKey(0)# cv2.imshow('./',img_cut)# cv2.waitKey(0)count = 0x = img_cut[np.where(img_cut > 250)]count = len(x)print(count)if count >= 1500:print('red')# green_light.publish(False)else:print('green')# cv2.waitKey(30)# green_light.publish(True) 

实现思路:

调取工控机摄像头读取视频流,将图像转成
HSV 通道,筛选出图像中的所有红色的像素值,再利用切片切出图像的兴趣区域,即红绿灯的所在图像
区域,最后统计区域中的红色像素块数量并设定阈值,超过此阈值则可判定红绿灯为红灯闪烁,小车禁
止通行,低于此阈值则可判定红绿灯为绿灯闪烁, 小车可以通行。

具体代码逻辑

这段代码的主要功能是从摄像头或视频流中读取图像,对图像进行红色像素的筛选和统计,以判断红绿灯的状态并输出结果。具体实现过程如下:

  1. 首先定义了一个函数gstreamer_pipeline,用于设置摄像头或视频流的参数,包括分辨率、帧率、翻转方式等。
  2. 接着定义了一个名为extract_red的函数,用于从图像中提取红色像素。该函数首先将图像从BGR色彩空间转换为HSV色彩空间,然后通过设置上下阈值提取红色像素。
  3. 在主程序中,通过调用cv2.VideoCapture函数连接摄像头或视频流,并循环读取图像。对于每一帧图像,首先调用extract_red函数提取红色像素,然后截取图像中的兴趣区域(即红绿灯的所在图像区域),并统计区域中红色像素块数量。如果红色像素块数量超过预设阈值,则判定红绿灯为红灯闪烁,否则判定为绿灯闪烁。
  4. 在输出判断结果后,程序会继续循环读取下一帧图像,直到程序被手动中断。

总的来说,该段代码主要实现了利用OpenCV对摄像头或视频流中的图像进行红绿灯状态判断的功能,其中最核心的部分是对红色像素的筛选和区域中红色像素块数量的统计。

总结

本文介绍了轻舟航天机器人实现红绿灯识别的技术背景和介绍。该系统利用OpenCV算法对视频流进行处理,识别出图像中的红色像素,并设定阈值来判断红绿灯的状态。该系统具有精度高、鲁棒性强等优点,可以为机器人的自主导航和交通安全提供技术支持。文章还介绍了HSV颜色空间的三维表示和代码实现过程仅供了解。

相关文章:

基于OpenCV的红绿灯识别

基于OpenCV的红绿灯识别 技术背景 为了实现轻舟航天机器人实现红绿灯的识别,决定采用传统算法OpenCV视觉技术。 技术介绍 航天机器人的红绿灯识别主要基于传统计算机视觉技术,利用OpenCV算法对视频流进行处理,以获取红绿灯的状态信息。具…...

JavaScript快速入门:ComPDFKit PDF SDK 快速构建 Web端 PDF阅读器

JavaScript快速入门:ComPDFKit PDF SDK 快速构建 Web端 PDF阅读器 在当今丰富的网络环境中,处理 PDF 文档已成为企业和开发人员的必需品。ComPDFKit 是一款支持 Web 平台并且功能强大的 PDF SDK,开发人员可以利用它创建 PDF 查看器和编辑器&…...

Flutter 网络请求

在Flutter 中常见的网络请求方式有三种:HttpClient、http库、dio库; 本文简单介绍 使用dio库使用。 选择dio库的原因: dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载…...

吃透《西瓜书》第三章 线性模型:多元线性回归

🍉 吃瓜系列 教材:《机器学习》 周志华著 🕒时间:2023/7/26 目录 一、多元线性回归 1 向量化 1.1.1 向量化 1.1.2 使用最小二乘法构建损失函数 1.1.3 去除求和符号,改成向量点乘的形式 1.1.4 数学原理 2 求解…...

数据结构【排序】

第七章 排序 一、排序 1.定义:将无序的数排好序 ; 2.稳定性: Kᵢ和Kⱼ中,Kᵢ优先于Kⱼ那么在排序后的记录中仍然保持Kᵢ优先; 3.评价标准:执行时间和所需的辅助空间,其次是算法的稳定性&#xf…...

探索APP开发的新趋势:人工智能和大数据的力量

随着5G技术的不断发展,人工智能和大数据将会更加广泛的应用于我们生活和工作中,作为 APP开发公司,应该及时的对新技术进行研发,进而更好的为用户服务。目前 APP开发已经不是传统的软件开发了,而是向移动互联网转型&…...

超越传统:深入比较Bootstrap、Foundation、Bulma、Tailwind CSS和Semantic UI的顶级CSS框架!

探索流行的CSS框架:Bootstrap vs Foundation vs Bulma vs Tailwind CSS vs Semantic UI 在Web开发中,选择适合项目需求的CSS框架可以极大地简化界面设计和响应式布局的工作。本文将详细介绍一些流行的CSS框架,并提供代码示例和比较&#xff…...

基于深度学习淡水鱼体重智能识别模型研究

工作原理为:首先对大众淡水鱼图片进行数据清洗并做标签分类,之后基于残差网络ResNet50模型进行有监督的分类识别训练,获取识别模型。其次通过搭建回归模型设计出体重模型,对每一类淡水鱼分别拟合出对应的回归方程,将获…...

Nginx专题(1)--linux安装nginx

ngixn安装 安装依赖包 yum install gcc yum install pcre-devel yum install zlib zlib-devel yum install openssl openssl-devel 安装nginx 下载nginx的tar包 登录http://nginx.org/en/download.html,下载nginx的Stable version版本,并解压 #执行c…...

系统集成中级计算汇总

基本计算: EV 挣值 (实际完成的工作量) AC 实际发生的花费 PV 计划花费(预算) CV 成本 SV 进度 CV 和 SV 的计算 都是通过EV 减去另一个值 CV EV-AC SV EV-PV 成本 chengben C 开头 所以CV 是成本 CV 中有个C 所以用到的是 AC ,另外一个则是剩余的PV CV SV 计算…...

json.stringify的高级用法,和for of的原理

** /* for of 是用来循环可迭代属性的,如何判断是否是可迭代属性,数据原型链上有个Symbol.iterator说明这个数据是可迭代数据 Symbol.iterator是一个函数,调用此函数,会返回一个对象,对象的内部有一个next函数,调用next函数会返回一个对象这个对象内部有value和done值&#xf…...

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控

SpringCloudAlibaba–Sentinel Sentinel被称为分布式系统的流量防卫兵,是阿里开源流量框架,从服务限流、降级、熔断等多个纬度保护服务。Sentinel同时提供了简洁易用的控制台,可以看到接入应用的秒级数据,并可以在控制台设置一些…...

mybatis - no getter for property,以及@JsonIgnore

There is no getter for property named user_full_name in class com.book.erp.entity.user.QueryUser Mybatis 配置错误,XML配置文件有Java对象以及数据库字段,配置时需要小心 user_full_name是数据库字段,不需要有get 和 set方法&#xf…...

云原生周刊:K8s v1.28 中的结构化身份验证配置

开源项目推荐 KubeLinter KubeLinter 是一种静态分析工具,用于检查 Kubernetes YAML 文件和 Helm 图表,以确保其中表示的应用程序遵循最佳实践。 DB Operator DB Operator 减轻了为 Kubernetes 中运行的应用程序管理 PostgreSQL 和 MySQL 实例的痛苦…...

支持向量机概述

支持向量机在深度学习技术出现之前,使用高斯核的支持向量机在很多分类问题上取得了很好的结果,支持向量机不仅用于分类,还可以用于回归问题。它具有泛化性能好,适合小样本和高维特征的优点。 1. SVM引入 1.1支持向量机分类 支持向量机的基本模型是定义在特征空间上的间隔…...

安装x265

一、编译libx265源码 libx265是用CMAKE编译的,故先下cmake,我是centos系统,命令: yum install cmake -y进入目录./x265_1.9/build/linux/下,执行脚本: sh make-Makefiles.bash选择好之后,输入…...

设计模式-观察者模式

一.观察者模式 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。当对象间存在一对多关系时,则使用观察者模式(Observer Pattern&…...

K8s使用Ceph作为后端存储

Ceph概述 部署Ceph集群 Ceph存储使用 Pod使用Ceph持久化数据 Ceph监控 Rook部署Ceph 1❖ Ceph概述 Ceph介绍 Ceph架构 Ceph核心概念 Ceph介绍 Ceph是一个开源的分布式存储系统,具有高扩展性、高性能、高可靠性等特点,提 供良好的性能、可靠性和可扩展…...

hive整合es,详细过程。

参考官网 Apache Hive integration | Elasticsearch for Apache Hadoop [7.17] | Elastic 官网的介绍很简单,我看了很多博客,写的也很简单,但是我搞了半天才勉强成功,分享下,免得各位多走弯路。 环境准备 官网也很…...

vue中tab隐藏display:none(v-show无效,v-if有效)

目录 背景 原因:display: table-cell>display:none 解决: 方法A.获取元素设置display(适用于 简单场景) 方法B.自定义tabs​​​​​​​ (适用于 复杂场景) 背景 内联样式(style“ ”) /this.$…...

接口测试中缓存处理策略

在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

Robots.txt 文件

什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

AI,如何重构理解、匹配与决策?

AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...