C++ OpenCV如何实现车道检测
发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,这篇文章主要为大家展示了"C++ OpenCV如何实现车道检测",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C++ OpenCV如何实现车道检测"这篇文章
千家信息网最后更新 2025年11月14日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安全错误
数据库的锁怎样保障安全
软件开发的日语
刺激战场怎么打不开服务器
学计算机技术可以软件开发吗
数据库所
应急管理数据库
win10怎么初始化数据库
湖南服务器防火墙多少钱
数据库软件查询信息失败
自托管数据库是什么
网络技术需要注意什么
重庆计算机软件开发正规平台
电子交易网络安全风险
江西个人软件开发销售
新疆胡杨林网络技术有限公司
网络安全教育专栏
网络安全法个人信息规则包括
药智辅料数据库
济南量化积分管理软件开发电话
天津多功能软件开发市价
excle做数据库的应用
戴尔R3服务器配置
数据库硬盘空间满了
嘶吼网络安全产业研究
重庆余丑软件开发中心
刺激战场什么服务器有破晓生还
学生宿舍系统数据库
小飞象服务器
怀旧服服务器上不了线
软件开发测试男朋友生气
方舟服务器连接超时是什么意思