• 车道线检测算法经典编程


    车道线检测算法经典编程

    1. 车道线曲线拟合算法编程

    计算经过(50,50),(90,120),(70,200)三点的Catmull_Rom样条曲线。

     

     1.    IplImage* img = cvCreateImage(cvSize(300,300), 8, 1);  

    2.    for (int i = 0; i < img->height; ++i)  

    3.    {  

    4.        for (int j = 0; j < img->width; ++j)  

    5.        {  

    6.            ((char *)(img->imageData + img->widthStep * (i)))[j] = 0;  

    7.        }  

    8.    }  

    9.    CvPoint point0,point1,point2,point3,point4;//3个控制点来做  

    10.   point1.x = 50;  

    11.   point1.y = 50;  

    12.   point2.x = 90;  

    13.   point2.y = 120;  

    14.   point3.x = 70;  

    15.   point3.y = 200;  

    16.   point0.x = point1.x+(point1.x-point2.x);  

    17.   point0.y = point1.y+(point1.y-point2.y);  

    18.   point4.x = point3.x+(point3.x-point2.x);  

    19.   point4.y = point3.y+(point3.y-point2.y);  

    20.    

    21.   ((char *)(img->imageData + img->widthStep * (point1.y)))[point1.x] = 255;  

    22.   ((char *)(img->imageData + img->widthStep * (point2.y)))[point2.x] = 255;  

    23.   ((char *)(img->imageData + img->widthStep * (point3.y)))[point3.x] = 255;  

    24.     

    25.    for (int i = 1; i < 500 ; i++) {  

    26.     

    27.              float t = (float) i * (1.0f / (float) 500);  

    28.              float tt = t * t;  

    29.              float ttt = tt * t;  

    30.           CvPoint pi;  

    31.           pi.x = 0.5 * (2*point1.x+(point2.x-point0.x)*t + (2*point0.x-5*point1.x+4*point2.x-point3.x)*tt + (3*point1.x-point0.x-3*point2.x+point3.x)*ttt);  

    32.              pi.y = 0.5 * (2*point1.y+(point2.y-point0.y)*t + (2*point0.y-5*point1.y+4*point2.y-point3.y)*tt + (3*point1.y-point0.y-3*point2.y+point3.y)*ttt);  

    33.           ((char *)(img->imageData + img->widthStep * (pi.y)))[pi.x] = 255;  

    34.    }  

    35.      

    36.    for (int i = 1; i < 500 ; i++) {  

    37.     

    38.              float t = (float) i * (1.0f / (float) 500);  

    39.              float tt = t * t;  

    40.              float ttt = tt * t;  

    41.           CvPoint pi;  

    42.           pi.x = 0.5 * (2*point2.x+(point3.x-point1.x)*t + (2*point1.x-5*point2.x+4*point3.x-point4.x)*tt + (3*point2.x-point1.x-3*point3.x+point4.x)*ttt);  

    43.              pi.y = 0.5 * (2*point2.y+(point3.y-point1.y)*t + (2*point1.y-5*point2.y+4*point3.y-point4.y)*tt + (3*point2.y-point1.y-3*point3.y+point4.y)*ttt);  

    44.           ((char *)(img->imageData + img->widthStep * (pi.y)))[pi.x] = 255;  

    45.    }  

    46.   cvShowImage("scr", img);  

    47.   cvWaitKey(0);  

    48.   return 0;  

    2. 检测出Hough空间的曲线,规定如下搜索方法: 

    霍夫空间中相交的曲线越多,交点表示的线在笛卡尔坐标系对应的点越多。我们在霍夫空间中定义交点的最小阈值来检测线。霍夫变换跟踪了帧中的每个点的霍夫空间交点。如果交点数量超过了阈值就确定一条对应参数 θ 和 d的线。

     

     1>起始搜索点为A点

    2>向右搜索,直到退出,退出点为B

    3>从B点向左搜索,直到退出

    4>起始搜索点回到A点

    5>向左搜索,直到退出,退出点为C

    6>从C点向右搜索,直到退出

    结束

     

     部分代码如下: 

    向左搜索:

    1.    CvPoint searchRight(int **HoughArea, IplImage* hough, CvPoint point, Lines* line)  

    2.    {//找当前点的上、右上、右、右下、下  

    3.        //循环搜索,直到两个方向搜索均无结果,则退出开始下一步判断  

    4.        CvPoint start;//搜索的初始点  

    5.        start = point;//先将point作为当前的初始点  

    6.        int Max = 0;//找局部最大值  

    7.        CvPoint last = start;//记录上一次最大值,本次搜索排除当前点和上一次点  

    8.        int mistakes = 0;//引入一个容错因子  

    9.        //****************************搜索上,右上,右,右下,下*****************************8  

    10.       while(1)  

    11.       {  

    12.           CvPoint temp;  

    13.           if(start.x >= hough->width-1 || start.y <= 0||start.y >= hough->height-1)//超出搜索范围,退出搜索  

    14.               break;  

    15.           //cout << "curve1" << endl;  

    16.           for(int xx = 0;xx < 2; xx++)  

    17.           {  

    18.               for(int yy = -1;yy < 2;yy++)  

    19.               {  

    20.                   if((xx == 0 && yy == 0)||(start.y + yy == last.y && start.x + xx == last.x))//不包括当前点  

    21.                       continue;  

    22.                   //cout << HoughArea[start.y + yy][start.x + xx] << endl;  

    23.                   if(HoughArea[start.y + yy][start.x + xx] > Max)  

    24.                   {  

    25.                       Max = HoughArea[start.y + yy][start.x + xx];  

    26.                       temp.x = start.x + xx;  

    27.                       temp.y = start.y + yy;  

    28.                   }   

    29.               }  

    30.           }  

    31.           if(Max > Threshold)  

    32.           {  

    33.               //cout << Max << "  ";  

    34.               mistakes = 0;//容错清零  

    35.               cout << "find1:"<< Max << endl;  

    36.               Max = 0;  

    37.               (*line).houghpoint.push_back(temp);  

    38.               last = start;//保存上一次最大值  

    39.               start = temp;//找到的点作为当前点继续搜索  

    40.               CvScalar s;      

    41.               s.val[0]=0;  

    42.               s.val[1]=255;  

    43.               s.val[2]=0;  

    44.               //cvSet2D(hough,temp.y,temp.x,s);//set the (i,j) pixel value  

    45.           }  

    46.           else if(mistakes <= 5)//容错,三次  

    47.           {  

    48.               mistakes++;  

    49.               Max = 0;  

    50.               start.x = start.x + 1;  

    51.           }  

    52.           else//退出条件  

    53.               break;//没有找到符合条件的点,退出搜索  

    54.       }  

    55.       //*******************************************************************************  

    56.       CvPoint final;  

    57.       final.x = start.x - mistakes;  

    58.       final.y = start.y;  

    59.       return final;  

    60.   } 

    3.   导入包含的库文件

    #include <iostream>

    #include <opencv2/opencv.hpp>

    #include<vector>

    #include <opencv2/highgui/highgui.hpp>

    #include<string>

    using namespace std;

    using namespace cv;

    4. 读取图片

       //*************reading image******************

        Mat image;

        image = imread("/home/project1/test1.jpg");

        if(image.empty()){

            cout <<"reading error"<<endl;

            return -1;

    }

    5. 灰度变换

    //***************gray image*******************

        Mat image_gray;

    cvtColor(image,image_gray, CV_BGR2GRAY);

    6. canny边缘检测

     

     //******************canny*********************

    Mat image_canny;

    Canny(image_gau, image_canny,100, 200, 3);

  • 相关阅读:
    js中.和[]的区别
    JavaScript【引用方法】操作方法
    JavaScript【引用方法】重排序方法
    JavaScript【引用方法】队列方法
    JavaScript【引用类型】栈方法
    JavaScript【引用类型】转换方法
    JavaScript【引用类型】检测类型
    JavaScript【引用类型】Array 类型
    JavaScript【引用类型】Object 类型
    【HTML5 绘图与动画】 使用图像 1.导入图像 2.缩放图像 3.裁切图像
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/12816822.html
Copyright © 2020-2023  润新知