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