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

2024-04-23 07:12

本文主要是介绍计算机视觉 | 交通信号灯状态的检测和识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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:  continuecv2.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:  continuecv2.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 npimg = 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的框continuecv2.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的框continuecv2.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.chinasem.cn/article/928117

相关文章

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c