使用opencv實(shí)現(xiàn)車道線檢測實(shí)戰(zhàn)代碼
更新時(shí)間:2022年03月18日 15:11:24 作者:liu_jie_bin
這篇文章主要介紹了opencv車道線檢測實(shí)戰(zhàn),效果非常逼真,代碼簡單易懂,對opencv車道線檢測實(shí)戰(zhàn)代碼感興趣的朋友一起看看吧
效果

void lane_detection(cv::Mat &src, cv::Mat &dst)
{
dst = cv::Mat::zeros(src.size(),src.type());
cv::Mat grid =cv::Mat::zeros(src.size(),src.type());
int iStep = 25;
int iNUmsX = src.cols / iStep;
int inUmsY = src.rows / iStep;
for(int i = 1; i <= inUmsY; i++)
{
int yPos = i * iStep + src.cols / 5;
cv::Point2d pt1,pt2;
int iOffset = 10;
pt1.x = 0 + iOffset;
pt1.y = yPos;
pt2.x = src.cols - iOffset;
pt2.y = yPos;
cv::line(grid,pt1,pt2,cv::Scalar(255), 1, cv::LINE_4);
}
for(int i = 1; i <= iNUmsX; i++)
int xPos = i * iStep;
pt1.x = xPos;
pt1.y = 0 + iOffset + src.rows / 5;
pt2.x = xPos;
pt2.y = src.rows - iOffset;
cv::imshow("grid", grid);
cv::Mat bitNot;
cv::bitwise_and(src, grid, bitNot);
cv::Mat add = cv::Mat::zeros(bitNot.rows, bitNot.cols,bitNot.type());
int iDiffTh = 200;
QTime timer;
timer.start();
//#pragma omp parallel for num_threads(10)
for (int i = 1; i < bitNot.rows - 1; i++)
{
for (int j = 1; j < bitNot.cols - 1; j++)
{
int iValueX = (int)bitNot.at<uchar>(i, j);
int iValueXPre = (int)bitNot.at<uchar>(i-1, j);
int iValueXNext = (int)bitNot.at<uchar>(i+1, j);
int iValueY = (int)bitNot.at<uchar>(i, j);
int iValueYPre = (int)bitNot.at<uchar>(i, j-1);
int iValueYNext = (int)bitNot.at<uchar>(i, j+1);
if((iValueX - iValueXPre > iDiffTh && iValueX - iValueXNext > iDiffTh) ||
(iValueY - iValueYPre > iDiffTh && iValueY - iValueYNext > iDiffTh))
{
add.at<uchar>(i, j) = 255;
}
}
}
qDebug()<<"process time: "<<timer.elapsed()<<" ms";
//形態(tài)學(xué)預(yù)處理
cv::Mat matDilate;
cv::Mat k33 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(9, 9), cv::Point(-1, -1));
cv::morphologyEx(add, matDilate, cv::MORPH_DILATE, k33, cv::Point(-1, -1), 3);
cv::imshow("matDilate", matDilate);
//cv::bitwise_not(src, matDilate, matRoi);
cv::Mat matRoi;
cv::bitwise_and(src, matDilate, matRoi);
cv::imshow("matRoi", matRoi);
cv::Mat matThresh;
cv::threshold(matRoi, matThresh, 200, 255,cv::THRESH_BINARY);
cv::imshow("matThresh", matThresh);
//std::vector<std::vector<cv::Point>> contours;
//cv::findContours(matThresh,contours,)
std::vector<std::vector<cv::Point> > contoursDefect;
std::vector<cv::Vec4i> hierarchyDefect;
cv::Mat canves;
cv::cvtColor(src, canves,cv::COLOR_RGBA2RGB);
cv::findContours(matThresh, contoursDefect, hierarchyDefect, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
for (size_t i = 0; i < contoursDefect.size(); i++)
{
cv::Mat contour(contoursDefect.at(i));//第i個(gè)輪廓
double area = contourArea(contour);
if (area >= 50)
cv::Moments moment;//矩
moment = moments(contour, false);
cv::Point2d pt1;
double m00 = moment.m00 + 0.01;
pt1.x = moment.m10 / m00;//計(jì)算重心橫坐標(biāo)
pt1.y = moment.m01 / m00;//計(jì)算重心縱坐標(biāo)
cv::drawContours(canves, contoursDefect, i, cv::Scalar(255, 255, 0), -1);
}
cv::imshow("canves", canves);
cv::waitKey(0);
}
void test_lane_detection()
int i = 0;
while(1)
cv::Mat src;
QString dir("D:\\QtProject\\Opencv_Example\\gen_grid_region\\scene_");
QString path;
if(i>9) path = QString("%1%2%3").arg(dir).arg(i++).arg(".png");
else path = QString("%1%2%3%4").arg(dir).arg("0").arg(i++).arg(".png");
cout<<path.toStdString();
src = cv::imread(path.toStdString(), cv::IMREAD_GRAYSCALE);
if (src.empty()) {
cout << "Cannot load image" << endl;
return;
}
cv::imshow("src", src);
cv::Mat dst;
lane_detection(src, dst);到此這篇關(guān)于opencv車道線檢測實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)opencv車道線檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt實(shí)現(xiàn)TCP客戶端和服務(wù)器通訊程序
這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)TCP客戶端和服務(wù)器通訊程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
在while中使用cin>>a?為條件及注意事項(xiàng)說明
這篇文章主要介紹了在while中使用cin>>a?為條件及注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
優(yōu)先隊(duì)列(priority_queue)的C語言實(shí)現(xiàn)代碼
本文簡要介紹一種基于數(shù)組二叉堆實(shí)現(xiàn)的優(yōu)先隊(duì)列,定義的數(shù)據(jù)結(jié)構(gòu)和實(shí)現(xiàn)的函數(shù)接口說明如下2013-10-10
C++實(shí)現(xiàn)動(dòng)態(tài)順序表(vector)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)動(dòng)態(tài)順序表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05

