
【车道线检测】基于matlab Hough变换视频车道线检测 【含Matlab源码 274期】
发布日期:2021-05-07 13:13:43
浏览次数:22
分类:精选文章
本文共 2908 字,大约阅读时间需要 9 分钟。
一、简介
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'); % Hough变化介绍:https://www.cnblogs.com/lancer2015/p/6852488.htmlhHoughLines3 = 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函数:对任意类型数组或多维图像进行滤波
三、运行结果
四、备注
完整代码或代写添加QQ 1564658423
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月14日 13时26分38秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux 磁盘管理(df fu fdisk mkfs mount)
2021-05-09
第一类曲面积分
2021-05-09
MySQL锁机制
2021-05-09
Go 数组&切片
2021-05-09
Go 文件操作
2021-05-09
老Python总结的字典相关知识
2021-05-09
vue 不常见操作
2021-05-09
jQuery的事件绑定与触发 - 学习笔记
2021-05-09
Python处理接口测试的签名
2021-05-09
测试流程规范--测试报告模板
2021-05-09
Linux上TCP的几个内核参数调优
2021-05-09
记一次讲故事机器人的开发-我有故事,让机器人来读
2021-05-09
高德算法工程一体化实践和思考
2021-05-09
判断一个数是否是2的幂
2021-05-09
js 闭包(新)
2021-05-09
vscode 编辑python 如何格式化
2021-05-09
seo 回忆录百度基本概念(一)
2021-05-09
重新整理数据结构与算法(c#)—— 算法套路二分法[二十四]
2021-05-09
用ThreadLocal来优化下代码吧
2021-05-09