Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV-车道绕行,黄色和白色车道_Python_Opencv_Machine Learning_Computer Vision_Object Detection - Fatal编程技术网

Python OpenCV-车道绕行,黄色和白色车道

Python OpenCV-车道绕行,黄色和白色车道,python,opencv,machine-learning,computer-vision,object-detection,Python,Opencv,Machine Learning,Computer Vision,Object Detection,我有赛车比赛的公路照片。 我想检测黄色和白色车道。 如果我使用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

我有赛车比赛的公路照片。

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

如果我使用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)

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

裁剪到感兴趣的区域
你可以自动完成这项工作,但我有点作弊,是手工完成的。裁剪过的天空区域很少有路面,我认为这是一个简单的解决方案,现在就足够了。类似地,我也在右侧切割了HUD框,因为它们与道路具有相似的灰色,并且相互干扰。在它们上面画黑框更为简洁,因此它们被排除在处理之外

隔离道路
将裁剪后的图像转换为HSV,并仅选择灰度值。在一些噪声消除后,我改进了掩模,使用findContours来绘制凸面。如果性能有问题,您可以通过调整
close mask
步骤跳过它

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

结果:

代码:


我认为你应该分两个阶段来解决这个问题。首先划分出道路区域,然后划分出线路。你可以在两者之间增加颜色,使之更容易。我用脚本做了一个快速测试,HSV的颜色空间对于白线来说似乎工作得很好,对于黄色来说,环境仍然是个问题。因此:先将道路分开;)@J.D.
将道路分开是什么意思?剪掉天空部分?是否可以将此部分用于视频剪辑?我的最终目标是在视频剪辑上使用线条检测,我无法裁剪或清理这些视频剪辑。视频只是一系列图像,您可以单独处理。您可以如上所述保留裁剪,但并非在所有情况下都是好的。您可以尝试使用地平线检测将其自动化。只要你能选择一个干净的道路区域,裁剪就不是绝对必要的。更小的图像可以提高性能。导航框/后视镜始终位于同一位置,因此要排除这些区域,只需将该区域设置为黑色:
image[100:200100:200]=(0,0,0)
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()