%% 初始化

% 使用這些來初始化下部分代碼的一些變量和系統對象

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.mp4');

%%

% 創建一個 |HoughLines| 系統對象以檢測黃白線的笛卡爾坐標

hHoughLines1 = vision.HoughLines('SineComputation', 'Trigonometric function');

hHoughLines3 = vision.HoughLines('SineComputation', 'Trigonometric function');

%%

% 定義插入的車道偏離時的警告文本參數。

warnText = {sprintf('Right\nDeparture'), '', 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');

% 設置飽和值為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 deg

H1(:, 1:12) = 0;

H1(:, end-12:end) = 0;

Idx1 = houghpeaks(H1, ExpLaneNum, 'NHoodSize', [301 81], 'Threshold', 1);

Count1 = size(Idx1,1);

% 根據峰值來選擇Rhos和Thetas

Line = [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 >= 5

TwoLanes1 = TwoLanes + [offset; offset]';

if DrawPoly && TwoValidLanes

if TwoLanes(4,1) >= 239

Templ = TwoLanes1(3:4, 1);

else

Templ = [0 239]';

end

if TwoLanes(4,2) >= 239

Tempr = TwoLanes1(3:4, 2);

else

Tempr = [359 239]';

end

Pts_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 ~= OutMsg

ColorType = ColorAndTypeIdx(2-(OutMsg == 2));

Broken = ColorType == 2 || ColorType == 4;

end

ShowThirdLane = Broken && (OutMsg~=1);

if ShowThirdLane

if 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);

end

OutThirdLane = videoexclude3rdlane(ThirdLane, ShowThirdLane,...

TwoLanes, TwoValidLanes, YCbCr);

OutThirdLane = OutThirdLane(:) + offset(:);

RGB = insertShape(RGB,'Line',OutThirdLane.','Color','green');

end

end

OutMsgPre = OutMsg;

step(myVideoOut, RGB); % 顯示視頻

end

%% 釋放資源

release(hVideoSrc);

%% 總結

% 在樣例視頻中,你可以看到【車道】、【車道線】以及【離開當前車道的方式】被檢測到的過程

%% 附錄

% 在這個例子中使用到的函數:

% *

% *

% *

% *

% 顯示結束提示信息

displayEndOfDemoMessage(mfilename)

matlab thetal,基於matlab的車道和車道線檢測樣例相关推荐

  1. python笑傲江湖统计字数_基於Python的tf-idf算法实现:以《笑傲江湖》为例

    连结Jasonnor/tf-idf-python​github.com 简介 tf-idf(term frequency-inverse document frequency)是一种用於信息检索与文字 ...

  2. matlab径向基网络,MATLAB——径向基网络拟合曲线和分类

    1.广义RBF P=:.:; rand('state',pi); %指定状态,产生相同的随机数 T=sin(*P)+rand(,length(P)); % 给正弦函数加噪声 plot(P,T,'o') ...

  3. 用matlab雷达基数据,matlab探地雷达数据处理软件

    [实例简介] 一款利用matlab编写的探地雷达数据处理系统,开源免费.支持seg-y.su.dzt等格式的输入数据输入,能够进行增益显示.静校正处理.滤波去噪.偏移成像等常用的数据处理. [实例截图 ...

  4. matlab fir工具箱,用MATLAB信號處理工具箱進行FIR濾波器設計的三種方法

    摘  要 介紹了利用MATLAB信號處理工具箱進行FIR濾波器設計的三種方法:程序設計法.FDATool設計法和SPTool設計法,給出了詳細的設計步驟,並將設計的濾波器應用到一個混和正弦波信號,以驗 ...

  5. quartus ii matlab,基於Quartus II和MATLAB的FIR濾波器設計與仿真(二)

    接上文  基於Quartus II和MATLAB的FIR濾波器設計與仿真(一): 3  QuartusII 調用 IP 核生成 FIR 濾波器模塊 在 Quartus II 中, Altera 提供了 ...

  6. 【水位预测】基于matlab径向基神经网络地下水位预测【含Matlab源码 1939期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[水位预测]基于matlab径向基神经网络地下水位预测[含Matlab源码 1939期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方 ...

  7. matlab自动驾驶工具箱,MATLAB,Simulink. -  Automated Driving System Toolbox, 自動駕駛系統工具箱-鈦思科技...

    Introduction 對自動駕駛以及先進駕駛輔助系統 (Advanced Driver Assistance Systems:ADAS)提供設計.模擬以及測試等多種功能. Automated Dr ...

  8. matlab 抽样判决代码,matlab抽样判决器

    低通 滤波器 LPF 用于滤除高频分量,提高信噪比;抽样判决所需的同步时钟需要从... 通信原理 MATLAB 仿真实验 基于 MATLAB 的第一类部分响应系统的 基带信号及其眼图...这种方法具体 ...

  9. matlab中exp(liangx),Matlab基础知识

    <Matlab基础知识>由会员分享,可在线阅读,更多相关<Matlab基础知识(122页珍藏版)>请在人人文库网上搜索. 1.Lxy, China Jiliang Univer ...

最新文章

  1. 使tomcat和lighttpd使用service启停
  2. Evernote用户只用了5%的功能,这着实给科技公司上了一课
  3. python中home定义是什么_第48p,什么是函数?,Python中函数的定义
  4. 了解Base64编码的原理(js核对)
  5. html文档是哪个版本,Pro010-从零开始HTML[#010]——5分钟-HTML 文档类型版本
  6. [Linux] 编译 与 链接
  7. SCCM2012系列之十,SCCM2012软件分发
  8. 搜狗输入法纯净_最新PC端搜狗输入法,无广告弹窗纯净版
  9. 软件之道 -- 道篇全文
  10. 二、JavaWeb动态网页基础
  11. 利用计算机网络技术全面规划供应链中的,供应链是围绕核心企业,通过对商流、信息流、物流、资金流的控制,从采购原材料开始,制成中间产品以 - 试题答案网问答...
  12. 用c语言模拟石头剪刀布小游戏
  13. 那些好看的渐变色linear-gradient(拿走不谢)
  14. Windows 7下查看本机的ip地址
  15. 用C++语言写游戏——打怪小游戏
  16. 用iOS/Android实现家庭自动化远程控制
  17. 08. 路由器的基本配置和Talent配置
  18. c#中利用keybd_event函数+自定义软键盘实现中文输入时的问题
  19. 田园项目tabber标签栏使用
  20. 微计算机原理及应用第八章,微型计算机原理及应用课件第八章中断.docx

热门文章

  1. Apicloud_(问题)P54提示错误:Uncaught SyntaxError: Unexpected token ) at main.html : 117
  2. pfSense-2.4.4安装教程
  3. 3.2 Lucene实战:一个简单的小程序
  4. 邮件协议POP3/IMAP/SMTP服务的区别
  5. 第八周总结与软考前任务安排
  6. The example program of C on point
  7. (转)黑幕背后的Autorelease
  8. 通过UserAgent判断智能设备(Android,IOS)
  9. 表字段identity
  10. 单片机串口通信与同步异步通信