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

news2024/12/23 17:39:11

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

六、总结

注意事项

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目大集成

一 keeplived 高可用 192.168.11.11nginx keeplived192.168.11.12nginx keeplived 两台均编译安装服务器 1 主服务器修改文件&#xff1a; 2 备服务器修改文本 scp keepalived.conf 192.168.11.12:/etc/keepalived/ 3 给主服务器添加虚拟ip ifconfig ens33:0 192.168…

React.js 3D开发快速入门

如果你对 3D 图形的可能性着迷&#xff0c;但发现从头开始创建 3D 模型的想法是不可能的 - 不用担心&#xff01; Three.js 是一个强大的 JavaScript 库&#xff0c;它可以帮助我们轻松地将现有的 3D 模型集成到 React 应用程序中。因此&#xff0c;在本文中&#xff0c;我将深…

DHCP服务器配置故障转移后显示红色箭头、与伙伴服务器失去联系的解决方案

一、遇到的故障现象&#xff1a; &#xff08;主DHCP服务器与备用DHCP服务器连通性正常&#xff0c;在故障转移选项卡上却显示与伙伴失去联系、伙伴关闭&#xff0c;且ipv4协议旁边显示一个红色的小箭头&#xff09;&#xff0c;正常情况下是绿色 &#xff08;一&#xff09;…

Jenkins CI/CD 持续集成专题二 Jenkins 相关问题汇总

一 问题一 pod [!] Unknown command: package 1.1 如果没有安装过cocoapods-packager&#xff0c;安装cocoapods-packager&#xff0c;sudo gem install cocoapods-packager 1.2 如果已经安装cocoapods-packager&#xff0c;还是出现上面的错误&#xff0c;有可能是pod的安…

通过创新的MoE架构插件缓解大型语言模型的世界知识遗忘问题

在人工智能领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;的微调是提升模型在特定任务上性能的关键步骤。然而&#xff0c;一个挑战在于&#xff0c;当引入大量微调数据时&#xff0c;模型可能会遗忘其在预训练阶段学到的世界知识&#xff0c;这被称为“世界知识遗忘…

Valentina Studio Pro for Mac:强大的数据库管理工具

Valentina Studio Pro for Mac是一款功能全面、操作高效的数据库管理工具&#xff0c;专为Mac用户设计&#xff0c;旨在帮助用户轻松管理各种类型的数据库。 Valentina Studio Pro for Mac v13.10激活版下载 该软件拥有直观的用户界面&#xff0c;使得数据库管理变得简单直观。…

JS - 以工厂模式和原型模式方式建造对象、JS的垃级回收机制、数组的使用

创建对象的方式 使用工厂方法来建造对象 在JS中我们可以通过以下方式进行创建对象&#xff1a; var obj {name:"孙悟空",age:18,gender:"男",sayName:function(){alert(this.name);}};var obj2 {name:"猪八戒",age:28,gender:"男",…

学习ArkTS -- 状态管理

装饰器 State 在声明式UI中&#xff0c;是以状态驱动试图更新&#xff1a; 状态&#xff08;State&#xff09;&#xff1a;指驱动视图更新的数据&#xff08;被装饰器标记的变量&#xff09; 视图&#xff08;View&#xff09;&#xff1a;基于UI描述渲染得到用户界面 说明…

Next.js+React+Node系统实战,搞定SSR服务器渲染

Next.jsReactNode系统实战&#xff0c;搞定SSR服务器渲染 Next.js React Node.js 实战&#xff1a;实现服务器端渲染&#xff08;SSR&#xff09; 项目概述 在这个项目中&#xff0c;我们将探讨如何使用 Next.js、React 和 Node.js 来构建一个服务器渲染的 web 应用程序。通…

无人驾驶 自动驾驶汽车 环境感知 精准定位 决策与规划 控制与执行 高精地图与车联网V2X 深度神经网络学习 深度强化学习 Apollo

无人驾驶 百度apollo课程 1-5 百度apollo课程 6-8 七月在线 无人驾驶系列知识入门到提高 当今,自动驾驶技术已经成为整个汽车产业的最新发展方向。应用自动驾驶技术可以全面提升汽车驾驶的安全性、舒适性,满足更高层次的市场需求等。自动驾驶技术得益于人工智能技术的应用…

unity读写本地excel_2024.4.22

using System.Collections; using System.Collections.Generic; using UnityEngine; using OfficeOpenXml; using System.IO; using Excel; using System.Data; using System; /// <summary> /// https://blog.csdn.net/Xz616/article/details/128893023 /// Unity3D操作…

【入门篇】本章包括创建云项目、数据库的使用、云存储管理、云函数的基本使用、实战举例(小程序之云函数开发入门到使用发布上线实操)

云函数 云函数相当于服务器接口的概念,它并属于小程序端代码。它是以函数的形式运行后端代码来响应事件以及调用其他服务。运行环境是Node.js。 一、基创建云函数项目 打开微信开发者工具: 打开微信开发者工具,并登录你的微信开发者账号。 创建项目: 如果还没有创建项目,你…

给字符串添加加粗标签(AC自动机+Python)

可以暴力解决&#xff0c;但是为了锻炼一下ac自动机的编程&#xff0c;我们使用ac自动机。 ac自动机主要维护两个列表&#xff0c;一个列表ch&#xff0c;ch[f][idx]表示从父节点f向idx这个方向走&#xff0c;走到的节点。另一个列表nex&#xff0c;nex[i]表示节点i回跳边的节…

机器学习 -- 分类问题

场景 探讨了一个回归任务——预测住房价格&#xff0c;用到了线性回归、决策树以及随机森林等各种算法。本次中我们将把注意力转向分类系统。我们曾经对MNIST进行了分类任务&#xff0c;这次我们重新回到这里&#xff0c;细致的再来一次。 开始 获取数据 Scikit-Learn提供了…

BFS解决FloodFill算法:(Leetcode:200. 岛屿数量)

题目链接&#xff1a;200. 岛屿数量 - 力扣&#xff08;LeetCode&#xff09; 本题由于没有给出开始搜索的位置&#xff0c;所以每一个位置都要进行一次广度优先搜索 另外为了不修改原数组数据&#xff0c;需要设置一个bool类型的二维数组vis来判断某个位置是否被搜索过 cl…

负载均衡的原理及算法

一、定义 负载均衡&#xff08;Load Balancing&#xff09;是一种计算机网络和服务器管理技术&#xff0c;旨在分配网络流量、请求或工作负载到多个服务器或资源&#xff0c;以确保这些服务器能够高效、均匀地处理负载&#xff0c;并且能够提供更高的性能、可用性和可扩展性。…

【链表】Leetcode 两两交换链表中的结点

题目讲解 24. 两两交换链表中的节点 算法讲解 只需要模拟这个过程就行了&#xff0c;但是需要注意空指针的问题&#xff0c;特别是nnext指针 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), ne…

“AI 程序员入职系列”第二弹:如何利用通义灵码光速改写项目编程语言?

通义灵码入职阿里云云原生团队后&#xff0c;已经展示过 Ta 生成单元测试和自动生成代码的强大实力。今天&#xff0c;阿里云后端工程师云徊将从项目开发的实际需求出发&#xff0c;演示通义灵码在开发工作中可提供的帮助。 通义灵码在 Git 开发项目中起到了哪些作用&#xff…

IntelliJ IDEA - Lombok supports: OpenJDK javac, ECJ

问题描述 java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled.Your processor is: com.sun.proxy.$Proxy26Lombok supports: OpenJDK javac, ECJ 解决方案 在 IDEA 设置中 File -> Settings 中找到配置如下&#xff1…

医学影像增强:空间域方法与频域方法等

医学影像图像增强是一项关键技术,旨在改善图像质量,以便更好地进行疾病诊断和评估。增强方法通常分为两大类:空间域方法和频域方法。 一、 空间域方法 空间域方法涉及直接对医学影像的像素值进行操作,以提高图像的视觉质量。以下是一些常用的空间域方法: 对比度调整:通过…