当前位置: 首页 > news >正文

基于Matlab的车道线检测系统 (文末有代码获取链接)【含Matlab源码 MX_001期】

运行环境:Matlab2014b

部分代码:

%% 视频流循环处理
% 创建一个循环过程来对给定视频进行车道线检测
% 该循环使用之前初始化的系统对象
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 intensityI = imfilter(Imlow, [-1 0 1], 'replicate','corr'); %imfilter函数:对任意类型数组或多维图像进行滤波% 设置饱和值为0到1之间I(I < 0) = 0;I(I > 1) = 1;th = multithresh(I); % 计算门槛[H, Theta, Rho] = hough(I > th);% 将角度制变量Theta转换成弧度制Theta = Theta * pi / 180;% 峰值检测H1 = H;% 删除H中满足下列条件的矩阵: theta < -78 deg and theta >= 78 degH1(:, 1:12) = 0;H1(:, end-12:end) = 0;Idx1 = houghpeaks(H1, ExpLaneNum, 'NHoodSize', [301 81], 'Threshold', 1);Count1 = size(Idx1,1);% 根据峰值来选择Rhos和ThetasLine = [Rho(Idx1(:, 1)); Theta(Idx1(:, 2))];Enable = [ones(1,Count1) zeros(1, ExpLaneNum-Count1)];% 跟踪一组标记了的车道线[Rep_ref, Count_ref] = videolanematching(Rep_ref, Count_ref, ...MaxLaneNum, ExpLaneNum, Enable, Line, ...TrackThreshold, frameFound+frameLost);% 将极值点转换到笛卡尔坐标系Pts = step(hHoughLines1, Rep_ref(2,:), Rep_ref(1,:), Imlow);% 检测是否有向左或向右的车道偏离[TwoValidLanes, NumNormalDriving, TwoLanes, OutMsg] = ...videodeparturewarning(Pts, Imlow, MaxLaneNum, Count_ref, ...NumNormalDriving, OutMsg);% 输出信息的含义: % 0 = 向右离开当前车道% 1 = 正常驾驶% 2 = 向左离开当前车道% 检测车道线的颜色和类别YCbCr  = rgb2ycbcr(double(RGB(NumRows+1:240, :, :)));ColorAndTypeIdx = videodetectcolorandtype(TwoLanes, YCbCr);% 变量ColorAndTypeIdx的含义:% 无效的颜色或类别 = int8(0); % 黄虚线 = int8(1);% 黄实线 = int8(2);  % 白虚线 = int8(3);% 白实线 = int8(4).% 输出Frame = Frame + 1;if Frame >= 5TwoLanes1 = TwoLanes + [offset; offset]';if DrawPoly && TwoValidLanesif TwoLanes(4,1) >= 239Templ = TwoLanes1(3:4, 1);elseTempl = [0 239]';endif TwoLanes(4,2) >= 239Tempr = TwoLanes1(3:4, 2);elseTempr = [359 239]';endPts_poly = [TwoLanes1(:,1); Templ; Tempr; ...TwoLanes1(3:4,2); TwoLanes1(1:2,2)];% 在车道区域绘制多边形RGB = insertShape(RGB,'FilledPolygon',Pts_poly.',...'Color',[0 1 1],'Opacity',0.2);            end% 绘制车道线RGB = insertShape(RGB,'Line',TwoLanes1',...'Color',{'yellow','magenta'});% 插入车道变更警告文本 (空文本不会被绘制)txt = warnText{OutMsg+1};txtLoc = warnTextLoc(OutMsg+1, :);txtColor = single(warningTextColors{mod(Frame-1,4)+1});RGB = insertText(RGB,txtLoc,txt,'TextColor', txtColor, ...'FontSize',20, 'BoxOpacity', 0);% 插入描述车道线的颜色和种类信息的文本for ii=1:2% 空文本不会被绘制txtLoc = TwoLanes1([1 2], ii)' + int32([0 -35]);lineTxt = lineText{ColorAndTypeIdx(ii)};txtColor = LaneColors(ColorAndTypeIdx(ii), :);RGB = insertText(RGB,txtLoc,lineTxt,'TextColor',txtColor, ...'FontSize',14, 'BoxOpacity', 0);end% 如果有必要,绘制第三条车道线if OutMsgPre ~= OutMsgColorType = ColorAndTypeIdx(2-(OutMsg == 2));Broken    = ColorType == 2 || ColorType == 4;endShowThirdLane = Broken && (OutMsg~=1);if ShowThirdLaneif OutMsg == 0% 寻找位于右边的第三条车道线Idx2 = houghpeaks(H(startIdxRho_R:startIdxRho_R+NumRhos_R-1, ...startIdxTheta_R:startIdxTheta_R+NumThetas_R-1), ...'NHoodSize', [7 7], 'Threshold', 1);Rhor = Rho(Idx2(:,1) + startIdxRho_R);Thetar = Theta(Idx2(:,2) + startIdxTheta_R);ThirdLane = step(hHoughLines3, Thetar, Rhor, Imlow);else% 寻找位于左边的第三条车道线Idx3 = houghpeaks(H(startIdxRho_L:startIdxRho_L+NumRhos_L-1 , ...startIdxTheta_L:startIdxTheta_L+NumThetas_L-1),...'NHoodSize', [7 7], 'Threshold', 1);Rhol = Rho(Idx3(:,1) + startIdxRho_L);Thetal = Theta(Idx3(:,2) + startIdxTheta_L);ThirdLane = step(hHoughLines3, Thetal, Rhol, Imlow);endOutThirdLane = videoexclude3rdlane(ThirdLane, ShowThirdLane,...TwoLanes, TwoValidLanes, YCbCr);  OutThirdLane = OutThirdLane(:) + offset(:);RGB = insertShape(RGB,'Line',OutThirdLane.','Color','green');           endendOutMsgPre = OutMsg;step(myVideoOut, RGB);    % 显示视频
end

运行截图:

代码获取链接:基于Matlab的车道线检测系统

相关文章:

  • C# WPF编程基础
  • 外汇天眼:风险预警!以下平台监管牌照被撤销!
  • 2024年5月22日 (周三) 叶子游戏新闻
  • 国产数据库替代加速 助力数字中国建设
  • firewalld
  • 小小字符串竟然如此嚣张 —— 聊聊 Java 的 String
  • 四川景源畅信:新人做抖店的成本很高吗?
  • C++容器之位集(std::bitset)
  • 3步找回丢失数据,EasyRecovery让数据恢复如此简单!
  • 骆驼大赛
  • Python燃气轮机汽车钢棒整流电路控制图统计模型过程潜力分析
  • Python 机器学习 基础 之 模型评估与改进 【评估指标与评分】的简单说明
  • Flutter 中的 TabBarView 小部件:全面指南
  • FPGA DMA技术分享(赋能高速数据处理的新动力介绍篇)
  • 简单得阴影引导实现
  • Elasticsearch 参考指南(升级前重新索引)
  • emacs初体验
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Vue 动态创建 component
  • win10下安装mysql5.7
  • 闭包--闭包作用之保存(一)
  • 码农张的Bug人生 - 初来乍到
  • 前嗅ForeSpider中数据浏览界面介绍
  • 想写好前端,先练好内功
  • 优化 Vue 项目编译文件大小
  • 7行Python代码的人脸识别
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​人工智能书单(数学基础篇)
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • $.ajax,axios,fetch三种ajax请求的区别
  • (09)Hive——CTE 公共表达式
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (十一)c52学习之旅-动态数码管
  • (转)EOS中账户、钱包和密钥的关系
  • (转)linux下的时间函数使用
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET Reactor简单使用教程
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .NET中 MVC 工厂模式浅析
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • /tmp目录下出现system-private文件夹解决方法
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • [.NET]桃源网络硬盘 v7.4
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [Android Studio 权威教程]断点调试和高级调试
  • [C/C++]数据结构 深入挖掘环形链表问题
  • [CSS3备忘] transform animation 等
  • [dts]Device Tree机制
  • [Dxperience.8.*]报表预览控件PrintControl设置
  • [javaee基础] 常见的javaweb笔试选择题含答案
  • [JAVASE] 异常 与 SE阶段知识点补充