车道线检测算法经典编程
車道線檢測算法經典編程
- 車道線曲線擬合算法編程
計算經過(50,50),(90,120),(70,200)三點的Catmull_Rom樣條曲線。
-
IplImage* img = cvCreateImage(cvSize(300,300), 8, 1);
-
for (int i = 0; i < img->height; ++i)
-
{
-
for (int j = 0; j < img->width; ++j) -
{ -
((char *)(img->imageData + img->widthStep * (i)))[j] = 0; -
} -
}
-
CvPoint point0,point1,point2,point3,point4;//3個控制點來做
-
point1.x = 50;
-
point1.y = 50;
-
point2.x = 90;
-
point2.y = 120;
-
point3.x = 70;
-
point3.y = 200;
-
point0.x = point1.x+(point1.x-point2.x);
-
point0.y = point1.y+(point1.y-point2.y);
-
point4.x = point3.x+(point3.x-point2.x);
-
point4.y = point3.y+(point3.y-point2.y);
-
((char *)(img->imageData + img->widthStep * (point1.y)))[point1.x] = 255;
-
((char *)(img->imageData + img->widthStep * (point2.y)))[point2.x] = 255;
-
((char *)(img->imageData + img->widthStep * (point3.y)))[point3.x] = 255;
-
for (int i = 1; i < 500 ; i++) {
-
float t = (float) i * (1.0f / (float) 500); -
float tt = t * t; -
float ttt = tt * t; -
CvPoint pi; -
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); -
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); -
((char *)(img->imageData + img->widthStep * (pi.y)))[pi.x] = 255; -
}
-
for (int i = 1; i < 500 ; i++) {
-
float t = (float) i * (1.0f / (float) 500); -
float tt = t * t; -
float ttt = tt * t; -
CvPoint pi; -
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); -
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); -
((char *)(img->imageData + img->widthStep * (pi.y)))[pi.x] = 255; -
}
-
cvShowImage(“scr”, img);
-
cvWaitKey(0);
-
return 0;
-
檢測出Hough空間的曲線,規定如下搜索方法:
霍夫空間中相交的曲線越多,交點表示的線在笛卡爾坐標系對應的點越多。我們在霍夫空間中定義交點的最小閾值來檢測線。霍夫變換跟蹤了幀中的每個點的霍夫空間交點。如果交點數量超過了閾值就確定一條對應參數 θ 和 d的線。
1>起始搜索點為A點
2>向右搜索,直到退出,退出點為B
3>從B點向左搜索,直到退出
4>起始搜索點回到A點
5>向左搜索,直到退出,退出點為C
6>從C點向右搜索,直到退出
結束
部分代碼如下:
向左搜索:
-
CvPoint searchRight(int HoughArea, IplImage hough, CvPoint point, Lines line)
-
{//找當前點的上、右上、右、右下、下
-
//循環搜索,直到兩個方向搜索均無結果,則退出開始下一步判斷 -
CvPoint start;//搜索的初始點 -
start = point;//先將point作為當前的初始點 -
int Max = 0;//找局部最大值 -
CvPoint last = start;//記錄上一次最大值,本次搜索排除當前點和上一次點 -
int mistakes = 0;//引入一個容錯因子 -
//****************************搜索上,右上,右,右下,下*****************************8 -
while(1) -
{ -
CvPoint temp; -
if(start.x >= hough->width-1 || start.y <= 0||start.y >= hough->height-1)//超出搜索范圍,退出搜索 -
break; -
//cout << "curve1" << endl; -
for(int xx = 0;xx < 2; xx++) -
{ -
for(int yy = -1;yy < 2;yy++) -
{ -
if((xx == 0 && yy == 0)||(start.y + yy == last.y && start.x + xx == last.x))//不包括當前點 -
continue; -
//cout << HoughArea[start.y + yy][start.x + xx] << endl; -
if(HoughArea[start.y + yy][start.x + xx] > Max) -
{ -
Max = HoughArea[start.y + yy][start.x + xx]; -
temp.x = start.x + xx; -
temp.y = start.y + yy; -
} -
} -
} -
if(Max > Threshold) -
{ -
//cout << Max << " "; -
mistakes = 0;//容錯清零 -
cout << "find1:"<< Max << endl; -
Max = 0; -
(*line).houghpoint.push_back(temp); -
last = start;//保存上一次最大值 -
start = temp;//找到的點作為當前點繼續搜索 -
CvScalar s; -
s.val[0]=0; -
s.val[1]=255; -
s.val[2]=0; -
//cvSet2D(hough,temp.y,temp.x,s);//set the (i,j) pixel value -
} -
else if(mistakes <= 5)//容錯,三次 -
{ -
mistakes++; -
Max = 0; -
start.x = start.x + 1; -
} -
else//退出條件 -
break;//沒有找到符合條件的點,退出搜索 -
} -
//******************************************************************************* -
CvPoint final; -
final.x = start.x - mistakes; -
final.y = start.y; -
return final; -
}
-
導入包含的庫文件
#include
#include
<opencv2/opencv.hpp>
#include
#include
<opencv2/highgui/highgui.hpp>
#include
using namespace
std;
using namespace cv;
-
讀取圖片
//reading
image*****Mat image;
image = imread("/home/project1/test1.jpg");
if(image.empty()){
cout <<"reading error"<<endl;return -1;
}
- 灰度變換
//gray image****
Mat image_gray;
cvtColor(image,image_gray,
CV_BGR2GRAY);
- canny邊緣檢測
//canny***
Mat image_canny;
Canny(image_gau,
image_canny,100, 200, 3);
總結
以上是生活随笔為你收集整理的车道线检测算法经典编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动驾驶十字路口解决方案
- 下一篇: 三路摄像头后视系统