C++ OpenCV如何实现车道检测
发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,这篇文章主要为大家展示了"C++ OpenCV如何实现车道检测",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C++ OpenCV如何实现车道检测"这篇文章
千家信息网最后更新 2024年11月11日C++ OpenCV如何实现车道检测
这篇文章主要为大家展示了"C++ OpenCV如何实现车道检测",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C++ OpenCV如何实现车道检测"这篇文章吧。
一、获取车道ROI区域
原图如图所示。
使用下面代码段获取ROI区域。该ROI区域点集根据图像特征自己设定。通过fillPoly填充ROI区域,最终通过copyTo在原图中扣出ROI。
void GetROI(Mat src, Mat &image){ Mat mask = Mat::zeros(src.size(), src.type()); int width = src.cols; int height = src.rows; //获取车道ROI区域,只对该部分进行处理 vectorpts; Point ptA((width / 8) * 2, (height / 20) * 19); Point ptB((width / 8) * 2, (height / 8) * 7); Point ptC((width / 10) * 4, (height / 5) * 3); Point ptD((width / 10) * 5, (height / 5) * 3); Point ptE((width / 8) * 7, (height / 8) * 7); Point ptF((width / 8) * 7, (height / 20) * 19); pts = { ptA ,ptB,ptC,ptD,ptE, ptF }; fillPoly(mask, pts, Scalar::all(255)); src.copyTo(image, mask);}
mask图像如图所示。有了mask图像,我们就可以更好的进行后续处理,以检测车道线。
二、车道检测
1.灰度、阈值
Mat gray; cvtColor(image, gray, COLOR_BGR2GRAY); Mat thresh; threshold(gray, thresh, 180, 255, THRESH_BINARY); imshow("thresh", thresh);
经过灰度、阈值后的图像如下图所示。
2.获取非零像素点
我们将图像分为两半。左半边获取左侧车道轮廓点;右半边获取右侧车道轮廓点。
vectorleft_line; vector right_line; for (int i = 0; i < thresh.cols / 2; i++) { for (int j = 0; j < thresh.rows; j++) { if (thresh.at (j, i) == 255) { left_line.push_back(Point(i, j)); } } } for (int i = thresh.cols / 2; i < thresh.cols; i++) { for (int j = 0; j < thresh.rows; j++) { if (thresh.at (j, i) == 255) { right_line.push_back(Point(i, j)); } } }
3.绘制车道线
我们将从left_line、right_line容器中各拿出首尾两个点作为车道线的起始点。
注意:这里要加一个if判断语句,否则当容器为空时(未检测到车道线),容器会溢出。
if (left_line.size() > 0 && right_line.size() > 0) { Point B_L = (left_line[0]); Point T_L = (left_line[left_line.size() - 1]); Point T_R = (right_line[0]); Point B_R = (right_line[right_line.size() - 1]); circle(src, B_L, 10, Scalar(0, 0, 255), -1); circle(src, T_L, 10, Scalar(0, 255, 0), -1); circle(src, T_R, 10, Scalar(255, 0, 0), -1); circle(src, B_R, 10, Scalar(0, 255, 255), -1); line(src, Point(B_L), Point(T_L), Scalar(0, 255, 0), 10); line(src, Point(T_R), Point(B_R), Scalar(0, 255, 0), 10); vectorpts; pts = { B_L ,T_L ,T_R ,B_R }; fillPoly(src, pts, Scalar(133, 230, 238)); }
最终效果如图所示。
以上是"C++ OpenCV如何实现车道检测"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
车道
检测
区域
图像
C++
内容
容器
篇文章
如图
半边
原图
灰度
轮廓
阈值
j++
处理
学习
帮助
两个
代码
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
奥创中心连不上服务器
镇魔曲服务器列表
开软件开发工作室的好处
湖南运营网络技术服务哪家好
摩尔庄园如何看服务器
软件开发电脑培训学校
环保管家软件开发方案书
徐汇区正规软件开发服务智能系统
点豆山东网络技术公司
艾莱迪网络技术有限公司
珠海软件开发培训
数据库不小心删除了表数据怎么办
育碧超猎都市服务器
p2p连接服务器
江西国家网络安全新闻
成都嵌入式软件开发
广州远光软件开发福利待遇
规则不是数据库对象
上海有机标准图谱数据库
服务器建立网站
怎么看db2数据库
汽车网络技术与维修是什么课程
网络安全海报8k
西安高新软件开发招聘信息
软件开发计划书框架
cq服务器异常什么意思
网络安全虚拟机实验报告
怎么用云服务器联机玩红警
小班网络安全 教案
今天B站是不是服务器炸了