C++ OpenCV实战之车道检测

目录
  • 前言
  • 一、获取车道ROI区域
  • 二、车道检测
    • 1.灰度、阈值
    • 2.获取非零像素点
    • 3.绘制车道线
  • 总结

前言

本文将使用OpenCV C++ 进行车道检测。

一、获取车道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区域,只对该部分进行处理
    vector<Point>pts;
    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.获取非零像素点

我们将图像分为两半。左半边获取左侧车道轮廓点;右半边获取右侧车道轮廓点。

	vector<Point>left_line;
	vector<Point>right_line;

	for (int i = 0; i < thresh.cols / 2; i++)
	{
		for (int j = 0; j < thresh.rows; j++)
		{
			if (thresh.at<uchar>(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<uchar>(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);

		vector<Point>pts;
		pts = { B_L ,T_L ,T_R ,B_R };
		fillPoly(src, pts, Scalar(133, 230, 238));
	}

最终效果如图所示。

总结

本文使用OpenCV C++进行车道检测,关键步骤有以下几点。

1、要根据车道所在位置扣出一个ROI区域,这样方便我们后续的阈值操作。

2、根据阈值图像获取左右车道的轮廓点。这里的阈值处理很重要,直接会影响最后的效果。本文做实时视频处理时,也会因为阈值问题导致最后的效果不是特别好。

3、根据获取到的各车道轮廓点拿出首尾Point就可以绘制车道线以及车道区域了。

到此这篇关于C++ OpenCV实战之车道检测的文章就介绍到这了,更多相关C++ OpenCV车道检测内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于OpenCV实现车道线检测(自动驾驶 机器视觉)

    目录 0 前言 1 车道线检测 2 目标 3 检测思路 4 代码实现 4.1 视频图像加载 4.2 车道线区域 4.3 区域 4.4 canny 边缘检测 4.5 霍夫变换(Hough transform) 4.6 HoughLinesP 检测原理 0 前言 无人驾驶技术是机器学习为主的一门前沿领域,在无人驾驶领域中机器学习的各种算法随处可见,今天学长给大家介绍无人驾驶技术中的车道线检测. 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂,看上去无从下手.那么面对这样极其复杂问题,我们解决问

  • python+opencv实现车道线检测

    python+opencv车道线检测(简易实现),供大家参考,具体内容如下 技术栈:python+opencv 实现思路: 1.canny边缘检测获取图中的边缘信息: 2.霍夫变换寻找图中直线: 3.绘制梯形感兴趣区域获得车前范围: 4.得到并绘制车道线: 效果展示: 代码实现: import cv2 import numpy as np def canny(): gray = cv2.cvtColor(lane_image, cv2.COLOR_RGB2GRAY) #高斯滤波 blur = c

  • opencv车道线检测的实现方法

    车道线检测,需要完成以下功能: 图像裁剪:通过设定图像ROI区域,拷贝图像获得裁剪图像 反透视变换:用的是室外采集到的视频,没有对应的变换矩阵.所以建立二维坐标,通过四点映射的方法计算矩阵,进行反透视变化.后因ROI区域的设置易造成变换矩阵获取困难和插值得到的透视图效果不理想,故没应用 二值化:先变化为灰度图,然后设定阈值直接变成二值化图像. 形态学滤波:对二值化图像进行腐蚀,去除噪点,然后对图像进行膨胀,弥补对车道线的腐蚀. 边缘检测:canny变化.sobel变化和laplacian变化中选

  • Python道路车道线检测的实现

    车道线检测是自动驾驶汽车以及一般计算机视觉的关键组件.这个概念用于描述自动驾驶汽车的路径并避免进入另一条车道的风险. 在本文中,我们将构建一个机器学习项目来实时检测车道线.我们将使用 OpenCV 库使用计算机视觉的概念来做到这一点.为了检测车道,我们必须检测车道两侧的白色标记. 使用 Python 和 OpenCV 进行道路车道线检测 使用 Python 中的计算机视觉技术,我们将识别自动驾驶汽车必须行驶的道路车道线.这将是自动驾驶汽车的关键部分,因为自动驾驶汽车不应该越过它的车道,也不应该进

  • 使用OpenCV对车道进行实时检测的实现示例代码

    项目介绍 下图中的两条线即为车道: 我们的任务就是通过 OpenCV 在一段视频(或摄像头)中实时检测出车道并将其标记出来.其效果如下图所示: 这里使用的代码来源于磐怼怼大神,此文章旨在对其代码进行解释. 实现步骤 1.将视频的所有帧读取为图片: 2.创建掩码并应用到这些图片上: 3.图像阈值化: 4.用霍夫线变换检测车道: 5.将车道画到每张图片上: 6.将所有图片合并为视频. 代码实现 1.导入需要的库 import os import re import cv2 import numpy

  • 基于opencv实现车道线检测

    基于opencv的车道线检测,供大家参考,具体内容如下 原理: 算法基本思想说明: 传统的车道线检测,多数是基于霍夫直线检测,其实这个里面有个很大的误区,霍夫直线拟合容易受到各种噪声干扰,直接运用有时候效果不好,更多的时候通过霍夫直线检测进行初步的筛选,然后再有针对性的进行直线拟合,根据拟合的直线四个点坐标,绘制出车道线,这种方式可以有效避免霍夫直线拟合不良后果,是一种更加稳定的车道线检测方法,在实际项目中,可以选择两种方法并行,在计算出结果后进行叠加或者对比提取,今天分享的案例主要是绕开了霍夫

  • C++ OpenCV实战之车道检测

    目录 前言 一.获取车道ROI区域 二.车道检测 1.灰度.阈值 2.获取非零像素点 3.绘制车道线 总结 前言 本文将使用OpenCV C++ 进行车道检测. 一.获取车道ROI区域 原图如图所示. 使用下面代码段获取ROI区域.该ROI区域点集根据图像特征自己设定.通过fillPoly填充ROI区域,最终通过copyTo在原图中扣出ROI. void GetROI(Mat src, Mat &image) {     Mat mask = Mat::zeros(src.size(), src

  • C++ OpenCV实战之标记点检测的实现

    在实际应用中,能够直接利用霍夫圆检测这些理想方法的应用场景是非常少的,更多的是利用拟合的办法去寻找圆形. 大致思路如下,首先先选择要处理的ROI部分,记录下该图的左上点在原图的坐标,如果原图过大,要先进行等比例缩放:然后利用自适应阈值和Canny边缘提取进行处理,再进行闭运算与轮廓检测,计算点集面积,通过筛选面积阈值去除杂点,最后进行轮廓检测,拟合椭圆,效果如下: 1.导入原图: 2.截取ROI 3.进行自适应阈值化与Canny边缘提取 4.进行闭运算,然后轮廓检测,然后计算点集面积,通过面积阈

  • Python Opencv实战之文字检测OCR

    目录 1.相关函数的讲解 2.代码展示 Detecting Words Detecting ONLY Digits 3.问题叙述 4.image_to_data()配置讲解 5.项目拓展 6.总结与评价 1.相关函数的讲解 image_to_data()的输出结果是表格形式,输出变量的类型依旧是字符串. 你会得到一个这样的列表['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', '

  • Python实战之OpenCV实现猫脸检测

    开发工具 Python版本:3.6.4 相关模块: cv2模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 简单地讲一讲Haar分类器,也就是Viola-Jones识别器. 详细的原理说明可参考相关文件中的两篇论文: Rapid Object Detection using a Boosted Cascade of Simple Features; Robust Real-Time Face Detection. (1

  • C++ OpenCV实战之网孔检测的实现

    目录 前言 一.HSV通道转换 二.图像修复 2.1 OpenCV函数实现 2.2 MyFunction 三.轮廓提取 四.效果显示 五.源码 总结 前言 前段时间,有位粉丝私信我,给我发了一张图片,如下图所示: 在这里贴出他的原话. 从他给的图片分析,该图存在遮挡,所以不能简单的二值化,然后提取图像轮廓去寻找结果.所以,我就想如何去掉这些遮挡物(即图像修复).从图像可知,该遮挡物是黄色的线,所以,我就想可否使用hsv色彩空间提取出黄色,然后得到二值掩模图像,最后对原图进行修复.接下来,就一起看

  • C++ OpenCV实战之零部件的自动光学检测

    目录 一.背景 二.基础知识 三.代码实现 1.实现多窗口展示 2.降噪处理 3.背景去除 4.连通图实现 5.计算连通域面积 6.轮廓检测 四.总结 一.背景 首先任务背景是AOI(自动光学检测) 最重要的目的在于:将前景和物体进行分割与分类: 场景示意图: 需要注意,在螺母的传送带上,需要有前光和背光,给物体打光才能够拍摄清晰的图像: 二.基础知识 首先分为以下几步: 1.噪声抑制(预处理) 2.背景移除(分割) 3.二值化 4.连通域.轮廓查找算法 降噪算法 先使用中值滤波对椒盐噪声进行过

  • Python+Opencv实战之人脸追踪详解

    目录 前言 人脸追踪技术简介 使用基于 dlib DCF 的跟踪器进行人脸跟踪 使用基于 dlib DCF 的跟踪器进行对象跟踪 小结 前言 人脸处理是人工智能中的一个热门话题,人脸处理可以使用计算机视觉算法从人脸中自动提取大量信息,例如身份.意图和情感:而目标跟踪试图估计目标在整个视频序列中的轨迹,其中只有目标的初始位置是已知的,将这两者进行结合将产生许多有趣的应用.由于外观变化.遮挡.快速运动.运动模糊和比例变化等多种因素,人脸追踪非常具有挑战性. 人脸追踪技术简介 基于判别相关滤波器 (d

  • Python人脸检测实战之疲劳检测

    目录 使用 OpenCV 构建犯困检测器 测试疲劳检测器 今天我们实现疲劳检测. 如果眼睛已经闭上了一段时间,我们会认为他们开始打瞌睡并发出警报来唤醒他们并引起他们的注意.我们测试一段视频来展示效果.同时代码中保留开启摄像头的的代码,取消注释即可使用. 使用 OpenCV 构建犯困检测器 要开始我们的实现,打开一个新文件,将其命名为 detect_drowsiness.py ,并插入以下代码: # import the necessary packages from scipy.spatial

  • C++ OpenCV实战之手势识别

    目录 前言 一.手部关键点检测 1.1 功能源码 1.2 功能效果 二.手势识别 2.1算法原理 2.2功能源码 三.结果显示 3.1功能源码 3.2效果显示 四.源码 总结 前言 本文将使用OpenCV C++ 实现手势识别效果.本案例主要可以分为以下几个步骤: 1.手部关键点检测 2.手势识别 3.效果显示 接下来就来看看本案例具体是怎么实现的吧!!! 一.手部关键点检测 如图所示,为我们的手部关键点所在位置.第一步,我们需要检测手部21个关键点.我们使用深度神经网络DNN模块来完成这件事.

  • OpenCV停车场车位实时检测项目实践

    目录 1. 写在前面 2. 整体流程梳理 3. 数据预处理 3.1 背景过滤 3.2 Canny边缘检测 3.3 停车场区域提取 3.4 霍夫变换检测直线 3.5 以列为单位,划分停车位 3.6 锁定每个停车位 3.7 为CNN生成预测图片 4. 模型的训练和预测 4.1 模型训练 4.2 模型预测 5. 小结 1. 写在前面 今天整理OpenCV入门的第三个实战小项目,前面的两篇文章整理了信用卡数字识别以及文档OCR扫描, 大部分用到的是OpenCV里面的基础图像预处理技术,比如轮廓检测,边缘

随机推荐