【图像处理】车道线检测

看过几篇车道线检测的文章,有原理比较简单的,比如基于模板、霍夫变换,复杂的还有基于深度学习的,有检测直道、弯道的。推荐几篇文章。根据实际需求,我只是想能够比较粗略地得到视频流中的车道线信息,不需要特别精确,所以本人是基于OpenCV,通过霍夫变换实现的车道线检测。
直接看代码和结果吧:
代码部分:

/*
-功能:车道线检测
-输入:
        IplImage * curImage      //图像
-返回:
        //本文中保存车道线起点和终点的参数是全局变量
*/
void getRoad(IplImage * curImage)
{
    IplImage *temp = cvCreateImage(cvGetSize(curImage), IPL_DEPTH_8U, 1);
    //cvCvtColor(curImage, temp, CV_BGR2GRAY);
    cvThreshold(curImage, temp, 90, 255.0, CV_THRESH_BINARY);       //200
    cvErode(temp, temp, NULL, 1);
    cvDilate(temp, temp, NULL, 1);
    cvCanny(temp, temp, 50, 120);
    //霍夫变换
    CvSeq *lines = NULL;

    CvMemStorage *storage = cvCreateMemStorage(0);
    lines = cvHoughLines2(
        temp, 
        storage, 
        CV_HOUGH_PROBABILISTIC,         //method            概率
        1.0,                            //rho
        CV_PI / 180,                    //theta
        40,                             //threshold     像素点个数阈值
        20,                             //param1        最小线段长度
        10);                            //param2        线段的最大间隔
    int length = lines->total;
    vector lRoadV, rRoadV;//候选车道线线段
    for (size_t i = 0; i < length; i++)
    {
        CvPoint *points = (CvPoint*)cvGetSeqElem(lines, i);
        double k = (points[0].y - points[1].y)*1.0 / (points[0].x - points[1].x);
        if (k > -1.5&&k < -0.5)             //左车道
        {
            lRoadV.push_back(points);
        }
        else if (k > 0.5 && k < 1.5)        //右车道
        {
            rRoadV.push_back(points);
        }   
    }
        selectRoad(lRoadV, rRoadV);//进一步筛选车道线
}

效果如下
【图像处理】车道线检测_第1张图片

你可能感兴趣的:(【图像处理】,图像处理)