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

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


目录

一、项目背景

二、项目功能

三、代码拆解

[1. 导入所需的库](#1. 导入所需的库)

[2. 读取输入图像](#2. 读取输入图像)

[3. 定义颜色阈值范围](#3. 定义颜色阈值范围)

[4. 转换颜色空间](#4. 转换颜色空间)

[5. 创建颜色掩膜](#5. 创建颜色掩膜)

[6. 查找轮廓](#6. 查找轮廓)

[7. 检测红色信号灯](#7. 检测红色信号灯)

[8. 检测绿色信号灯](#8. 检测绿色信号灯)

[9. 显示结果](#9. 显示结果)

四、结果展示

五、完整代码

六、总结


一、项目背景

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


二、项目功能

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

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

三、代码拆解

1. 导入所需的库

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

python 复制代码
import cv2
import numpy as np

2. 读取输入图像

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

python 复制代码
img = cv2.imread("light1.png")

3. 定义颜色阈值范围

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

python 复制代码
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 颜色空间,以便更好地识别颜色。

python 复制代码
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

5. 创建颜色掩膜

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

python 复制代码
mask_red = cv2.inRange(img_hsv, minRed, maxRed)  
mask_green = cv2.inRange(img_hsv, minGreen, maxGreen)

6. 查找轮廓

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

python 复制代码
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()函数确定轮廓的边界框,并根据框的大小判断是否为有效的信号灯区域,最后在输入图像上绘制相应的矩形框和文字标签。

python 复制代码
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. 检测绿色信号灯

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

python 复制代码
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()函数控制图像显示窗口的关闭。

python 复制代码
cv2.imshow('res', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、结果展示


五、完整代码

python 复制代码
#!/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()

六、总结

注意事项

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

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

相关推荐
NAGNIP8 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab9 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab9 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP13 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年13 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼13 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS13 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区14 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈14 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang15 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx