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

本文介绍车道线检测算法的经典编程实践,通过Catmull-Rom样条曲线进行车道线拟合,并展示了使用霍夫变换检测霍夫空间中曲线的交点,以确定车道线。代码示例中涉及CvPoint坐标处理和图像处理,如灰度转换、Canny边缘检测。
摘要由CSDN通过智能技术生成

车道线检测算法经典编程

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

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

146e659d445370ea51288f114a8753f8.png

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的线。

fea9978f04a7f8267c88467046a7abef.png

1>起始搜索点为A点

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

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

4>起始搜索点回到A点

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

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

结束

84a708588ce3e789dd6148b7a4d25508.png

部分代码如下:

向左搜索:

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边缘检测

f86a0f24a2f3a892615ffe834fd1f3d1.png

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

Mat image_canny;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值