模式识别基于 Hough变换视频车道线检测matlab源码
Posted 博主QQ2449341593
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模式识别基于 Hough变换视频车道线检测matlab源码相关的知识,希望对你有一定的参考价值。
一、简介
1 车道线检测算法设计
一般道路主要由直道和弯道两部分构成,故车道线也相应的分为直车道线和弯曲车道线两种类型,本节首先对道路图像划定感兴趣区以提高运算效率,然后针对两种不同类型的车道线选取不同的检测方法。对于直车道线,利用Hough变换进行直线的提取,筛选并绘制出离车辆最近的两条直车道线;而对于弯曲车道线,则通过最小二乘法利用抛物线模型进行曲线拟合,并根据抛物线二次项系数判别弯道转向。
2 确定感兴趣区
一般车载摄像机采集到的道路图像可划分为天空、路面和周围景物,通过对道路图像进行分析很容易发现车道线主要分布于整个道路图像的下方区域,上方其余区域以及道路区域两侧是天空、树木等非路面区域。为了进一步缩小搜索范围,降低算法复杂度,增强车道线检测的实时性和精确性,应准确进行感兴趣区的定位,故需确定包含车道线等有效信息的区域边界。
3 基于Hough变换的直车道线检测
Hough变换是图像处理中几何特征提取最基本的算法之一,由Paul Hough于1962年提出,后由Richard Duda和Peter Hart于1972年推广使用。Hough变换通过将图像空间的参数映射到参数空间,并结合一种投票算法来检测具有特定形状的物体。Hough变换是目前直线车道检测应用最广的方法之一,鲁棒性好、抗干扰能力强,对断裂或者遮挡的车道线也能够很好的将其检测出来。
4 Hough变换原理
Hough变换的工作原理是利用图像空间的点和参数空间的线之间存在的对偶关系,将图像空间的问题转化到参数空间来解决。
5 Hough 变换的具体实现步骤如下:
(1) 建立一个参数(λ,θ) 空间的二维的数组,该数组相当于一个累加器。
(2) 顺序搜索图像中所有目标(黑色)像素,对于每一个目标像素,在参数空间中根据式(3)找到对应位置,然后在累加器的对应位置加 1。
(3) 求出参数空间(累加器)中最大值,其位置为(λ’,θ’)。
(4) 通过参数空间位置(λ’,θ’) ,根据式(3)找到图像空间中相对应的直线参数。
二、源代码
%% 初始化
% 使用这些来初始化下部分代码的一些变量和系统对象
DrawPoly = 1; % 设置为0以绘制直线
NumRows = 120; % 要处理的视频区的行数(视图下部)
MaxLaneNum = 20; % 跟踪库中保存的最大车道数目
ExpLaneNum = 2; % 当前视频帧中需要检测的最大车道数目
Rep_ref = zeros(2, MaxLaneNum); % 存储的车道线
Count_ref = zeros(1, MaxLaneNum); % 车道线计数
TrackThreshold = 75; % 在2帧视频之间车道区域允许的最大变动距离
LaneColors = single([0 0 0;1 1 0; 1 1 0; 1 1 1;1 1 1]);
% 可以判定当前车道所需的最少帧数,即:5帧视频内未检测到偏离当前车道,则显示车道提示文本
frameFound = 5;
% 车道标记有效的最多帧数,即:车道提示文本最多保持20个帧的时长
frameLost = 20;
% 选择与原点距离为:35:45 (从1开始编号: 415:424)之间的直线
startIdxRho_R = 415;
NumRhos_R = 11;
% 选择斜率为:-90:-70deg (从1开始编号:: 1:21)之间的直线
startIdxTheta_R = 1;
NumThetas_R = 21;
% 选择与原点距离为:379:415 (从1开始编号:: 1:36)之间的直线
startIdxRho_L = 380;
NumRhos_L = 36;
% 对于斜率为:55:85deg (从1开始编号:: 146:176)的直线
startIdxTheta_L = 146;
NumThetas_L = 21;
% 显示车道线的偏移值
offset = int32([0, NumRows, 0, NumRows]);
%%
% 创建一个 |VideoFileReader| 系统对象以从文件读取视频
hVideoSrc = vision.VideoFileReader('viplanedeparture.avi');
%%
% 创建一个 |HoughLines| 系统对象以检测黄白线的笛卡尔坐标
hHoughLines1 = vision.HoughLines('SineComputation', 'Trigonometric function'); % H
hHoughLines3 = vision.HoughLines('SineComputation', 'Trigonometric function');
%%
% 定义插入的车道偏离时的警告文本参数。
warnText = {sprintf('Right\\n Departure'), '', sprintf(' Left\\n Departure')};
warnTextLoc = [120 170;-1 -1; 2 170];
%%
% 定义插入的指定车道标记颜色/类型的文本参数
lineText = {'', ...
sprintf('Yellow\\nBroken'), sprintf('Yellow\\nSolid'), ...
sprintf('White\\nBroken'), sprintf('White\\nSolid')};
%%
%创建一个 |VideoPlayer| 系统对象以输出显示视频
myVideoOut = vision.VideoPlayer;
%%
% 初始化在视频流循环处理中使用到的变量
Frame = 0;
NumNormalDriving = 0;
OutMsg = int8(-1);
OutMsgPre = OutMsg;
Broken = false;
%% 视频流循环处理
% 创建一个循环过程来对给定视频进行车道线检测
% 该循环使用之前初始化的系统对象
warningTextColors = {[1 0 0], [1 0 0], [0 0 0], [0 0 0]};
while ~isDone(hVideoSrc)
RGB = step(hVideoSrc);
% 选择输入视频的下部(限制视野)
Imlow = RGB(NumRows+1:end, :, :);
% 边缘检测和Hough变换
Imlow = rgb2gray(Imlow); % Convert RGB to intensity
I = imfilter(Imlow, [-1 0 1], 'replicate','corr'); %imfilter函数:对任意类型数组或多维图像进行滤波
三、运行结果
完整代码咨询QQ1575304183
以上是关于模式识别基于 Hough变换视频车道线检测matlab源码的主要内容,如果未能解决你的问题,请参考以下文章
车道线识别基于matlab hough变换道路检测直线检测含Matlab源码 2074期
车道线识别基于matlab hough变换道路检测直线检测含Matlab源码 2074期