車道線檢測算法經典編程


車道線檢測算法經典編程

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM