车道线检测算法经典编程
车道线检测算法经典编程
- 车道线曲线拟合算法编程
计算经过(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);
总结
以上是生活随笔为你收集整理的车道线检测算法经典编程的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 自动驾驶十字路口解决方案
- 下一篇: 三路摄像头后视系统