车道线检测算法经典编程

车道线检测算法经典编程

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);

原文地址:https://www.cnblogs.com/wujianming-110117/p/12816822.html