毕业设计-基于机器视觉的直道车道线识别技术-OpenCV

目录

前言

课题背景和意义

实现技术思路

一、边缘检测

二、ROI 区域确定

三、基于 Hough 变换车道线识别

四、车道线拟合

代码部分

实现效果图样例

最后


前言


    大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

对毕设有任何疑问都可以问学长哦!

选题指导: https://blog.csdn.net/qq_37340229/article/details/128243277

大家好,这里是海浪学长毕设专题,本次分享的课题是

基于机器视觉的直道车道线识别技术-OpenCV

课题背景和意义

近年来,先进驾驶辅助系统(Advanced Driver Assistance Systems, ADAS)和自动驾驶技术的快 速发展极大地提升了驾驶的便利性和安全性。自 动驾驶中的关键技术包含环境感知技术、路径规 划技术、导航控制技术、避撞防撞技术、信息通 讯技术、乘员安保技术、人机交互技术、状态检 测技术等。为了保证自动驾驶车辆能正确处理在 道路上遇到的各种工况,自动驾驶中的环境感知 系统通常需要获取大量环境信息,如:车道线位 置、可行使区域识别、交通标志线、前方车辆检 测、行人检测等。在汽车环境感知技术的发展过 程中,汽车上所安装的传感器越来越丰富。在各 类环境感知传感器中,视觉传感器相对于激光雷 达在价格上更加便宜,具有更高的性价比,更有 利于自动驾驶汽车的落地,故其受到了极大的关 注,其最主要的作用就是检测出车道线,这正是 智能驾驶功能所需解决的核心问题。 车道线的正确检测受到的干扰因素有很多, 在过去的几十年里,人们做了许多努力。然而, 在无限条件下开发一个健壮的探测器仍然是一个 挑战。因为有太多的变量,如雾,雨,光照变化, 部分遮挡,这些因素可能都会影响最终的结果。 人工智能技术的迅速发展使智能驾驶成为热门领域,车道线检测技术作为智能驾驶领域的关键技术,对其进行准确的识别意义重大。

实现技术思路

通过运用 OpenCV 图像处理技术来实现对正常条件下的直道车道线检测和识别,识别流程图如图 所示。

一、边缘检测

车载摄像头等视觉图像采集设备采集到的道 路图像为彩色图像,图像中的内容除车道线外还 有很多不是车道线检测所需要的,为了减少车道 线检测中所产生的干扰,在对图像中的车道线进 行检测前首先应对道路图像进行预处理。
车道线原图:

毕业设计-基于机器视觉的直道车道线识别技术-OpenCV_第1张图片

车道线灰度图:

毕业设计-基于机器视觉的直道车道线识别技术-OpenCV_第2张图片

 对于车载前置摄像头获得的道路图像,为了从中提取车道线信息,可以采用边缘检测方法来进行边缘提取。边缘检测算法提取的图像边缘,往往是不同物体的交叉部分,这些边缘是图像中变化剧烈的连续点集,可以很好的表示出图像中的纹理变化。

 

OpenCv 库中 Canny() 函数的原型为 Canny (image, threshold1, threshold2, edges=None, aper-tureSize=None, L2gradient=None),灰度图像经过 Canny 算子边缘检测后的图像如图:

二、ROI 区域确定

经过 Canny 算子检测后得到的车道线边缘检测图中,含有要素较多,会对之后的车道线识别造成干扰。为了提高检测结果的准确度,降低检测算法的计算复杂度,需要对图像进行感兴趣区域划分

 

首先使用 numpy 库中的函数 zeros_like()生成和图像矩阵类似的零矩阵图像,然后使用
OpenCv 库的函数 fillPoly()对图像感兴趣区域进行填 充 ,将 得 到 的 图 像 矩 阵 和 边 缘 检 测 图 通 过bitwise_and()函数进行位与运算最终得到感兴趣区域。

毕业设计-基于机器视觉的直道车道线识别技术-OpenCV_第3张图片

三、基于 Hough 变换车道线识别

在对直道车道线的识别中,大多数情况下是采用 Hough 变换来实现的。 Hough 变换的原理是将直线从图像空间中转换到参数空间,其基本原理是点---线对偶性质,从而达到降维的目的。

 在笛卡尔坐标系中,将一条直线上的某两个点 AB标记在 x-y 坐标系中,如图:

毕业设计-基于机器视觉的直道车道线识别技术-OpenCV_第4张图片

 在笛卡尔坐标系下,经过 AB 两点的直线可以表示为:

上式可经过直角坐标系下的 Hough 变换表示为:

 

如图 所示,图像空间中的直线参数 k b ,即为参数空间中的点( k 0 , b 0 )。

毕业设计-基于机器视觉的直道车道线识别技术-OpenCV_第5张图片

经过霍夫变换后达到了降维的目的,将笛卡尔坐标系下的线变换为参数空间坐标系下的一个点。OpenCV 提供了霍夫变换检测直线的函数HoughLinesP(),可以通过设置不同的参数,检测不同长度的线段。

 

四、车道线拟合

虽然霍夫变换算法在一定的程度上确保了车道线识别的精准度,但它自身仍有一些局限的地方,它会受到图像噪声的限制。所以,采用最小二乘法来对车道线拟合,进行进一步的检测。 待拟合直线公式为:

 最终通过最小二乘法对车道线进行拟合,并在对应的车道线位置标记出车道线。在 PC 机上,基于 Anaconda 环境和 Opencv 开源库对车道线进行检测验证,检测效果如图

毕业设计-基于机器视觉的直道车道线识别技术-OpenCV_第6张图片

代码部分

主要代码:

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<

实现效果图样例

车道识别效果:

毕业设计-基于机器视觉的直道车道线识别技术-OpenCV_第7张图片

 我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。

毕设帮助,疑难解答,欢迎打扰!

最后

你可能感兴趣的:(机器视觉毕业设计,opencv毕业设计,python毕设选题,课程设计,计算机视觉,人工智能,opencv,自动驾驶)