没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本篇文章是在学习C++的时候做的小项目,对目前的方法进行了稍微的改动,效果还可以。目前车道线检测方面的方法主要包括:基于Hough变换、基于透视变换、基于机器学习和深度学习。其中第一种方法是根据车道线与周围环境的物理特征差异进行图像的处理,从而检测到车道线,该方法复杂度较低,实时性较高,但易受到道路环境的干扰,而且Hough变换的直线检测特质导致了该方法在道路曲率较大时的检测误差较大。本文是利用c++和Hough变换实现对车道线的检测。
资源推荐
资源详情
资源评论
基于 Hough 变换的车道线检测
(本篇文章是在学习 C++的时候做的小项目,对目前的方法进行了稍微的改动,
效果还可以。)
目前车道线检测方面的方法主要包括:基于 Hough 变换、基于透视变换、基
于机器学习和深度学习。其中第一种方法是根据车道线与周围环境的物理特征差
异进行图像的处理,从而检测到车道线,该方法复杂度较低,实时性较高,但易
受到道路环境的干扰,而且 Hough 变换的直线检测特质导致了该方法在道路曲
率较大时的检测误差较大。
基于 Hough 变换的车道线检测的基本步骤如下:
1. 对视频进行处理,将视频流转化为一帧帧的图像。
cv::Mat frame;
cv::VideoCapture capture(“challenge.mp4”);
capture >> frame;
2. 图像转换为灰度图像
cv::Mat LaneDetector::Image_preprocessing(cv::Mat input_image)
{
cv::Mat binarization_image, gray_image,dst;
int blockSize = 5; //adaptiveThreshold 的计算单位是像素的邻域块,
邻域块取多大,就由这个值作决定
int constValue = 5; //这个参数实际上是一个偏移值调整量
const int maxVal = 255;
int adaptiveMethod = 1;
int thresholdType = 1;
cv::cvtColor(input_image, gray_image, cv::COLOR_RGB2GRAY);
//实现色彩的空间转换,灰度化图像
//二值化似乎用不到
//cv::threshold(gray_image, binarization_image, 140, 255,
cv::THRESH_BINARY); //固定会二值化图像,cv::THRESH_BINARY 是二
值化的类型
//cv::adaptiveThreshold(gray_image, binarization_image,maxVal,
adaptiveMethod, thresholdType, blockSize,constValue); //自适应二值化图像,
效果更好
cv::imshow("gray_image", gray_image); //imshow()函数功能就是
把你刚才载入的图片显示出来。
return gray_image;
}
Image
Image_gray
3. 利用自适应高低阈值 canny 和色彩阈值融合方法进行边缘检测
3.1 自适应高低阈值 canny(需要注意,在进行 canny 边缘检测前要先进性高斯滤
波)
cv::Mat LaneDetector::edgeDetector(cv::Mat binarization_image)
{
cv::Mat image_Gauss, can_image;
cv::GaussianBlur(binarization_image, image_Gauss, cv::Size(3, 3), 0, 0);
double low = 50, high = 150;
//AdaptiveFindThreshold(image_Gauss, &low, &high, 3);
auto_threshold(image_Gauss, low, high, 0.5);
cout << low << "\t" << high << endl;
cv::Canny(image_Gauss, can_image, low, high, 3);
cv::imshow("can_image", can_image); //imshow()函数功能就是把
你刚才载入的图片显示出来。
return can_image;
}
3.2 利用色彩阈值来识别车道线,主要原理是利用与背景的颜色差异来识别,车
道线的颜色一般是白色和黄色。
//HLS色彩阈值
cv::Mat LaneDetector::hls_elect(cv::Mat input_image, const char& channel, const
int& thresh_min, const int& thresh_max)
{
cv::Mat hls, grad, image_hls;
vector<cv::Mat> channels;
cv::cvtColor(input_image, hls, cv::COLOR_RGB2HLS);
//分离通道
cv::split(hls, channels);
//选择通道
switch (channel)
{
case 'h':
grad = channels.at(0);
break;
case 'l':
grad = channels.at(1);
break;
case 's':
剩余9页未读,继续阅读
资源评论
编程小白ysd
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功