因為種種原因導致上個月沒有更新推文,所以特此發此推文表示歉意。
今天介紹的是如何通過計算機視覺去識別車道線,其實現在也有各種方法去識別車道線了。這次是基于Matlab的實現,過幾天會更新Python版本的實現,雖然用的語言不一樣,但是原理都是一樣的。
預處理
攝像機獲得的視頻圖像,由于受到周圍環境的影響,存在著很多無用信息和各種各樣的噪聲干擾。為了準確的檢測到道路線必須對圖像進行預處理。首先,通過灰度化處理將原始彩色圖像轉換為灰色圖像,然后采用大小為5*5的模板進行高斯濾波平滑處理,減小噪聲干擾。高斯濾波的具體操作是:用一個模板(或稱卷積、掩模)掃描圖像中的每一個像素,用模板確定的鄰域內像素的加權平均灰度值去替代模板中心像素點的值。
若使用3×3模板,則計算公式如下
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)點的灰度值,g(x,y)為該點經過高斯濾波后的值
由于天空并不存在車道的感興趣區域,所以對圖片進行了劃分,將感興趣區域劃為一個三角形區域。如圖1。
圖一
預處理代碼如下:
%讀入RGB圖片
I=imread('IMG00061.jpg');
%把RGB圖轉換為灰度圖
I=rgb2gray(I);
%高斯濾波平滑處理
sigma = 1;
gausFilter =fspecial('gaussian', [5,5], sigma);
gaus= imfilter(I, gausFilter,'replicate');
%得到圖片的寬和高
[h, w]=size(I);
%k是直線的斜率
%找出圖片的感興趣區域
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’算子。在技術上,它是一離散性差分算子,用來運算圖像亮度函數的灰度之近似值。在圖像的任何一點使用此算子,將會產生對應的灰度矢量或是其法矢量
Sobel卷積因子為:
該算子包含兩組3x3的矩陣,分別為橫向及縱向,將之與圖像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。如果以A代表原始圖像,Gx及Gy分別代表經橫向及縱向邊緣檢測的圖像灰度值,其公式如下:
圖像的每一個像素的橫向及縱向灰度值通過以下公式結合,來計算該點灰度的大小:
通常,為了提高效率使用不開平方的近似值:
所得到的結果如圖2:
圖2
霍夫變換直線檢測
有了邊緣檢測的二值圖后可以對圖像進行霍夫變換,霍夫變換是圖像變換中的經典手段之一,主要用來從圖像中分離出具有某種相同特征的幾何形狀(如,直線,圓等)。霍夫變換的原理是將特定圖形上的點變換到一組參數空間上,根據參數空間點的累計結果找到一個極大值對應的解,那么這個解就對應著要尋找的幾何形狀的參數(比如說直線,那么就會得到直線的斜率k與常數b,圓就會得到圓心與半徑等等)。經過霍夫變換后可得到如圖3關于ρ和θ的圖。
圖3
圖中最亮的幾個點則為峰值,峰值中極有可能存在直線。可以選出一組候選的峰值,然后決定線的起始點和終點。函數houghlines用默認的語法執行這個任務:
lines = houghlines(f, theta,rho, peaks)
或者使用完整的語法形式:
lines = houghlines(...,'FillGap', val1, 'MinLength', val2)
其中,theta和rho是來自函數hough的輸出,peaks是函數houghpeaks的輸出。
效果
為了美觀和效果,我對檢測出來的線段進行了延長處理,效果如下圖4。
圖4
完整代碼如下:
clear
close all
%讀入RGB圖片
I=imread('IMG00061.jpg');
%把RGB圖轉換為灰度圖
I=rgb2gray(I);
%高斯濾波平滑處理
sigma = 1;
gausFilter = fspecial('gaussian', [5,5], sigma);
gaus= imfilter(I, gausFilter, 'replicate');
%得到圖片的寬和高
[h, w]=size(I);
%k是直線的斜率
%切圖,找出圖片的感興趣區域
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
+關注
關注
182文章
2963瀏覽量
230155 -
代碼
+關注
關注
30文章
4748瀏覽量
68351 -
計算機視覺
+關注
關注
8文章
1696瀏覽量
45927
原文標題:項目實戰 | 車道線檢測與定位
文章出處:【微信號:gh_a204797f977b,微信公眾號:深度學習實戰】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論