基于OpenCV的车道偏离预警系统
車道偏離預(yù)警
開發(fā)環(huán)境
Ubuntu 16.04
OpenCV
C++
車道偏離預(yù)警概念解釋
車道偏離預(yù)警系統(tǒng),其英文全稱為L(zhǎng)ane Departure Warning System,因此很多車型上都將車道偏離預(yù)警系統(tǒng)簡(jiǎn)稱為L(zhǎng)DW系統(tǒng)。其主要功能是通過車輛上的傳感器、控制器等部件,在車輛發(fā)生無(wú)意識(shí)偏離車道時(shí)通過聲音、閃光和振動(dòng)等方式提醒駕駛員。
這篇文章使用OpenCV傳統(tǒng)的圖像處理方式,實(shí)現(xiàn)車道檢測(cè)以及偏離報(bào)警的功能。幫助大家快速入門圖像處理以及OpenCV。
環(huán)境搭建
Linux下安裝OpenCV有兩種方式:編譯源碼和直接安裝二進(jìn)制文件。
編譯源碼時(shí)間長(zhǎng)、對(duì)環(huán)境要求比較高,編譯的過程中容易出錯(cuò)。最簡(jiǎn)單的方式是使用 apt-get 安裝。
apt-get update apt-get install libcv-dev libopencv-photo-dev libopencv-contrib-dev一個(gè)測(cè)試程序:
#include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream>using namespace cv; using namespace std;int main (int argc, char **argv) {Mat image, image_gray;image = imread(argv[1], CV_LOAD_IMAGE_COLOR );if (argc != 2 || !image.data) {cout << "No image data\n";return -1;}cvtColor(image, image_gray, CV_RGB2GRAY);namedWindow("image", CV_WINDOW_AUTOSIZE);namedWindow("image gray", CV_WINDOW_AUTOSIZE);imshow("image", image);imshow("image gray", image_gray);waitKey(0);return 0; }編譯:
g++ test.cpp -o test -lopencv_core -lopencv_imgproc -lopencv_highgui運(yùn)行的時(shí)候加上一張圖片,可以把彩色圖片處理成黑白圖片,比如:
./test test.jpg車道檢測(cè)涉及的圖像處理技術(shù)
1、讀取攝像頭或者視頻數(shù)據(jù)
OpenCV讀取視頻數(shù)據(jù)非常簡(jiǎn)單,如果不做過多的參數(shù)設(shè)置(幀率、分辨率),只需要調(diào)用 VideoCapture 類中的 read 函數(shù)即可。
VideoCapture cap; Mat mFrame;cap.open(VIDEO_FILE_NAME);while (cap.read(mFrame)) {imshow("mytest", mFrame);waitKey(10); }imshow()函數(shù)實(shí)現(xiàn)在屏幕中顯示一張圖片的功能。
waitKey()函數(shù)用于等待,單位為毫秒。
如果是讀取攝像頭數(shù)據(jù),把 open 的參數(shù)改成 0,如果是USB攝像頭,把參數(shù)改成 1 。
2、截取圖像
從測(cè)試視頻中讀取的數(shù)據(jù)有一大半都是不需要的,我們需要的是地上的車道線。所以對(duì)于截取的圖片可以先把上面一半裁掉。
在OpenCV中使用 Rect 函數(shù)。
mFrame(Rect(0, mFrame.rows / 2, mFrame.cols, mFrame.rows / 2));四個(gè)參數(shù)的含義分別為:從(0, mFrame.rows / 2)坐標(biāo)開始,向右 mFrame.cols 個(gè)像素,向下 mFrame.rows / 2 個(gè)像素。
3、轉(zhuǎn)換成灰度像
自然界中的色彩很容易受到光照的影響,而且彩色的圖片數(shù)據(jù)量非常大, 不利于后期的圖像處理。所以把圖像轉(zhuǎn)換成灰度圖,后續(xù)處理的計(jì)算量會(huì)更少。
OpenCV中使用 cvtColor 函數(shù)。
cvtColor(imageROI, mGray, COLOR_BGR2GRAY);三個(gè)參數(shù)的含義:輸入圖像、輸出圖像、轉(zhuǎn)換成灰度圖。
4、高斯濾波
灰度圖中有很多模糊或者可能對(duì)后期處理造成影響的像素點(diǎn)(稱之為“噪聲”),通過高斯濾波把它過濾掉。
OpenCV中使用 GaussianBlur 函數(shù)。
GaussianBlur(mGray, IPM_Gray, Size(7, 7), 1.5, 1.5);各個(gè)參數(shù)的意義:輸入的圖像、輸出圖像、高斯內(nèi)核的大小(size.width和size.height)、高斯核函數(shù)在X方向的的標(biāo)準(zhǔn)偏差、高斯核函數(shù)在Y方向的的標(biāo)準(zhǔn)偏差。
注:如果需要詳細(xì)了解后面三個(gè)參數(shù)的意義,可以百度「高斯濾波」;如果純粹是為了寫代碼,沒有必要。
5、邊緣檢測(cè)
比較著名的邊緣檢測(cè)算法是Canny,根據(jù)像素點(diǎn)周邊的像素情況計(jì)算出梯度值和方向來(lái)確定真實(shí)和潛在的邊緣。
OpenCV中使用 Canny 函數(shù)。
Canny(IPM_Gray, IPM_Gray, 80, 100, 3);各個(gè)參數(shù)的含義:輸入圖像、輸出圖像、最低閾值、最高閾值、Sobel內(nèi)核大小(內(nèi)部使用)。
6、霍夫變換
霍夫變換是用來(lái)辨別找出圖像中的特征,例如:線條。線條由兩個(gè)點(diǎn)組成,每個(gè)點(diǎn)包含橫坐標(biāo)和縱坐標(biāo),即一條線段由四個(gè)數(shù)據(jù)組成。在OpenCV中用 Vec4i 來(lái)表示線段,可以理解成是一個(gè)數(shù)組,數(shù)組里面包含了四個(gè)元素。
vector<Vec4i> lines; HoughLinesP(IPM_Gray, lines, 1, CV_PI / 180, 10, 20, 50);各個(gè)參數(shù)的含義:輸入圖像、檢測(cè)到的所有線段、半徑分辨率、角度分辨率、線段長(zhǎng)度閾值、線段上最近兩點(diǎn)之間的閾值。
7、車道偏離檢測(cè)算法
車道偏離檢測(cè)算法有很多,講解一種比較簡(jiǎn)單的判斷方法。
通過數(shù)學(xué)運(yùn)算,可以得到兩條車道線和 X 軸的交點(diǎn),分別是 left_x 和 right_x ,如果 left_x 和 right_x 在某個(gè)范圍內(nèi),則認(rèn)為正常行駛;如果 left_x 和 right_x 向左移動(dòng),則認(rèn)為是右轉(zhuǎn),否則就是左轉(zhuǎn)。
8、畫出車道
檢測(cè)出車道后使用 OpenCV 畫直線的 line 函數(shù)畫出車道。
line(mFrame, Point(right_lane[0], right_lane[1] + mFrame.rows * 2 / 3), Point(right_lane[2], right_lane[3] + mFrame.rows * 2 / 3), Scalar(0, 255, 0), 3);各個(gè)參數(shù)的含義:輸入圖像、直線的起點(diǎn)、直線的終點(diǎn)、顏色、線條寬度。
8、報(bào)警
報(bào)警方式很多,代碼中使用了文字的方式作出提醒。OpenCV編輯文字使用 putText 函數(shù)。
putText(mFrame, "right", Point(450, 200), cv::FONT_HERSHEY_PLAIN,4, cv::Scalar(0, 0, 255), 5);各個(gè)參數(shù)的含義:輸入圖像、文字、文字左下角坐標(biāo)、字體、字體大小、字體顏色、字體線條寬度
關(guān)注公眾號(hào) 學(xué)益得智能硬件
后臺(tái)回復(fù) 車道檢測(cè) 獲取源碼
總結(jié)
以上是生活随笔為你收集整理的基于OpenCV的车道偏离预警系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人工智能 3.确定性推理方法
- 下一篇: 绝对不变性原理、内模原理