【问题标题】:OpenCV - Lane detetion, both yellow and white lanesOpenCV - 车道检测,黄色和白色车道
【发布时间】:2019-09-17 09:24:06
【问题描述】:

我有赛车游戏的公路照片。

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

如果我使用 RGB 空间,

def select_rgb_white_yellow(image): 
    # white color mask
    lower = np.uint8([123, 116, 116])
    upper = np.uint8([186, 172, 160])
    white_mask = cv2.inRange(image, lower, upper)
    # yellow color mask
    lower = np.uint8([134, 121, 100])
    upper = np.uint8([206, 155, 87])
    yellow_mask = cv2.inRange(image, lower, upper)
    # combine the mask
    mask = cv2.bitwise_or(white_mask, yellow_mask)
    masked = cv2.bitwise_and(image, image, mask = mask)
    return masked

我只有白色车道。
所以稍微调整一下,使用 HLS 空间,使用这段代码。

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

然后,再次提取黄白车道,

def select_white_yellow(image):
    converted = convert_hls(image)
    # white color mask
    lower = np.uint8([0, 0, 0])
    upper = np.uint8([0, 0, 255])
    white_mask = cv2.inRange(converted, lower, upper)
    # yellow color mask
    lower = np.uint8([ 10,   0, 100])
    upper = np.uint8([ 40, 255, 255])
    yellow_mask = cv2.inRange(converted, lower, upper)
    # combine the mask
    mask = cv2.bitwise_or(white_mask, yellow_mask)
    return cv2.bitwise_and(image, image, mask = mask)

然后它就无法检测到白色车道了。有没有同时检测白色和黄色车道的好方法?



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

Yellow
c2974A (194, 149, 74)
a07444 (160, 116, 68)
b38e55 (179, 142, 85)
867964 (134, 121, 100)
ce9b57 (206, 155, 87)
ce9853 (206, 152, 83)

white
b4a59d (180, 165, 157)
b9a99a (185, 169, 154)
baaca0 (186, 172, 160)
867e79 (134, 126, 121)
7b7474 (123, 116, 116)
827d7c (130, 125, 124)

【问题讨论】:

  • 我认为你应该分两个阶段来解决这个问题。先分出道路区域,然后得到线路。您可以在两者之间增强颜色以使其更容易。我使用this 脚本进行了快速测试,HSV 色彩空间似乎对白线效果很好,对于黄色,周围环境仍然是一个问题。因此:先把路分开;)
  • @J.D. separate out the road 是什么意思?切割天空部分?

标签: python opencv machine-learning computer-vision object-detection


【解决方案1】:

扩展评论:这是一个两阶段方法的实现。花一些时间查看中间图像/蒙版,以充分了解发生的一切。

裁剪到感兴趣的区域
您可以自动执行此操作,但我作弊了一点并手动完成了。裁剪的天空区域很少有路面,我认为这是一个简单的解决方案(目前)就足够了。同样,我还剪掉了右侧的 HUD 框,因为它们与道路具有相似的灰色并且会产生干扰。在它们上面画黑框更整洁,因此它们被排除在处理之外。

隔离道路
将裁剪后的图像转换为 HSV,仅选择灰色值。在去除了一些噪声之后,我使用 findContours 改进了遮罩来绘制凸包。如果性能是一个问题,您可以通过调整 close mask 步骤来跳过它。

选择行
使用蒙版,您可以创建仅道路表面的图像。您可以将其用于颜色分离,而不必担心选择环境。我的结果并不完美,但我假设您拥有更大版本的图像,这将提供更好的结果。

结果:

代码:

import cv2
import numpy as np 

# load image
image = cv2.imread('pw12b.jpg')
# crop image
h,w = image.shape[:2]
image = image[200:h-20,20:550]
# create hsv
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# set lower and upper color limits
low_val = (0,0,0)
high_val = (179,45,96)
# Threshold the HSV image 
mask = cv2.inRange(hsv, low_val,high_val)
# remove noise
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel=np.ones((8,8),dtype=np.uint8))
# close mask
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel=np.ones((20,20),dtype=np.uint8))

# improve mask by drawing the 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)
# erode mask a bit to migitate mask bleed of convexhull
mask = cv2.morphologyEx(mask, cv2.MORPH_ERODE, kernel=np.ones((5,5),dtype=np.uint8))

# remove this line, used to show intermediate result of masked road
road = cv2.bitwise_and(image, image,mask=mask)

# apply mask to hsv image
road_hsv = cv2.bitwise_and(hsv, hsv,mask=mask)
# set lower and upper color limits
low_val = (0,0,102)
high_val = (179,255,255)
# Threshold the HSV image 
mask2 = cv2.inRange(road_hsv, low_val,high_val)
# apply mask to original image
result = cv2.bitwise_and(image, image,mask=mask2)

#show image
cv2.imshow("Result", result)
cv2.imshow("Road", road)
cv2.imshow("Mask", mask)
cv2.imshow("Image", image)

cv2.waitKey(0)
cv2.destroyAllWindows()

【讨论】:

  • 可以用这个做视频吗?我的最终目标是在无法裁剪或清理导航框的视频剪辑上使用线检测
  • 当然。视频只是一系列图像,您可以单独处理。您可以按照上述方式保留裁剪,但它可能不适用于所有情况。您可以尝试使用水平检测使其自动化。裁剪不是绝对必要的,只要您可以干净地选择道路区域即可。不过,较小的图像会提高性能。导航框/后视镜总是在同一个地方,所以要排除那些你可以把那个区域设置为黑色:image[100:200,100:200] = (0,0,0)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 2016-04-07
  • 2014-03-15
  • 2016-08-04
  • 2012-02-29
  • 1970-01-01
相关资源
最近更新 更多