# **基于自实现opencv图像处理函数的静态车道线检测项目**
<!-- TOC -->
- [**基于自实现opencv图像处理函数的静态车道线检测项目**](#基于自实现opencv图像处理函数的静态车道线检测项目)
- [**1.项目背景**](#1项目背景)
- [**2.实现**](#2实现)
- [**2.1 基本思路: 去噪,边缘提取,车道检测**](#21-基本思路-去噪边缘提取车道检测)
- [**2.2 实现过程**](#22-实现过程)
- [**3. 结果分析**](#3-结果分析)
- [**4. 后续**](#4-后续)
<!-- /TOC -->
## **1.项目背景**
**起源于选修邸慧军老师的《数字图像处理》这门课程的最终课程设计项目 :实现车道线检测**
1. 不能用神经网络(老师的原话是直接喂给神经网络就没有意思了),只能用数字图像处理方法
2. 除了读取与写入之外不能使用其他现成库函数,比如大名鼎鼎的opencv
3. 其实本来计划是MATLAB(教学也是MATLAB),后来我校突然就进美国名单里MATLAB用不了就改c++了
**数据集**
数据集由720*1280的jpg格式图片组成,实际上就是开车在公路沿途拍下来的,因为我发现数据集的图片之间很有连贯性。其中一张如图所示:
![avatar](./车道线检测/source/20.jpg)
**环境**
我是win10 + vs2019。记得配置opencv,用来读取图片。
## **2.实现**
### **2.1 基本思路: 去噪,边缘提取,车道检测**
但在刚刚开始的时候无从下手,因为选择太多了。
比如说去噪音可以高斯滤波,均值滤波,中值滤波。
边缘提取你又可以拉普拉斯锐化,sobel算子,Robert算子,scharr算子,candy检测。
于是我干脆把这些实现一个遍,再慢慢选择好了。
于是自实现了以下算法:
1. 彩色图像转灰度
2. 图像翻转,获得负片
3. 线性灰度转换
4. 对数灰度转换
5. 指数灰度转换
6. 方框滤波
7. 均值滤波
8. 高斯滤波
9. 中值滤波
10. 最值滤波
11. 拉普拉斯锐化
12. 漫水填充
13. 阈值分割
14. 自适应阈值分割
15. candy边缘检测
16. scharr边缘检测
17. sobel边缘检测
18. Robert边缘检测
19. 霍夫直线检测
20. 直方图均衡化
**所有算法源码均定义位于minicv.h下,最下面有接口参数说明;所有实现位于minicv.cpp下,关键步骤有注释**
### **2.2 实现过程**
0. **以此图片为实例**
![avatar](./车道线检测/source/20.jpg)
1. **转灰度图**,公式是GRAY = B * 0.114 + G * 0.587 + R * 0.299。目的是为了减少运算量,简化操作。
```c++
_getGray(img) //有些函数会与opencv重名,所以我自实现的都带下划线。其实也可以自定义namespace
```
效果:
![avatar](./车道线检测/source/21.png)
2. **均值滤波去噪音**。
实际上我认为施加平滑滤波的主要原因不是为了去除噪音,因为对于斑点噪音,实际上后面的霍夫变换基本上会忽略。
我认为施加滤波之后图像边模糊了(废话)——图片的边缘变宽了,一些细线变粗相当有利于后面的边缘检测。
另外,试了高斯滤波与均值滤波,效果相当,就选简单的均值滤波吧
施加均值滤波后效果如下
```c++
_blur(img, 3, 3); //大小是 3*3
```
![avatar](./车道线检测/source/22.png)
3. **幂指变换**。 本来是没有这一步的,但是到最后发现没有这一步对比较暗的图片实现效果比较差,因为后面有一步数阈值分割。
**我把这一步看作这个算法成功的关键之一(另一个是霍夫变换)**。于是增亮有两个选择,直方图均衡化或者幂指变换,事实证明后者效果更加好,
使图像整体效果更加符合人眼,也非常有利于阈值选择的普适性
```c++
_gammaGrayReform(img, 2, 1);
```
![avatar](./车道线检测/source/23.png)
4. **背景以及两侧扣图**
背景以及两侧噪音很多,不如直接把他们给剔除,毕竟数据集车道线主要是前方中间区域
**代码中我基本上用at方法访问像素,后来知道了指针方法更加快**,不过at比较符合数组访问形式(懒得改.....)
```c++
int h = img.rows; //背景处理,减少噪音与运算量
int w = img.cols;
for (int i = 0; i < h * 2 / 5; i++) {
for (int j = 0; j < w; j++) {
img.at<uchar>(i, j) = 0;
}
}
```
注意两侧处理要在拉普拉斯锐化之后,否则拉普拉斯会把两条直线看作边缘了
```c++
img = _lpFilter(img, 1); //拉普拉斯锐化
img = _myFilter(img, ker); //检测y方向边缘
for (int i = 0; i < h; i++) { //两侧处理,减少噪音与运算量
for (int j = 0; j < w; j++) {
if ((double)i <= -0.8 * j + (double)600 || (double)i <= 0.8 * j - (double)440) {
img.at<uchar>(i, j) = 0;
}
}
}
```
5. **拉普拉斯锐化**本质是为了提取边缘,经过实践发现scharr算子增加了很多不必要的细节,Robert算子和sobel算子也实现效果均不如拉普拉斯,
candy算法一个是效果比较慢,另一个是延迟阈值化的两端参数不能很好的普适(有些图合适,另一些不一定合适)。
```c++
_lpFilter(img, 1);//1是选择核的参数,感兴趣可以阅读代码
```
为了感受边缘提取的效果特地去除了背景扣图这一部分
![avatar](./车道线检测/source/24.png)
6. **检测y方向边缘**。考虑到车道线基本分布在y方向,偏差不会太大。自定义了一个检测y方向的算子
```c++
const vector<vector<double>> ker = { //用于检测y方向边缘的算子
{-1,0,1},
{-2,0,2},
{-1,0,1}
};
_myFilter(img, ker);
```
为了感受边缘提取的效果特地去除了背景扣图这一部分
![avatar](./车道线检测/source/25.png)
7. **阈值分割** 一来为了减少运算量,二来也是减少了不必要的干扰
```c++
_thredShold(img, 120);
```
![avatar](./车道线检测/source/26.png)
8. **霍夫检测**。可以说是本算法的灵魂了,发现(发明?)这种方法的简直是天才,抗干扰性非常非常强大!
```c++
_houghDetectline(img);
```
其他实现就不贴代码了,这个霍夫变换实现代码值得贴出来。(这是我的粗糙版本,opencv自带的算法肯定处理得好很多很多)
可以大大优化在于: vote可以用unordered_map实现,它的增删查改操作都是O(1),但是需要自定义哈希函数等等额外操作。
```c++
cv::Mat _houghDetectline(const cv::Mat& src) {
Mat img = src.clone();
extern const double PI;
const int h = img.rows;
const int w = img.cols;
const int n = h * w + 1000;
map<vector<int>, int> vote; //统计票数 vector0-r , vector1-theta
int max = 0;
for (int y = 0; y < h; y++) { //霍夫空间计算票数
for (int x = 0; x < w; x++) {
if (img.at<uchar>(y, x) <= 20) { //减少计算量
continue;
}
for (int theta = 20; theta <= 180; theta++) {
if (abs(theta - 90) <= 10 ) { //一般车道线都是前方,而不是垂直与前方
continue;
}
int r = x * cos(theta * PI / 180) + y * sin(theta * PI / 180);
vote[{r,theta}] ++;
if (max <= vote[{r, theta}]) {
max = vote[{r, theta}];
//cout<<"vote = "<< max << " r = " << r << " theta = " << theta << endl;
}
}
}
}
vector<vector<bool>> mask(h, vector<bool>(w));
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
mask[y][x] = 0;
}
}
int line = 2; //两条车道线
while (line--) {
auto it = max_element(vote.begin(), vote.end(), cmp_value);
int r = it->first[0]; //cout << r << " ";
int theta = it->first[1]; //cout << theta << endl;
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
int tar = x * cos(theta
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【探索人工智能的宝藏之地】 无论您是计算机相关专业的在校学生、老师,还是企业界的探索者,这个项目都是为您量身打造的。无论您是初入此领域的小白,还是寻求更高层次进阶的资深人士,这里都有您需要的宝藏。不仅如此,它还可以作为毕设项目、课程设计、作业、甚至项目初期的立项演示。 【人工智能的深度探索】 人工智能——模拟人类智能的技术和理论,使其在计算机上展现出类似人类的思考、判断、决策、学习和交流能力。这不仅是一门技术,更是一种前沿的科学探索。 【实战项目与源码分享】 我们深入探讨了深度学习的基本原理、神经网络的应用、自然语言处理、语言模型、文本分类、信息检索等领域。更有深度学习、机器学习、自然语言处理和计算机视觉的实战项目源码,助您从理论走向实践,如果您已有一定基础,您可以基于这些源码进行修改和扩展,实现更多功能。 【期待与您同行】 我们真诚地邀请您下载并使用这些资源,与我们一起在人工智能的海洋中航行。同时,我们也期待与您的沟通交流,共同学习,共同进步。让我们在这个充满挑战和机遇的领域中共同探索未来!
资源推荐
资源详情
资源评论
收起资源包目录
人工智能项目资料-基于自实现opencv图像处理函数的静态车道线检测项目.zip (131个子文件)
MiniCv.cpp 14KB
main.cpp 2KB
.DS_Store 86KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
MiniCv.h 4KB
readMe.html 24KB
20.jpg 336KB
32.jpg 331KB
13.jpg 283KB
33.jpg 276KB
8.jpg 274KB
20.jpg 271KB
20.jpg 270KB
20.jpg 269KB
20.jpg 267KB
28.jpg 266KB
7.jpg 258KB
20.jpg 257KB
20.jpg 253KB
27.jpg 253KB
5.jpg 252KB
10.jpg 251KB
20.jpg 250KB
20.jpg 249KB
25.jpg 244KB
30.jpg 241KB
20.jpg 239KB
20.jpg 235KB
20.jpg 234KB
20.jpg 232KB
20.jpg 228KB
20.jpg 227KB
20.jpg 225KB
20.jpg 224KB
0.jpg 223KB
1.jpg 223KB
20.jpg 221KB
9.jpg 221KB
20.jpg 217KB
21.jpg 216KB
20.jpg 215KB
20.jpg 215KB
29.jpg 212KB
20.jpg 207KB
20.jpg 203KB
2.jpg 202KB
20.jpg 201KB
20.jpg 200KB
4.jpg 197KB
20.jpg 197KB
20.jpg 193KB
共 131 条
- 1
- 2
资源评论
妄北y
- 粉丝: 2w+
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功