目录
前言
课题背景和意义
实现技术思路
一、边缘检测
二、ROI 区域确定
三、基于 Hough 变换车道线识别
四、车道线拟合
代码部分
实现效果图样例
最后
大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
对毕设有任何疑问都可以问学长哦!
选题指导: https://blog.csdn.net/qq_37340229/article/details/128243277
大家好,这里是海浪学长毕设专题,本次分享的课题是
基于机器视觉的直道车道线识别技术-OpenCV
车道线灰度图:
对于车载前置摄像头获得的道路图像,为了从中提取车道线信息,可以采用边缘检测方法来进行边缘提取。边缘检测算法提取的图像边缘,往往是不同物体的交叉部分,这些边缘是图像中变化剧烈的连续点集,可以很好的表示出图像中的纹理变化。
在笛卡尔坐标系中,将一条直线上的某两个点 A、B标记在 x-y 坐标系中,如图:
在笛卡尔坐标系下,经过 A,B 两点的直线可以表示为:
最终通过最小二乘法对车道线进行拟合,并在对应的车道线位置标记出车道线。在 PC 机上,基于 Anaconda 环境和 Opencv 开源库对车道线进行检测验证,检测效果如图
主要代码:
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(i, j);
int iValueXPre = (int)bitNot.at(i-1, j);
int iValueXNext = (int)bitNot.at(i+1, j);
int iValueY = (int)bitNot.at(i, j);
int iValueYPre = (int)bitNot.at(i, j-1);
int iValueYNext = (int)bitNot.at(i, j+1);
if((iValueX - iValueXPre > iDiffTh && iValueX - iValueXNext > iDiffTh) ||
(iValueY - iValueYPre > iDiffTh && iValueY - iValueYNext > iDiffTh))
{
add.at(i, j) = 255;
}
}
}
qDebug()<<"process time: "<> contours;
//cv::findContours(matThresh,contours,)
std::vector > contoursDefect;
std::vector 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个轮廓
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;//计算重心横坐标
pt1.y = moment.m01 / m00;//计算重心纵坐标
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<
车道识别效果:
我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。
毕设帮助,疑难解答,欢迎打扰!