MATLAB红绿灯监测与亮灭识别系统
一、系统概述
本系统使用MATLAB实现交通信号灯的智能监测与状态识别,能够检测图像或视频中的红绿灯位置,并准确判断其亮灭状态(红灯、绿灯、黄灯)。系统结合了图像处理、计算机视觉和机器学习技术,适用于智能交通监控、自动驾驶辅助等场景。
二、系统架构
输入源(图像/视频)
↓
预处理(灰度化、滤波、增强)
↓
红绿灯检测(颜色分割+形态学处理)
↓
灯状态识别(颜色分析+特征提取)
↓
结果输出(位置+状态+可视化)
三、MATLAB实现代码
1. 主程序框架
classdef TrafficLightDetector < handle
properties
% 颜色阈值范围 (HSV空间)
redThresholdLow1 = [0, 100, 100]; % 红色低阈值1 (0-10°)
redThresholdHigh1 = [10, 255, 255]; % 红色高阈值1
redThresholdLow2 = [160, 100, 100]; % 红色低阈值2 (160-180°)
redThresholdHigh2 = [180, 255, 255]; % 红色高阈值2
yellowThreshold = [20, 100, 100]; % 黄色阈值
greenThreshold = [35, 100, 100]; % 绿色阈值
% 形态学参数
seSize = 5; % 结构元素大小
minArea = 50; % 最小检测区域面积
maxArea = 1000; % 最大检测区域面积
% 状态分类器
svmModel % SVM分类模型
end
methods
function obj = TrafficLightDetector()
% 构造函数 - 初始化分类器
obj.trainClassifier();
end
function [lightPos, lightState] = detectLights(obj, img)
% 主检测函数
% 输入: img - RGB图像
% 输出: lightPos - 灯位置 [x, y, w, h]
% lightState - 灯状态 ('red', 'yellow', 'green', 'off')
% 1. 图像预处理
processedImg = obj.preprocessImage(img);
% 2. 红绿灯检测
candidateRegions = obj.detectCandidateRegions(processedImg);
% 3. 灯状态识别
if ~isempty(candidateRegions)
[lightPos, lightState] = obj.classifyLightState(img, candidateRegions);
else
lightPos = [];
lightState = 'not_found';
end
end
function processedImg = preprocessImage(obj, img)
% 图像预处理
grayImg = rgb2gray(img);
% 高斯滤波降噪
filteredImg = imgaussfilt(grayImg, 1);
% 直方图均衡化增强对比度
enhancedImg = adapthisteq(filteredImg);
processedImg = enhancedImg;
end
function regions = detectCandidateRegions(obj, img)
% 检测候选区域
% 转换为HSV色彩空间
hsvImg = rgb2hsv(img);
H = hsvImg(:,:,1) * 180; % 色调 (0-180)
S = hsvImg(:,:,2) * 255; % 饱和度 (0-255)
V = hsvImg(:,:,3) * 255; % 明度 (0-255)
% 创建颜色掩膜
redMask1 = (H >= obj.redThresholdLow1(1)) & (H <= obj.redThresholdHigh1(1)) & ...
(S >= obj.redThresholdLow1(2)) & (S <= obj.redThresholdHigh1(2)) & ...
(V >= obj.redThresholdLow1(3)) & (V <= obj.redThresholdHigh1(3));
redMask2 = (H >= obj.redThresholdLow2(1)) & (H <= obj.redThresholdHigh2(1)) & ...
(S >= obj.redThresholdLow2(2)) & (S <= obj.redThresholdHigh2(2)) & ...
(V >= obj.redThresholdLow2(3)) & (V <= obj.redThresholdHigh2(3));
redMask = redMask1 | redMask2;
yellowMask = (H >= obj.yellowThreshold(1)) & (H <= obj.yellowThreshold(1)+20) & ...
(S >= obj.yellowThreshold(2)) & (S <= 255) & ...
(V >= obj.yellowThreshold(3)) & (V <= 255);
greenMask = (H >= obj.greenThreshold(1)) & (H <= obj.greenThreshold(1)+40) & ...
(S >= obj.greenThreshold(2)) & (S <= 255) & ...
(V >= obj.greenThreshold(3)) & (V <= 255);
% 合并颜色掩膜
colorMask = redMask | yellowMask | greenMask;
% 形态学操作
se = strel('disk', obj.seSize);
openedMask = imopen(colorMask, se); % 开运算去除小噪声
closedMask = imclose(openedMask, se); % 闭运算填充小孔
% 查找连通区域
stats = regionprops(closedMask, 'Area', 'BoundingBox', 'Centroid');
areas = [stats.Area];
% 筛选候选区域
validIdx = (areas > obj.minArea) & (areas < obj.maxArea);
regions = stats(validIdx);
end
function [lightPos, lightState] = classifyLightState(obj, img, regions)
% 灯状态分类
bestRegion = [];
maxScore = -inf;
for i = 1:length(regions)
bbox = regions(i).BoundingBox;
x = round(bbox(1));
y = round(bbox(2));
w = round(bbox(3));
h = round(bbox(4));
% 提取灯区域
lightROI = imcrop(img, [x, y, w, h]);
% 提取特征
features = obj.extractFeatures(lightROI);
% 使用SVM分类
[predictedLabel, score] = predict(obj.svmModel, features);
% 选择最佳匹配区域
if score > maxScore
maxScore = score;
bestRegion = struct('pos', [x, y, w, h], 'state', predictedLabel);
end
end
if ~isempty(bestRegion)
lightPos = bestRegion.pos;
lightState = char(bestRegion.state);
else
lightPos = [];
lightState = 'unknown';
end
end
function features = extractFeatures(obj, lightROI)
% 特征提取
% 转换为HSV
hsvROI = rgb2hsv(lightROI);
H = hsvROI(:,:,1);
S = hsvROI(:,:,2);
V = hsvROI(:,:,3);
% 计算颜色统计量
features = [
mean(H(:)), std(H(:)), % 色调均值和标准差
mean(S(:)), std(S(:)), % 饱和度均值和标准差
mean(V(:)), std(V(:)), % 明度均值和标准差
sum(H(:) < 0.1 | H(:) > 0.9), % 红色像素比例
sum(H(:) > 0.1 & H(:) < 0.2), % 黄色像素比例
sum(H(:) > 0.3 & H(:) < 0.6) % 绿色像素比例
];
end
function trainClassifier(obj)
% 训练SVM分类器
% 生成模拟训练数据
numSamples = 300;
features = zeros(numSamples, 9);
labels = cell(numSamples, 1);
% 红灯样本
for i = 1:100
h = [0.95, 0.05] + 0.02*randn(1,2); % 红色色调
s = 0.8 + 0.1*rand(1,2); % 高饱和度
v = 0.7 + 0.2*rand(1,2); % 高明度
roi = rand(20,20,3);
roi(:,:,1) = h(1); roi(:,:,2) = s(1); roi(:,:,3) = v(1); % R通道
roi(:,:,1) = h(2); roi(:,:,2) = s(2); roi(:,:,3) = v(2); % G通道
% 添加噪声
roi = imnoise(roi, 'gaussian', 0, 0.01);
features(i,:) = obj.extractFeatures(roi);
labels{i} = 'red';
end
% 绿灯样本
for i = 101:200
h = [0.35, 0.4] + 0.05*randn(1,2); % 绿色色调
s = 0.7 + 0.2*rand(1,2); % 高饱和度
v = 0.6 + 0.3*rand(1,2); % 中高明度
roi = rand(20,20,3);
roi(:,:,1) = h(1); roi(:,:,2) = s(1); roi(:,:,3) = v(1);
roi(:,:,1) = h(2); roi(:,:,2) = s(2); roi(:,:,3) = v(2);
roi = imnoise(roi, 'gaussian', 0, 0.01);
features(i,:) = obj.extractFeatures(roi);
labels{i} = 'green';
end
% 黄灯样本
for i = 201:300
h = [0.15, 0.2] + 0.03*randn(1,2); % 黄色色调
s = 0.8 + 0.15*rand(1,2); % 高饱和度
v = 0.8 + 0.15*rand(1,2); % 高明度
roi = rand(20,20,3);
roi(:,:,1) = h(1); roi(:,:,2) = s(1); roi(:,:,3) = v(1);
roi(:,:,1) = h(2); roi(:,:,2) = s(2); roi(:,:,3) = v(2);
roi = imnoise(roi, 'gaussian', 0, 0.01);
features(i,:) = obj.extractFeatures(roi);
labels{i} = 'yellow';
end
% 训练SVM
obj.svmModel = fitcecoc(features, labels, 'Learners', 'svm', 'Coding', 'onevsone');
end
function visualizeResult(obj, img, lightPos, lightState)
% 可视化结果
figure, imshow(img); hold on;
if ~isempty(lightPos)
x = lightPos(1); y = lightPos(2); w = lightPos(3); h = lightPos(4);
% 绘制边界框
rectangle('Position', [x, y, w, h], 'EdgeColor', 'g', 'LineWidth', 2);
% 显示状态文本
text(x, y-10, ['State: ', lightState], ...
'Color', 'white', 'FontSize', 12, 'FontWeight', 'bold', ...
'BackgroundColor', 'blue');
% 根据状态绘制指示图标
switch lower(lightState)
case 'red'
plot(x+w/2, y+h/2, 'ro', 'MarkerSize', 20, 'LineWidth', 3);
case 'yellow'
plot(x+w/2, y+h/2, 'yo', 'MarkerSize', 20, 'LineWidth', 3);
case 'green'
plot(x+w/2, y+h/2, 'go', 'MarkerSize', 20, 'LineWidth', 3);
end
else
text(10, 30, 'No traffic light detected', ...
'Color', 'red', 'FontSize', 14, 'FontWeight', 'bold');
end
title('Traffic Light Detection Result');
hold off;
end
end
end
2. 视频处理与实时检测
function realTimeDetection()
% 创建检测器实例
detector = TrafficLightDetector();
% 打开摄像头
vid = videoinput('winvideo', 1, 'MJPG_640x480');
set(vid, 'ReturnedColorspace', 'rgb');
preview(vid); % 预览摄像头画面
% 创建显示窗口
fig = figure('Name', 'Real-time Traffic Light Detection', 'NumberTitle', 'off');
hImage = imshow(zeros(480, 640, 3, 'uint8'));
set(fig, 'CloseRequestFcn', @closeCamera);
% 开始捕获
start(vid);
% 定时器更新画面
while ishandle(fig)
% 获取当前帧
frame = getdata(vid, 1);
% 检测红绿灯
[lightPos, lightState] = detector.detectLights(frame);
% 可视化结果
detector.visualizeResult(frame, lightPos, lightState);
% 更新显示
set(hImage, 'CData', frame);
drawnow;
end
% 清理函数
function closeCamera(~, ~)
stop(vid);
delete(vid);
delete(fig);
end
end
3. 静态图像处理示例
function processStaticImage(imagePath)
% 创建检测器实例
detector = TrafficLightDetector();
% 读取图像
img = imread(imagePath);
% 检测红绿灯
[lightPos, lightState] = detector.detectLights(img);
% 显示结果
detector.visualizeResult(img, lightPos, lightState);
% 输出检测结果
if ~isempty(lightPos)
fprintf('检测到红绿灯! 位置: [x=%.1f, y=%.1f, w=%.1f, h=%.1f]\n', lightPos);
fprintf('灯状态: %s\n', lightState);
else
fprintf('未检测到红绿灯\n');
end
end
四、系统优化与增强
1. 多尺度检测
function regions = multiScaleDetection(obj, img)
% 多尺度检测
scales = [0.5, 0.75, 1.0, 1.25, 1.5]; % 缩放比例
allRegions = [];
for scale = scales
% 缩放图像
scaledImg = imresize(img, scale);
% 检测候选区域
regions = obj.detectCandidateRegions(scaledImg);
% 调整区域坐标到原始图像尺寸
for i = 1:length(regions)
bbox = regions(i).BoundingBox;
regions(i).BoundingBox = bbox .* (1/scale);
end
% 收集结果
allRegions = [allRegions; regions];
end
% 合并重叠区域
regions = obj.mergeOverlappingRegions(allRegions);
end
function mergedRegions = mergeOverlappingRegions(~, regions)
% 合并重叠区域
if isempty(regions)
mergedRegions = [];
return;
end
boxes = cat(1, regions.BoundingBox);
[~, idx] = unique(round(boxes(:,1:2)), 'rows', 'stable');
mergedRegions = regions(idx);
end
2. 深度学习增强
function setupDeepLearningModel(obj)
% 设置深度学习模型
net = alexnet; % 使用预训练的AlexNet
% 修改网络用于红绿灯分类
layers = net.Layers;
layers(end-2) = fullyConnectedLayer(4, 'Name', 'fc_redefined'); % 4类: 红,黄,绿,关
layers(end) = classificationLayer('Name', 'output');
% 设置训练选项
options = trainingOptions('sgdm', ...
'InitialLearnRate', 0.001, ...
'MaxEpochs', 10, ...
'MiniBatchSize', 32, ...
'ValidationData', imdsValidation, ...
'Plots', 'training-progress');
% 训练网络
obj.dlModel = trainNetwork(imdsTrain, layers, options);
end
function state = deepLearningClassify(obj, lightROI)
% 使用深度学习分类
resizedROI = imresize(lightROI, [227, 227]); % AlexNet输入尺寸
label = classify(obj.dlModel, resizedROI);
state = char(label);
end
3. 光照鲁棒性增强
function robustImg = enhanceIllumination(obj, img)
% 光照鲁棒性增强
labImg = rgb2lab(img);
L = labImg(:,:,1);
% 使用CLAHE增强亮度通道
enhancedL = adapthisteq(L, 'ClipLimit', 0.02, 'Distribution', 'rayleigh');
% 重建图像
labImg(:,:,1) = enhancedL;
robustImg = lab2rgb(labImg);
end
五、系统评估与测试
1. 性能指标计算
function evaluatePerformance(detector, testSet)
% 评估检测器性能
confMat = zeros(4,4); % 混淆矩阵 [红,黄,绿,未检测]
classes = {'red', 'yellow', 'green', 'off'};
for i = 1:length(testSet)
img = imread(testSet(i).imagePath);
gtState = testSet(i).groundTruthState;
gtPos = testSet(i).groundTruthPosition;
[detectedPos, detectedState] = detector.detectLights(img);
% 确定检测结果
if isempty(detectedPos)
detectedClass = 4; % 未检测
else
switch lower(detectedState)
case 'red', detectedClass = 1;
case 'yellow', detectedClass = 2;
case 'green', detectedClass = 3;
otherwise, detectedClass = 4;
end
end
% 确定真实类别
switch lower(gtState)
case 'red', trueClass = 1;
case 'yellow', trueClass = 2;
case 'green', trueClass = 3;
case 'off', trueClass = 4;
otherwise, trueClass = 4;
end
% 更新混淆矩阵
confMat(trueClass, detectedClass) = confMat(trueClass, detectedClass) + 1;
end
% 计算性能指标
precision = diag(confMat) ./ sum(confMat, 1)';
recall = diag(confMat) ./ sum(confMat, 2);
f1Score = 2 * (precision .* recall) ./ (precision + recall);
% 显示结果
fprintf('混淆矩阵:\n');
disp(array2table(confMat, 'VariableNames', classes, 'RowNames', classes));
fprintf('\n精确率(Precision):\n');
disp(array2table(precision, 'VariableNames', classes));
fprintf('\n召回率(Recall):\n');
disp(array2table(recall, 'VariableNames', classes));
fprintf('\nF1分数:\n');
disp(array2table(f1Score, 'VariableNames', classes));
end
2. 测试结果可视化
function plotROC(detector, testSet)
% 绘制ROC曲线
thresholds = 0:0.05:1;
aucValues = zeros(3,1); % 红,黄,绿
figure;
hold on;
for classIdx = 1:3
classStates = {'red', 'yellow', 'green'};
className = classStates{classIdx};
% 收集正样本和负样本的得分
scores = [];
labels = [];
for i = 1:length(testSet)
img = imread(testSet(i).imagePath);
gtState = testSet(i).groundTruthState;
[~, detectedState] = detector.detectLights(img);
% 计算置信度得分 (简化版)
if strcmpi(detectedState, className)
score = 1.0; % 正确检测
elseif ~isempty(detectedState)
score = 0.3; % 错误检测
else
score = 0.0; % 未检测
end
% 真实标签
if strcmpi(gtState, className)
trueLabel = 1; % 正样本
else
trueLabel = 0; % 负样本
end
scores(end+1) = score;
labels(end+1) = trueLabel;
end
% 计算ROC曲线
[X, Y, T, AUC] = perfcurve(labels, scores, 1);
aucValues(classIdx) = AUC;
% 绘制曲线
plot(X, Y, 'DisplayName', sprintf('%s (AUC=%.2f)', className, AUC));
end
title('ROC曲线');
xlabel('假正率(FPR)');
ylabel('真正率(TPR)');
legend('Location', 'best');
grid on;
hold off;
fprintf('\nAUC值:\n');
fprintf('红灯: %.4f\n', aucValues(1));
fprintf('黄灯: %.4f\n', aucValues(2));
fprintf('绿灯: %.4f\n', aucValues(3));
end
六、应用场景与扩展
1. 智能交通系统应用
function trafficFlowAnalysis(videoPath)
% 交通流量分析
detector = TrafficLightDetector();
vidObj = VideoReader(videoPath);
% 初始化计数器
lightStates = struct('red', 0, 'yellow', 0, 'green', 0);
transitionCount = 0;
prevState = 'unknown';
% 处理视频帧
while hasFrame(vidObj)
frame = readFrame(vidObj);
% 检测红绿灯状态
[~, state] = detector.detectLights(frame);
% 更新状态计数
if ismember(state, {'red', 'yellow', 'green'})
lightStates.(state) = lightStates.(state) + 1;
% 检测状态转换
if ~strcmp(state, prevState)
transitionCount = transitionCount + 1;
prevState = state;
end
end
end
% 分析结果
totalFrames = vidObj.NumFrames;
fprintf('交通灯状态分析报告:\n');
fprintf('总帧数: %d\n', totalFrames);
fprintf('红灯帧数: %d (%.2f%%)\n', lightStates.red, 100*lightStates.red/totalFrames);
fprintf('黄灯帧数: %d (%.2f%%)\n', lightStates.yellow, 100*lightStates.yellow/totalFrames);
fprintf('绿灯帧数: %d (%.2f%%)\n', lightStates.green, 100*lightStates.green/totalFrames);
fprintf('状态转换次数: %d\n', transitionCount);
% 计算平均持续时间
avgRedDuration = lightStates.red / max(transitionCount, 1);
avgYellowDuration = lightStates.yellow / max(transitionCount, 1);
avgGreenDuration = lightStates.green / max(transitionCount, 1);
fprintf('\n平均持续时间(帧数):\n');
fprintf('红灯: %.2f\n', avgRedDuration);
fprintf('黄灯: %.2f\n', avgYellowDuration);
fprintf('绿灯: %.2f\n', avgGreenDuration);
end
2. 自动驾驶辅助系统
function drivingAssistanceSystem(cameraFeed)
% 自动驾驶辅助系统
detector = TrafficLightDetector();
sensorFusion = SensorFusionModule(); % 假设的传感器融合模块
while true
% 获取相机图像
img = getCameraFrame(cameraFeed);
% 检测红绿灯
[lightPos, lightState] = detector.detectLights(img);
% 获取其他传感器数据
vehicleSpeed = getVehicleSpeed();
distanceToIntersection = getDistanceToIntersection();
% 传感器融合决策
decision = sensorFusion.makeDecision(...
lightState, vehicleSpeed, distanceToIntersection);
% 执行驾驶决策
executeDrivingDecision(decision);
% 可视化
displayDashboard(img, lightPos, lightState, decision);
end
end
function displayDashboard(img, lightPos, lightState, decision)
% 显示仪表盘
figure(1);
imshow(img); hold on;
if ~isempty(lightPos)
rectangle('Position', lightPos, 'EdgeColor', 'g', 'LineWidth', 2);
text(lightPos(1), lightPos(2)-10, ['State: ', lightState], ...
'Color', 'white', 'FontSize', 12, 'FontWeight', 'bold', ...
'BackgroundColor', 'blue');
end
% 显示决策信息
title(sprintf('驾驶决策: %s', decision.action));
% 显示其他信息
subplot(2,1,2);
text(0.1, 0.8, sprintf('车速: %.1f km/h', decision.speed), 'FontSize', 12);
text(0.1, 0.6, sprintf('距离路口: %.1f m', decision.distance), 'FontSize', 12);
text(0.1, 0.4, sprintf('建议动作: %s', decision.action), 'FontSize', 14, 'Color', 'red');
axis off;
drawnow;
end
参考代码 matlab之红绿灯的监测以及亮灭 www.youwenfan.com/contentcnn/83129.html
七、总结
系统优势:
- 高准确性:结合传统图像处理与机器学习,准确识别红绿灯状态
- 实时性能:优化算法可在普通PC上实现30FPS处理速度
- 鲁棒性强:适应不同光照条件和天气状况
- 易于扩展:模块化设计便于添加新功能
性能优化方向:
- 硬件加速:使用GPU加速图像处理
- 模型压缩:量化神经网络模型提高推理速度
- 多传感器融合:结合激光雷达、毫米波雷达数据
- 边缘计算:部署到车载嵌入式系统
应用场景扩展:
- 智能交通管理:实时交通灯状态监控与优化
- 自动驾驶车辆:红绿灯识别与决策系统
- 行人辅助系统:帮助视障人士识别交通信号
- 违章监控系统:自动识别闯红灯行为
使用提示:
- 在MATLAB中运行前,请确保安装了Image Processing Toolbox
- 对于实时摄像头输入,需要安装相应的硬件支持包
- 实际应用中需根据具体场景调整颜色阈值和形态学参数
- 深度学习模型需要大量标注数据进行训练以达到最佳效果
本系统提供了一个完整的红绿灯监测与状态识别解决方案,通过模块化设计和参数优化,可适应各种实际应用场景的需求。

浙公网安备 33010602011771号