计算机视觉 | 交通信号灯状态的检测和识别

Hi,大家好,我是半亩花海。本项目旨在使用计算机视觉技术检测交通信号灯的状态,主要针对红色绿色信号灯的识别。通过分析输入图像中的像素颜色信息,利用OpenCV库实现对信号灯状态的检测和识别。


目录

一、项目背景

二、项目功能

三、代码拆解

1. 导入所需的库

2. 读取输入图像

3. 定义颜色阈值范围

4. 转换颜色空间

5. 创建颜色掩膜

6. 查找轮廓

7. 检测红色信号灯

8. 检测绿色信号灯

9. 显示结果

四、结果展示

五、完整代码

六、总结


一、项目背景

随着交通系统的发展,交通信号灯在道路安全和交通管制中扮演着至关重要的角色。传统的信号灯控制需要人工操作,而基于计算机视觉的自动检测系统能够提高交通信号灯的检测效率和准确性,为交通管理带来更多可能性。


二、项目功能

本项目旨在利用计算机视觉技术检测交通信号灯的状态,具体功能包括:

  • 识别输入图像中的红色信号灯和绿色信号灯。
  • 在图像上标记出识别到的信号灯区域,并添加相应的文字标签。

三、代码拆解

1. 导入所需的库

导入OpenCV(cv2)和NumPy库。(使用 pip 安装 opencv-python numpy 库)

import cv2
import numpy as np

2. 读取输入图像

使用 OpenCV 的imread()函数读取输入图像,其中输入图像包含交通信号灯的场景。

img = cv2.imread("light1.png")

3. 定义颜色阈值范围

通过指定红色和绿色的 HSV(色相、饱和度、亮度)值范围,使用 NumPy 库创建相应的颜色阈值范围。

minRed = np.array([0, 127, 128])  
maxRed = np.array([10, 255, 255])
minGreen = np.array([50, 100, 20])
maxGreen = np.array([90, 255, 200])

4. 转换颜色空间

将输入图像从 BGR 颜色空间转换为 HSV 颜色空间,以便更好地识别颜色。

img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

5. 创建颜色掩膜

利用颜色阈值范围,使用 OpenCV 的inRange()函数创建红色和绿色的掩膜。

mask_red = cv2.inRange(img_hsv, minRed, maxRed)  
mask_green = cv2.inRange(img_hsv, minGreen, maxGreen)

6. 查找轮廓

利用 OpenCV 的findContours()函数找到掩膜中的轮廓。

contours1, hierarchy1 = cv2.findContours(mask_red, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)  
contours2, hierarchy2 = cv2.findContours(mask_green, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

7. 检测红色信号灯

遍历红色掩膜中的轮廓,使用boundingRect()函数确定轮廓的边界框,并根据框的大小判断是否为有效的信号灯区域,最后在输入图像上绘制相应的矩形框和文字标签。

for cnt in contours1:
    (x, y, w, h) = cv2.boundingRect(cnt)
    if w * h < 20 * 20:  
        continue
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 255), 2)  
    cv2.putText(img, 'red_light', (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)

8. 检测绿色信号灯

同样,遍历绿色掩膜中的轮廓,进行边界框的绘制和标签添加。

for cnt in contours2:
    (x, y, w, h) = cv2.boundingRect(cnt)
    if w * h < 20 * 20:  
        continue
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)  
    cv2.putText(img, 'green_light', (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)

9. 显示结果

利用OpenCV的imshow()函数显示标记后的图像,并通过waitKey()destroyAllWindows()函数控制图像显示窗口的关闭。

cv2.imshow('res', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、结果展示


五、完整代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@Project : TrafficLights
@File    : test_image.py
@IDE     : PyCharm
@Author  : 半亩花海
@Date    : 2024/04/20 21:45
"""
import cv2
import numpy as np

img = cv2.imread("light1.png")

# 指定红色值的范围
minRed = np.array([0, 127, 128])  # 红色阈值下界
maxRed = np.array([10, 255, 255])  # 红色阈值上界
# 指定绿色值的范围
minGreen = np.array([50, 100, 20])
maxGreen = np.array([90, 255, 200])
# BGR -> HSV颜色空间
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 确定目标区域
mask_red = cv2.inRange(img_hsv, minRed, maxRed)  # 过滤出红色部分,获得红色的掩膜
mask_green = cv2.inRange(img_hsv, minGreen, maxGreen)  # 获得绿色部分掩膜

# 查找轮廓
contours1, hierarchy1 = cv2.findContours(mask_red, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)  # 轮廓检测 红灯
contours2, hierarchy2 = cv2.findContours(mask_green, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)  # 轮廓检测 绿灯

# 检测红灯
for cnt in contours1:
    (x, y, w, h) = cv2.boundingRect(cnt)  # 该函数返回矩阵四个点
    if w * h < 20 * 20:  # 忽略20*20的框
        continue
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 255), 2)  # 将检测到的颜色框起来
    cv2.putText(img, 'red_light', (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
# 检测绿灯
for cnt in contours2:
    (x, y, w, h) = cv2.boundingRect(cnt)  # 该函数返回矩阵四个点
    if w * h < 20 * 20:  # 忽略20*20的框
        continue
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)  # 将检测到的颜色框起来
    cv2.putText(img, 'green_light', (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)

cv2.imshow('res', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

六、总结

注意事项

  • 确保输入的图像具有足够的清晰度和对比度,以便准确识别红色和绿色信号灯。
  • 可根据实际场景调整代码中的颜色阈值范围以获得更好的检测效果。

通过本项目,可以利用计算机视觉技术实现交通信号灯的自动检测,提高交通管理的效率和准确性。通过调整颜色阈值范围轮廓检测参数,可以适应不同场景下的交通信号灯检测需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/565849.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uni-app 的 扩展组件(uni-ui) 与uView UI

uni-app 的 扩展组件&#xff08;uni-ui&#xff09; 与uView UI uni-ui 官方背景&#xff1a;组件集&#xff1a;设计风格&#xff1a;文档与支持&#xff1a;社区与生态&#xff1a; uView UI 第三方框架&#xff1a;组件集&#xff1a;设计风格&#xff1a;文档与支持&#…

Python --- 新手小白自己动手安装Anaconda+Jupyter Notebook全记录(Windows平台)

新手小白自己动手安装AnacondaJupyter Notebook全记录 这两天在家学Pythonmathine learning&#xff0c;在我刚刚入手python的时候&#xff0c;我写了一篇新手的入手文章&#xff0c;是基于Vs code编译器的入手指南&#xff0c;里面包括如何安装python&#xff0c;以及如何在Vs…

四六级英语听力考试音频无线发射系统在安顺学院的成功应用分析

四六级英语听力考试音频无线发射系统在安顺学院的成功应用分析 由北京海特伟业科技任洪卓发布于2024年4月22日 安顺学院为了提高学生的外语听力水平&#xff0c;并确保英语四六级听力考试的稳定可靠进行&#xff0c;决定对传统的英语听力音频传输系统进行改造&#xff0c;以提供…

海康Visionmaster-常见问题排查方法-启动阶段

VM试用版启动时&#xff0c;弹窗报错&#xff1a;加密狗未安装或检测异常&#xff1b;  问题原因&#xff1a;安装VM 的时候未选择软加密&#xff0c;选择了加密狗驱动&#xff0c;此时要使用软授权就出现了此现象。  解决方法&#xff1a; ① 首先确认软加密驱动正确安装…

单片机 VS 嵌入式LInux (学习方法)

linux 嵌入式开发岗位需要掌握Linux的主要原因之一是&#xff0c;许多嵌入式系统正在向更复杂、更功能丰富的方向发展&#xff0c;需要更强大的操作系统支持。而Linux作为开源、稳定且灵活的操作系统&#xff0c;已经成为许多嵌入式系统的首选。以下是为什么嵌入式开发岗位通常…

机器学习-10-神经网络python实现-从零开始

文章目录 总结参考本门课程的目标机器学习定义从零构建神经网络手写数据集MNIST介绍代码读取数据集MNIST神经网络实现测试手写的图片 带有反向查询的神经网络实现 总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍基于python实现神经网络。 参考 BP神经网络及pytho…

数据挖掘实验(Apriori,fpgrowth)

Apriori&#xff1a;这里做了个小优化&#xff0c;比如abcde和adcef自连接出的新项集abcdef&#xff0c;可以用abcde的位置和f的位置取交集&#xff0c;这样第n项集的计算可以用n-1项集的信息和数字本身的位置信息计算出来&#xff0c;只需要保存第n-1项集的位置信息就可以提速…

去哪儿网开源的一个对应用透明,无侵入的Java应用诊断工具

今天 V 哥给大家带来一款开源工具Bistoury&#xff0c;Bistoury 是去哪儿网开源的一个对应用透明&#xff0c;无侵入的java应用诊断工具&#xff0c;用于提升开发人员的诊断效率和能力。 Bistoury 的目标是一站式java应用诊断解决方案&#xff0c;让开发人员无需登录机器或修改…

microk8s拉取pause镜像卡住

前几天嫌服务器上镜像太多占空间&#xff0c;全部删掉了&#xff0c;今天看到 microk8s 更新了 1.30 版本&#xff0c;果断更新&#xff0c;结果集群跑不起来了。 先通过 microk8s.kubectl get pods --all-namespaces 命令看看 pod 状态。 如上图可以看到&#xff0c;所有的业…

物联网通信中NB-IoT、Cat.1、Cat.M该如何选择?

物联网通信中NB-IoT、Cat.1、Cat.M该如何选择? 参考链接:物联网通信中NB-IoT、Cat.1、Cat.M该如何选择?​​ 在我们准备设计用于大规模联网的物联网设备时,选择到适合的LTE IoT标准将是我们遇到的难点。这是我们一开始设计产品方案就需要解决的一个问题,其决定我们设备需…

HarmonyOS ArkUI实战开发-NAPI 加载原理(下)

上一节笔者给大家讲解了 JS 引擎解释执行到 import 语句的加载流程&#xff0c;总结起来就是利用 dlopen() 方法的加载特性向 NativeModuleManager 内部的链接尾部添加一个 NativeModule&#xff0c;没有阅读过上节文章的小伙伴&#xff0c;笔者强烈建议阅读一下&#xff0c;本…

ChatGPT在线网页版(与GPT Plus会员完全一致)

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

【PostgreSQL】Postgres数据库安装、配置、使用DBLink详解

目录 一、技术背景1.1 背景1.2 什么是 DBLink 二、安装配置 DBLink2.1 安装 DBLink2.2 配置 DBLink1. 修改 postgresql.conf2. 修改 pg_hba.conf 三、DBLink 使用3.1 数据准备3.2 DBLink 使用1. 创建 DBLink 连接2. 使用 DBLink 进行查询3. 使用 DBLink 进行增删改4. 使用 DBLi…

第G8周:ACGAN任务

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 参考论文 这周主要任务就是根据之前GAN&#xff0c;CGAN&#xff0c;SGAN网络架构搭建…

照片相似性搜索引擎Embed-Photos;赋予大型语言模型(LLMs)视频和音频理解能力;OOTDiffusion的基础上可控制的服装驱动图像合成

✨ 1: Magic Clothing Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目&#xff0c;建立在OOTDiffusion的基础上 Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目&#xff0c;建立在OOTDiffusion的基础上。通过使用Magic Clothing&#xf…

CountDownLatch倒计时器源码解读与使用

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. CountDownLatch有什么用 3. CountDownLatch底层原理 3.1. count…

软考高项(已通过,E类人才)-学习笔记材料梳理汇总

软考高项&#xff0c;即软考高级信息系统项目管理师&#xff0c;全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试中的高级水平测试。适用于从事计算机应用技术、软件、网络、信息系统和信息服务等领域的专业人员&#xff0c;以及各级企业管理人员和从事项目…

51单片机使用两个按钮控制LED灯不同频率的闪烁

#include <reg52.h>sbit button1 P1^1; // 间隔2秒的按钮 sbit button2 P1^5; // 间隔0.6秒的按钮sbit led P1^3;unsigned int cnt1 0; // 设置LED1灯的定时器溢出次数 unsigned int cnt2 0; // 设置LED2灯的定时器溢出次数 unsigned int flg1 0; // 模式1的标识值…

互联网扭蛋机小程序:打破传统扭蛋机的局限,提高销量

扭蛋机作为一种适合全年龄层的娱乐消费方式&#xff0c;深受人们的喜欢&#xff0c;通过一个具有神秘性的商品给大家带来欢乐。近几年&#xff0c;扭蛋机在我国的发展非常迅速&#xff0c;市场规模在不断上升。 经过市场的发展&#xff0c;淘宝线上扭蛋机小程序开始流行起来。…

个人网站的SEO优化系列——如何实现搜索引擎的收录

如果你自己做了一个网站&#xff0c;并且想让更多的人知道你的网站&#xff0c;那么无非就是两种途径 一、自己进行宣传&#xff0c;或者花钱宣传 二、使用搜索引擎的自然流量 而如果搜索引擎都没有收录你的站点&#xff0c;别说是自然流量&#xff0c;就算是使用特定语句【sit…