因?yàn)榉N種原因?qū)е律蟼€(gè)月沒有更新推文,所以特此發(fā)此推文表示歉意。
今天介紹的是如何通過計(jì)算機(jī)視覺去識別車道線,其實(shí)現(xiàn)在也有各種方法去識別車道線了。這次是基于Matlab的實(shí)現(xiàn),過幾天會更新Python版本的實(shí)現(xiàn),雖然用的語言不一樣,但是原理都是一樣的。
預(yù)處理
攝像機(jī)獲得的視頻圖像,由于受到周圍環(huán)境的影響,存在著很多無用信息和各種各樣的噪聲干擾。為了準(zhǔn)確的檢測到道路線必須對圖像進(jìn)行預(yù)處理。首先,通過灰度化處理將原始彩色圖像轉(zhuǎn)換為灰色圖像,然后采用大小為5*5的模板進(jìn)行高斯濾波平滑處理,減小噪聲干擾。高斯濾波的具體操作是:用一個(gè)模板(或稱卷積、掩模)掃描圖像中的每一個(gè)像素,用模板確定的鄰域內(nèi)像素的加權(quán)平均灰度值去替代模板中心像素點(diǎn)的值。
若使用3×3模板,則計(jì)算公式如下
g(x,y)={f(x-1,y-1)+f(x-1,y+1)+f(x+1,y-1)+f(x+1,y+1)+[f(x-1,y)+f(x,y- 1)+f(x+1,y)+f(x,y+1)]*2+f(x,y)*4}/16;
其中,f(x,y)為圖像中(x,y)點(diǎn)的灰度值,g(x,y)為該點(diǎn)經(jīng)過高斯濾波后的值
由于天空并不存在車道的感興趣區(qū)域,所以對圖片進(jìn)行了劃分,將感興趣區(qū)域劃為一個(gè)三角形區(qū)域。如圖1。
圖一
預(yù)處理代碼如下:
%讀入RGB圖片
I=imread('IMG00061.jpg');
%把RGB圖轉(zhuǎn)換為灰度圖
I=rgb2gray(I);
%高斯濾波平滑處理
sigma = 1;
gausFilter =fspecial('gaussian', [5,5], sigma);
gaus= imfilter(I, gausFilter,'replicate');
%得到圖片的寬和高
[h, w]=size(I);
%k是直線的斜率
%找出圖片的感興趣區(qū)域
k = 1.3;
for y=1:h
for x=1:w
if y < x*k + h-k*w || y < -k*x +h
I(y, x) = 0;
end
end
end
邊緣檢測
由于車道線的灰度比路面更加明亮,以此可以用邊緣檢測的方法把車道的邊緣檢測出來。在邊緣檢測中,我用了‘Sobel’算子。在技術(shù)上,它是一離散性差分算子,用來運(yùn)算圖像亮度函數(shù)的灰度之近似值。在圖像的任何一點(diǎn)使用此算子,將會產(chǎn)生對應(yīng)的灰度矢量或是其法矢量
Sobel卷積因子為:
該算子包含兩組3x3的矩陣,分別為橫向及縱向,將之與圖像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。如果以A代表原始圖像,Gx及Gy分別代表經(jīng)橫向及縱向邊緣檢測的圖像灰度值,其公式如下:
圖像的每一個(gè)像素的橫向及縱向灰度值通過以下公式結(jié)合,來計(jì)算該點(diǎn)灰度的大小:
通常,為了提高效率使用不開平方的近似值:
所得到的結(jié)果如圖2:
圖2
霍夫變換直線檢測
有了邊緣檢測的二值圖后可以對圖像進(jìn)行霍夫變換,霍夫變換是圖像變換中的經(jīng)典手段之一,主要用來從圖像中分離出具有某種相同特征的幾何形狀(如,直線,圓等)?;舴蜃儞Q的原理是將特定圖形上的點(diǎn)變換到一組參數(shù)空間上,根據(jù)參數(shù)空間點(diǎn)的累計(jì)結(jié)果找到一個(gè)極大值對應(yīng)的解,那么這個(gè)解就對應(yīng)著要尋找的幾何形狀的參數(shù)(比如說直線,那么就會得到直線的斜率k與常數(shù)b,圓就會得到圓心與半徑等等)。經(jīng)過霍夫變換后可得到如圖3關(guān)于ρ和θ的圖。
圖3
圖中最亮的幾個(gè)點(diǎn)則為峰值,峰值中極有可能存在直線??梢赃x出一組候選的峰值,然后決定線的起始點(diǎn)和終點(diǎn)。函數(shù)houghlines用默認(rèn)的語法執(zhí)行這個(gè)任務(wù):
lines = houghlines(f, theta,rho, peaks)
或者使用完整的語法形式:
lines = houghlines(...,'FillGap', val1, 'MinLength', val2)
其中,theta和rho是來自函數(shù)hough的輸出,peaks是函數(shù)houghpeaks的輸出。
效果
為了美觀和效果,我對檢測出來的線段進(jìn)行了延長處理,效果如下圖4。
圖4
完整代碼如下:
clear
close all
%讀入RGB圖片
I=imread('IMG00061.jpg');
%把RGB圖轉(zhuǎn)換為灰度圖
I=rgb2gray(I);
%高斯濾波平滑處理
sigma = 1;
gausFilter = fspecial('gaussian', [5,5], sigma);
gaus= imfilter(I, gausFilter, 'replicate');
%得到圖片的寬和高
[h, w]=size(I);
%k是直線的斜率
%切圖,找出圖片的感興趣區(qū)域
k = 1.3;
for y=1:h
for x=1:w
if y < x*k + h-k*w || y < -k*x + h
I(y, x) = 0;
end
end
end
imshow(I)
%用Sobel算子做邊緣檢測
BW = edge(I,'sobel');
%霍夫變換
[H,T,R] = hough(BW);
imshow(H,[],'XData',T,'YData',R, 'InitialMagnification','fit');
xlabel(' heta'), ylabel(' ho');
axis on, axis normal, hold on;
%找出霍夫變換的峰值
P = houghpeaks(H,2);
%用霍夫變換檢測和連接線
lines = houghlines(BW,T,R,P);
figure;
imshow(I); hold on
%畫線
for k = 1:length(lines)
p1 = lines(k).point1;
p2 = lines(k).point2;
syms slope b
[b, slope] = solve(slope*p1(1)-p1(2)+b, slope*p2(1)-p2(2)+b);
plot([(h-b)/slope, (0.4*h-b)/slope], [h, 0.4*h], 'g-', 'LineWidth',3);
end
代碼中用到的圖片:
-
matlab
+關(guān)注
關(guān)注
185文章
2976瀏覽量
230535 -
代碼
+關(guān)注
關(guān)注
30文章
4790瀏覽量
68654 -
計(jì)算機(jī)視覺
+關(guān)注
關(guān)注
8文章
1698瀏覽量
46005
原文標(biāo)題:項(xiàng)目實(shí)戰(zhàn) | 車道線檢測與定位
文章出處:【微信號:gh_a204797f977b,微信公眾號:深度學(xué)習(xí)實(shí)戰(zhàn)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論