OpenCV – 车道检测,同时检测黄色和白色车道

我有一组赛车游戏中的道路照片。enter image description here

我想检测黄色和白色的车道。

如果我使用RGB颜色空间,

def select_rgb_white_yellow(image):     # 白色颜色掩码    lower = np.uint8([123, 116, 116])    upper = np.uint8([186, 172, 160])    white_mask = cv2.inRange(image, lower, upper)    # 黄色颜色掩码    lower = np.uint8([134, 121, 100])    upper = np.uint8([206, 155, 87])    yellow_mask = cv2.inRange(image, lower, upper)    # 合并掩码    mask = cv2.bitwise_or(white_mask, yellow_mask)    masked = cv2.bitwise_and(image, image, mask = mask)    return masked

enter image description here

我只能检测到白色的车道。
所以我稍微调整了一下,使用HLS颜色空间,通过以下代码。

def convert_hls(image):    return cv2.cvtColor(image, cv2.COLOR_RGB2HLS)

enter image description here

然后,再次提取黄色和白色的车道,

def select_white_yellow(image):    converted = convert_hls(image)    # 白色颜色掩码    lower = np.uint8([0, 0, 0])    upper = np.uint8([0, 0, 255])    white_mask = cv2.inRange(converted, lower, upper)    # 黄色颜色掩码    lower = np.uint8([ 10,   0, 100])    upper = np.uint8([ 40, 255, 255])    yellow_mask = cv2.inRange(converted, lower, upper)    # 合并掩码    mask = cv2.bitwise_or(white_mask, yellow_mask)    return cv2.bitwise_and(image, image, mask = mask)

enter image description here

然后它就无法再检测到白色的车道了。有什么好的方法可以同时检测黄色和白色的车道吗?

这里是我找到的所有RGB颜色代码

Yellowc2974A (194, 149, 74)a07444 (160, 116, 68)b38e55 (179, 142, 85)867964 (134, 121, 100)ce9b57 (206, 155, 87)ce9853 (206, 152, 83)whiteb4a59d (180, 165, 157)b9a99a (185, 169, 154)baaca0 (186, 172, 160)867e79 (134, 126, 121)7b7474 (123, 116, 116)827d7c (130, 125, 124)

回答:

为了扩展评论:这是一个两阶段方法的实现。花一些时间查看中间图像/掩码,以完全理解发生的一切。

裁剪到感兴趣区域
你可以自动化这个过程,但我作弊了一点,进行了手动裁剪。裁剪掉的天空区域很少会有路面,这是目前我认为足够简单的一个解决方案。同样,我还裁剪了右侧的HUD框,因为它们与道路有相似的灰色,会干扰检测。更整洁的做法是在它们上面画黑框,这样它们就可以从处理中排除。

隔离道路
将裁剪后的图像转换为HSV格式,并选择仅灰色值。在进行了一些噪声去除后,我通过findContours改进了掩码,绘制了convexhull。如果性能是一个问题,你可以通过调整close mask步骤来跳过它。

选择线条
使用掩码,你可以创建一个仅包含道路表面的图像。你可以使用这个进行颜色分离,而不必担心也选择周围环境。我的结果不是完美的,但我假设你有更大版本的图像,这将给出更好的结果。

结果:enter image description here

代码:

import cv2import numpy as np # 加载图像image = cv2.imread('pw12b.jpg')# 裁剪图像h,w = image.shape[:2]image = image[200:h-20,20:550]# 创建HSVhsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# 设置颜色下限和上限low_val = (0,0,0)high_val = (179,45,96)# 阈值化HSV图像 mask = cv2.inRange(hsv, low_val,high_val)# 去除噪声mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel=np.ones((8,8),dtype=np.uint8))# 闭合掩码mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel=np.ones((20,20),dtype=np.uint8))# 通过绘制convexhull改进掩码 ret, contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for cnt in contours:    hull = cv2.convexHull(cnt)    cv2.drawContours(mask,[hull],0,(255), -1)# 稍微侵蚀掩码以减轻convexhull的掩码溢出mask = cv2.morphologyEx(mask, cv2.MORPH_ERODE, kernel=np.ones((5,5),dtype=np.uint8))# 删除此行,用于显示道路掩码的中间结果road = cv2.bitwise_and(image, image,mask=mask)# 将掩码应用于HSV图像road_hsv = cv2.bitwise_and(hsv, hsv,mask=mask)# 设置颜色下限和上限low_val = (0,0,102)high_val = (179,255,255)# 阈值化HSV图像 mask2 = cv2.inRange(road_hsv, low_val,high_val)# 将掩码应用于原始图像result = cv2.bitwise_and(image, image,mask=mask2)#显示图像cv2.imshow("Result", result)cv2.imshow("Road", road)cv2.imshow("Mask", mask)cv2.imshow("Image", image)cv2.waitKey(0)cv2.destroyAllWindows()

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注