点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
在这篇文章中,我将介绍如何从视频中查找并标记车道。被标记的车道会显示到视频上,并得到当前路面的曲率以及车辆在该车道内的位置。首先我们需要对图像进行相机失真校正,这里就不作详细介绍了。我们的关键任务是识别图片中属于车道的像素,为此我们使用了“颜色阈值”的概念。
梯度阈值
在Canny Edge Detection中,我们采用了整体梯度,这有助于我们检测强度或颜色急剧变化的区域。为此,canny边缘检测使用Sobel算子,该算子近似于在一个方向上获取图像的导数。运算符由一对卷积内核组成。
总梯度的大小由以下公式给出:
而渐变的方向是:
让我们尝试分离出“幅度”和“梯度方向”,而不是采用整体梯度。在某些情况下,这可以提供更大的优势。车道线,如果车道不太弯曲,则与图像中的垂直线更接近。因此,ax方向梯度比ay方向更有意义。采取单独的x、y梯度大小或方向,都有相应的优点。我们可以应用不同的阈值以达到期望的结果。
Sobel X,Y阈值
OpenCV具有sobel函数,可沿x,y方向获取梯度,该函数还可用于使用上述公式创建仅幅度和方向的阈值。完全不需要将图形转换为灰度,就可以提供很好的视觉效果。阈值只是创建二进制图像的一种方法,其中将满足条件的每个像素更改为1,将其他像素设置为0。
import numpy as np
import cv2
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import pickle
# Read in an image and grayscale it
image = mpimg.imread('straight_lines1.jpg')
# Define a function that applies Sobel x or y,
# then takes an absolute value and applies a threshold.
# Note: calling your function with orient='x', thresh_min=5, thresh_max=100
def abs_sobel_thresh(img, orient='x', thresh_min=0, thresh_max=255):
# Apply the following steps to img
# 1) Convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
# 2) Take the derivative in x or y given orient = 'x' or 'y'
sobel = cv2.Sobel(gray, cv2.CV_64F, orient=='x', orient=='y')
# 3) Take the absolute value of the derivative or gradient
abs_sobel = np.absolute(sobel)
# 4) Scale to 8-bit (0 - 255) then convert to type = np.uint8