Udacity无人驾驶工程师课程笔记:1 计算机视觉基础——基于Hough变换的车道线提取

  • 图像处理
    • 颜色选择
  • 区域遮罩
    • 组合颜色和区域选择
  • 边缘检测
    • Canny边缘检测
  • Hough变换
    • Hough变换寻找直线
    • 边缘检测图像和Hough变换

本文偏向于算法实际代码的应用举例,对算法原理只作简单的介绍。

图像处理

无人驾驶汽车检测车道线需要用到的特征:颜色、形状、方向、图片中的位置。以RGB颜色为例,黑色为接近0,白色为接近255。

颜色选择

下面先编写一个简单的程序,通过对颜色的选择来检测车道线:
1、首先,从matplotlib导入pyplot和image,导入了numpy来操作图像。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np

2、然后读入一张图片,并打印出一些数据。提取x和y的大小,并制作一个图像的副本来操作。注意:在python中,对要操作的数组或者变量,尽量先复制出来处理。如果不复制出来,操作“a=b”,那么你对“a”所做的所有更改也将应用在“b”中!

# 读入图片并打印出一些数据
image = mpimg.imread('test.jpg')
print('This image is: ',type(image), 'with dimensions:', image.shape)# 抓取x和y的大小,并制作一个图像的副本
ysize = image.shape[0]
xsize = image.shape[1]# 注意:不要简单地使用“=”,要复制出来
color_select = np.copy(image)

3、接下来,在变量red_threshold、green_threshold和blue_threshold中定义颜色阈值,并用这些值填写rgb_threshold。这个向量包含了红色、绿色和蓝色(r、g、b)的最小值。

# 定义颜色选择标准。
red_threshold = 0
green_threshold = 0
blue_threshold = 0
rgb_threshold = [red_threshold, green_threshold, blue_threshold]

4、接下来,将选择低于阈值的任何像素并将其设置为零。之后,所有符合颜色标准(高于阈值)的像素将被保留,那些不符合(低于阈值)的像素将被置成黑色。

# 识别低于阈值的像素
thresholds = (image[:,:,0] < rgb_threshold[0]) \| (image[:,:,1] < rgb_threshold[1]) \| (image[:,:,2] < rgb_threshold[2])
color_select[thresholds] = [0,0,0]# 显示图像
plt.imshow(color_select)
plt.show()

5、结果,输出图像color_select,其中高于阈值的像素被保留,低于阈值的像素变成黑色。

在上面的代码片段中,red_threshold、green_threshold和blue_threshold都设置为0,这意味着所有像素都将包含在选择中。

下面是完整的代码,修改变量red_threshold、green_threshold和blue_threshold的值,直到能够保留尽可能多的车道线,同时去掉大多数其他内容。运行代码后,输出一个示例图像。调整这些变量,使输入图像看起来像下面的图像。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as npimage = mpimg.imread('test.jpg')ysize = image.shape[0]
xsize = image.shape[1]
color_select = np.copy(image)red_threshold = 200
green_threshold = 200
blue_threshold = 200rgb_threshold = [red_threshold, green_threshold, blue_threshold]thresholds = (image[:,:,0] < rgb_threshold[0]) \| (image[:,:,1] < rgb_threshold[1]) \| (image[:,:,2] < rgb_threshold[2])
color_select[thresholds] = [0,0,0]plt.imshow(color_select)
plt.show()# 如果在本地运行代码并希望保存图像,请取消对以下代码的注释
# mpimg.imsave("test-after.png", color_select)

可以发现,当红色阈值=绿色阈值=蓝色阈值=200时,可以得到了一个相当好的结果,可以清楚地看到车道线,其他大部分都被遮住了。但此时,自动提取精确的线仍然是困难的,仍然在外围检测到许多其他像素。

区域遮罩

通过简单的颜色选择,已经设法消除几乎所有的图像,除了车道线。然而,此时,自动提取精确的直线仍然是困难的,因为仍然在外围检测到一些不是车道线的其他对象。

在这种情况下,假设拍摄图像的前摄像头安装在汽车上的固定位置,这样车道线将始终出现在图像的相同特定区域中。接下来,利用这一点,添加一个范围(即能找到车道线的区域),将其他无关的区域遮盖住,然后再从相关区域里考虑选择的颜色像素。

这里用一个三角形的遮罩来说明最简单的情况,变量left_bottom、right_bottom和apex表示三角形区域的顶点,保留这些顶点以进行颜色选择。除了三角形,还可以用任何多边形。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as npimage = mpimg.imread('test.jpg')
print('This image is: ', type(image), 'with dimensions:', image.shape)ysize = image.shape[0]
xsize = image.shape[1]
region_select = np.copy(image)# 定义一个感兴趣的三角形区域。记住原点(x=0,y=0)在图像处理中位于左上角
left_bottom = [0, 539]
right_bottom = [900, 300]
apex = [400, 0]# 确定感兴趣区域的3条边(y=Ax+B),np.polyfit() 返回拟合的系数向量[A,B]
fit_left = np.polyfit((left_bottom[0], apex[0]), (left_bottom[1], apex[1]), 1)
fit_right = np.polyfit((right_bottom[0], apex[0]), (right_bottom[1], apex[1]), 1)
fit_bottom = np.polyfit((left_bottom[0], right_bottom[0]), (left_bottom[1], right_bottom[1]), 1)# 划出线内的区域
XX, YY = np.meshgrid(np.arange(0, xsize), np.arange(0, ysize))
region_thresholds = (YY > (XX*fit_left[0] + fit_left[1])) & \(YY > (XX*fit_right[0] + fit_right[1])) & \(YY < (XX*fit_bottom[0] + fit_bottom[1]))# 将感兴趣区域内的像素涂成红色
region_select[region_thresholds] = [255, 0, 0]plt.imshow(region_select)# 如果未显示绘图,则取消注释
# plt.show()

numpy.polyfit 最小二乘多项式拟合。返回系数p的向量。新代码推荐使用多项式拟合类Polynomial.fit 方法,因为它在数值上更稳定。
numpy.meshgrid 从坐标向量返回坐标矩阵。

组合颜色和区域选择

接下来结合遮罩和颜色选择,从图像中提取车道线。在这里,同时执行颜色和区域选择步骤,要求像素同时满足要保留的遮罩和颜色选择要求。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as npimage = mpimg.imread('test.jpg')# 抓取x和y的大小,复制两份图像,一份只提取符合我们选择的像素,
# 然后,将原始图像中的这些像素涂成红色,以覆盖在原始图像上便于查看。
ysize = image.shape[0]
xsize = image.shape[1]
color_select= np.copy(image)
line_image = np.copy(image)# 定义我们的颜色标准
red_threshold = 0
green_threshold = 0
blue_threshold = 0
rgb_threshold = [red_threshold, green_threshold, blue_threshold]# 定义感兴趣的三角形区域(注意:如果运行此代码,请记住原点(x=0,y=0)在图像处理中位于左上角
left_bottom = [0, 539]
right_bottom = [900, 300]
apex = [400, 0]fit_left = np.polyfit((left_bottom[0], apex[0]), (left_bottom[1], apex[1]), 1)
fit_right = np.polyfit((right_bottom[0], apex[0]), (right_bottom[1], apex[1]), 1)
fit_bottom = np.polyfit((left_bottom[0], right_bottom[0]), (left_bottom[1], right_bottom[1]), 1)# 遮罩低于阈值的像素
color_thresholds = (image[:,:,0] < rgb_threshold[0]) | \(image[:,:,1] < rgb_threshold[1]) | \(image[:,:,2] < rgb_threshold[2])# 找出线内的区域
XX, YY = np.meshgrid(np.arange(0, xsize), np.arange(0, ysize))
region_thresholds = (YY > (XX*fit_left[0] + fit_left[1])) & \(YY > (XX*fit_right[0] + fit_right[1])) & \(YY < (XX*fit_bottom[0] + fit_bottom[1]))# 遮罩颜色选择
color_select[color_thresholds] = [0,0,0]# 找到图像的右边和所在区域的颜色
line_image[~color_thresholds & region_thresholds] = [255,0,0]# 显示我们的两个输出图像
plt.imshow(color_select)
plt.imshow(line_image)



下一个测试代码中,给了红色阈值、绿色阈值和蓝色阈值的值,但现在需要修改左下、右下和顶点,以表示标识图像中感兴趣区域的三角形的顶点。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as npimage = mpimg.imread('test.jpg')ysize = image.shape[0]
xsize = image.shape[1]
color_select = np.copy(image)
line_image = np.copy(image)red_threshold = 200
green_threshold = 200
blue_threshold = 200rgb_threshold = [red_threshold, green_threshold, blue_threshold]left_bottom = [100, 720]
right_bottom = [1240, 720]
apex = [640, 440]fit_left = np.polyfit((left_bottom[0], apex[0]), (left_bottom[1], apex[1]), 1)
fit_right = np.polyfit((right_bottom[0], apex[0]), (right_bottom[1], apex[1]), 1)
fit_bottom = np.polyfit((left_bottom[0], right_bottom[0]), (left_bottom[1], right_bottom[1]), 1)color_thresholds = (image[:,:,0] < rgb_threshold[0]) | \(image[:,:,1] < rgb_threshold[1]) | \(image[:,:,2] < rgb_threshold[2])XX, YY = np.meshgrid(np.arange(0, xsize), np.arange(0, ysize))
region_thresholds = (YY > (XX*fit_left[0] + fit_left[1])) & \(YY > (XX*fit_right[0] + fit_right[1])) & \(YY < (XX*fit_bottom[0] + fit_bottom[1]))color_select[color_thresholds | ~region_thresholds] = [0, 0, 0]
line_image[~color_thresholds & region_thresholds] = [255, 0, 0]plt.figure
plt.subplot(1,3,1)
plt.imshow(image)
x = [left_bottom[0], right_bottom[0], apex[0], left_bottom[0]]
y = [left_bottom[1], right_bottom[1], apex[1], left_bottom[1]]
plt.plot(x, y, 'b--', lw=4)
plt.subplot(1,3,2)
plt.imshow(color_select)
plt.subplot(1,3,3)
plt.imshow(line_image)
plt.show()


然而,车道线并不总是相同的颜色,即使是在不同照明条件下(白天、夜晚等),同一颜色的线也可能无法通过简单颜色选择来检测。我们需要的是将算法提升到一个新的层次,使用复杂的计算机视觉方法来检测任何颜色的线条。

使用python和opencv进行计算机视觉工作,opencv代表开源计算机视觉,包含了大量可以使用的函数库,库有很好的文档记录,因此,如果对某个特定函数中的参数的功能有疑问,可以在opencv.org上找到相关信息。

边缘检测

通过检测图像里里的边缘区域,可以检测出车道车。做个小测验,通过这张图片绘制一个横截面。图像中最有可能被识别为边缘的区域在哪里?

上图中的红线显示了在图像中的横截面。蓝线中的摆动表示沿图像横截面的强度变化,颜色变化强的点有ACE,最有可能识别为边缘。

Canny边缘检测

使用canny边缘检测,在道路图像中找到车道线的边缘。
首先,读取图像:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
image=mpimg.imread('exit-ramp.jpg')
plt.imshow(image)

在这里有一个道路的图像,有相当明显的车道线,将图像转换为灰度。

import cv2  #bringing in OpenCV libraries
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) #grayscale conversion
plt.imshow(gray, cmap='gray')


在这张图像上试试Canny边缘检测。首先,来看看opencv canny函数的参数:

edges=cv2.Canny(gray,low_threshold,high_threshold)

将canny应用于灰度图像gray上,输出为edges的图像。低阈值和高阈值是边缘检测的阈值。

该算法首先检测高于高阈值的强边缘(强梯度)像素,然后拒绝低于低阈值的像素。下一步,只要介于低阈值和高阈值之间的值的像素连接到强边,就将包含进来。输出edges是一个二值图像,白色像素跟踪检测到的边缘,其他地方都是黑色。

如何选择参数?在例子中,转换成灰度留下了一个8位图像,因此每个像素可以取2^8=256个可能的值。因此,像素值的范围从0到255。这个范围意味着导数(本质上,像素与像素之间的值差)将以几十或几百为单位。所以,阈值参数的合理范围也应该在几十到几百之间。至于低阈值与高阈值的比率,约翰坎尼建议低阈值与高阈值的比率为1:2或1:3。

在运行canny之前可以使用高斯平滑,这是一种通过平均来抑制噪声和伪梯度的方法。实际上,在canny()内部应用了高斯平滑,但是在这里再使用高斯平滑,是因为可以通过应用进一步的平滑来获得不同的结果(而且高斯平滑在cv2.canny()中不是可变参数!)

可以将高斯平滑的kernel_size选择为任意奇数。较大的kernel_size大小意味着在较大的区域上平均或平滑。上一次的示例是kernel_size=3。
(pip install opencv-python 安装cv2库)

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import cv2# 读入图像并转换为灰度
image = mpimg.imread('exit-ramp.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)# 定义高斯平滑/模糊的核大小
# 注意:此步骤是可选的,因为cv2.Canny()在内部应用5x5高斯函数
kernel_size = 3
blur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size), 0)# 为Canny定义参数并运行它
low_threshold = 1
high_threshold = 10
edges = cv2.Canny(blur_gray, low_threshold, high_threshold)plt.imshow(edges, cmap='Greys_r')

这里,在高斯平滑灰度图像blur_gray上应用函数canny,在高阈值和低阈值的梯度上检测到边缘。

下面是完整代码,使用高斯平滑和canny边缘检测的参数来优化车道线的检测。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import cv2# 读入图像并转换为灰度
# 注意:在上一个例子中,我们读的是a.jpg
# 这里我们读取一个.png文件并转换成0255字节
image = mpimg.imread('exit-ramp.jpg')
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)# 定义高斯平滑/模糊的核大小,必须是奇数(3,5,7…)
kernel_size = 5
blur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size),0)# 为Canny定义参数并运行它
low_threshold = 50
high_threshold = 150
edges = cv2.Canny(blur_gray, low_threshold, high_threshold)plt.imshow(edges, cmap='Greys_r')

这里为高斯平滑选择了5的内核大小、50的低阈值和150的高阈值。这些选择很好地提取车道线,同时最小化图像其余部分中检测到的边缘,结果如下所示。

Hough变换

Hough变换寻找直线

在图像空间中,一条线被绘制为(x,y),但在hough空间中,可以将(x,y)线表示为(m,b)中的一个点。单个点(x,y)对应于直线y=mx+b。hough变换就是从图像空间到hough空间的转换。因此,图像空间中的直线是在hough空间中(m,b)位置处的一个点。
图像空间中的一个点有许多可能通过它的线,符合y=mx+b的特定(m,b)组成的线。
通过以下几个小练习可以看出图像空间与hough空间的对应关系。

  • 图像空间中的两条直线,m相同,b不同,对应于右边图中的两个点,图C。
  • 图像空间中的一个点,对应于右边图中的一条线,图A。
  • 图像空间中在一条直线上的两个点,对应于右边图中的两条相交的直线,图C。
  • hough空间中的两条交叉直线,对应于图像空间中的一条直线上的两个点,图A。

    将图像空间的坐标表示为极坐标下的(ρ,θ)。图像空间里的一条直线,在hough空间里是一个点。

    图像空间里同一条直线上的多个点,在hough空间里是多条曲线,并用这些曲线相交于一个点。

    因此可以先将图片进行边缘检测,然后对图像上每一个非零像素点,在hough坐标下变换为一条曲线,那么在直角坐标下属于同一条直线的点,在hough空间形成多条线相交于一点。由此,可用该原理进行直线检测。

边缘检测图像和Hough变换

为了完成寻找车道线的任务,需要指定一些参数来表示想要检测什么样的线(即长线、短线、弯曲线、虚线等)。要做到这一点,将使用一个OpenCV函数HoughLinesP,它需要几个参数。
下面是在处理的图像:

opencv函数HoughLineP的输入参数,将用来查找图像中的线。可以这样调用:

lines = cv2.HoughLinesP(masked_edges, rho, theta, threshold, np.array([]), min_line_length, max_line_gap)

在图像Marked_edges(Canny的输出)上操作,而HoughLinesP的输出将是线,是包含由变换操作检测到的所有线段的端点(X1,Y1,X2,Y2)的数组。其他参数定义了我们正在寻找什么样的线段。

  • rho和theta是hough空间中网格的距离和角度分辨率。在Hough空间中,有一个沿(ρ,θ)轴布局的网格。需要以像素单位确定ρ和以弧度单位确定θ。什么是合理的值呢?rho的最小值为1,theta的合理起始位置为1度(弧度的π/180)。定义什么是一条线时,将这些值缩放为更灵活。
  • threshold参数指定输出候选线的最小交叉战数量(给定网格单元中的交叉点)。
  • 空的np.array([])只是一个占位符,不需要更改它。
  • min_line_length是允许输出的线的最小长度(单位为像素)
  • max_line_gap是将允许连成单条线的线段之间的最大距离(以像素为单位)。

然后可以迭代输出线,并把它们画到图像上!

# 相关输入
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import cv2# 读取图像,使图像变成灰度图像
image = mpimg.imread('exit-ramp.jpg')
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)# 定义核大小并应用高斯平滑
kernel_size = 5
blur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size),0)# 定义Canny的参数并应用
low_threshold = 50
high_threshold = 150
masked_edges = cv2.Canny(blur_gray, low_threshold, high_threshold)# 定义Hough变换参数
# 制作一个与我们的图像大小相同的空白图像
rho = 1
theta = np.pi/180
threshold = 1
min_line_length = 10
max_line_gap = 1
line_image = np.copy(image)*0 #creating a blank to draw lines on# 在边缘检测图像上运行Hough算法
lines = cv2.HoughLinesP(masked_edges, rho, theta, threshold, np.array([]),min_line_length, max_line_gap)# 迭代输出“线”并在空白处画线
for line in lines:for x1,y1,x2,y2 in line:cv2.line(line_image,(x1,y1),(x2,y2),(255,0,0),10)# 创建一个“彩色”二值图像与线图像相结合
color_edges = np.dstack((masked_edges, masked_edges, masked_edges)) # 在边缘图像上画线
combo = cv2.addWeighted(color_edges, 0.8, line_image, 1, 0)
plt.imshow(combo)

完整代码如下,要处理的图像如下:

代码如下:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import cv2#读取图像,使图像变成灰度图像
image=mpimg.imread('exit-ramp.jpg')
gray=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)#设定一个kernel尺寸和应用高斯滤波
kernel_size=5
blur_gray=cv2.GaussianBlur(gray,(kernel_size,kernel_size),0)#设置和应用Canny参数
low_threshold=50
high_threshold=150
edges=cv2.Canny(blur_gray,low_threshold,high_threshold)#使用cv2.fillpoly()创建遮罩的边缘图像
mask=np.zeros_like(edges)
ignore_mask_color=255#定义了一个四边形来遮罩
imshape=image.shape
print(imshape)
vertices = np.array([[(0,imshape[0]),(450, 290), (490, 290), (imshape[1],imshape[0])]], dtype=np.int32)
cv2.fillPoly(mask,vertices,ignore_mask_color)
masked_edges=cv2.bitwise_and(edges,mask)#定义Hough变换参数
#做一个与我们的图像大小相同的空白数组
rho=2  #Hough网格的像素距离分辨率
theta=np.pi/180  #Hough网格弧度的角分辨率
threshold=10  #最小投票数(hough网格单元中的交叉点)
min_line_length=40  #构成一条直线所需最小像素
max_line_gap=20  #可连接线段之间的最大像素间距
line_image=np.copy(image)*0  #创建一个空数组用于绘制线#对边缘检测图像运行hough算法
#输出行是一个包含检测到的线段端点的数组
lines=cv2.HoughLinesP(masked_edges,rho,theta,threshold,np.array([]),min_line_length,max_line_gap)
print(lines)#迭代输出行并在空白图像上绘制行
for line in lines:for x1,y1,x2,y2 in line:cv2.line(line_image,(x1,y1),(x2,y2),(255,0,0),10)#创建一个彩色二值图像与线图像相结合
color_edges=np.dstack((edges,edges,edges))#在边缘图像上画线
lines_edges=cv2.addWeighted(color_edges,0.8,line_image,1,0)#画出每个阶段处理的图像
fig=plt.figure(figsize=(15,10))
plt.subplot(231)
plt.title('orignal image')
plt.imshow(image)
plt.subplot(232)
plt.title('blur image')
plt.imshow(blur_gray)
plt.subplot(233)
plt.title('edges image')
plt.imshow(edges)
plt.subplot(234)
plt.title('masked_edges image')
plt.imshow(masked_edges)
plt.subplot(235)
plt.title('line_image')
plt.imshow(line_image)
plt.subplot(236)
plt.title('lines_edges')
plt.imshow(lines_edges)
plt.show()

输出处理后的图像如下:

  • 在这个练习中,使用50的low_threshold和150的high_threshold进行Canny的边缘检测。
  • 对于区域选择,定义了:vertices = np.array([[(0,imshape[0]),(450, 290), (490,290), (imshape[1],imshape[0])]], dtype=np.int32)
  • 选择Hough空间网格的参数为2像素的rho和1度theta(π/180弧度)。选择的threshold为15,这意味着图像空间中每个线段相连至少需要15个点。设置了40像素的min_line_length和20像素的max_line_gap。
  • numpy.zeros_like:返回与给定数组形状和类型一样的全零数组。
  • numpy.array:创建一个数组
  • cv2.fillPoly:填充由一个或多个多边形包围的区域,返回none。
  • cv2.bitwise_and:计算两个数组或一个数组与标量的逐元素逐位与。
  • cv2.line:画一条线段连接两个点,返回None。
  • numpy.dstack:将1维或者2维的数据组合成3维数据
  • cv2.addWeighted:计算两个数组的加权和。

有了这些参数,很好地提取了车道线,是一种解决方案!参数调整是计算机视觉中最大的挑战之一——对一幅图像有效的方法,在不同的光线和/或背景下,对其他图像可能根本不起作用。通常,构建一个加快不同技术和阈值之间迭代的工具,可以帮助进行参数优化。

Udacity无人驾驶工程师课程笔记:1 计算机视觉基础——基于Hough变换的车道线提取相关推荐

  1. 【自动驾驶技术】优达学城无人驾驶工程师学习笔记(七)——计算机视觉基础

    计算机视觉基础目录 前言 颜色选择(Color Selection) 理论基础 代码实践 区域筛选(Region Masking) 理论基础 代码实践 Canny边缘检测 问题背景 Canny边缘检测 ...

  2. Udacity机器人软件工程师课程笔记(五)-样本搜索和找回-基于漫游者号模拟器-自主驾驶

    9.自主驾驶 在接下来的环节中,我们要实现漫游者号的自动驾驶功能. 完成这个功能我们需要四个程序,第一个为感知程序,其对摄像头输入的图片进行变换处理和坐标变换使用.第二个程序为决策程序,功能是帮助漫游 ...

  3. 【自动驾驶技术】优达学城无人驾驶工程师学习笔记(六)——Github与Markdown相关教程

    Github与Markdown相关教程 本博文为笔者关于优达学城无人驾驶工程师课程中计算机视觉基础部分的学习笔记,该部分为实现车道线图像识别功能的基础课程,关于本课程的详细说明请参考优达学城官网. 优 ...

  4. 【R】【课程笔记】02+03 基于R软件的计算

    本文是课程<数据科学与金融计算>第2-3章的学习笔记,主要介绍R语言在统计和机器学习中的应用,用于知识点总结和代码练习,Q&A为问题及解决方案,参考书籍为<R软件及其在金融定 ...

  5. asu计算机工程师,优达udacity无人驾驶工程师第一二三期(全)

    第一学期 - 第一部分 简介 在这节课中,你将会了解无人驾驶车的组成系统和工作原理,并着手迎接你的第一个实战项目:检测车道线.同时,我们会介绍整个纳米项目和课程期间提供的各项学习服务. 第一学期 - ...

  6. 一文掌握百度Apollo Udacity自动驾驶课程笔记

    LZ第一次使用幕布完成了对Apollo课程的课后笔记,欢迎大家观看. 自动驾驶的六大模块:高精地图.定位.感知.预测.规划.控制,本次课程都有涉及.毕竟是入门课程,作为了解自动驾驶机制是很不错的课程. ...

  7. 计算机视觉专业要学什么课程,[08本]“计算机视觉基础”课程介绍和课件

    课程课件PDF及HTML介绍较大,可从SRTP FTP中下载:srtp.8800.org,用户名和密码都是srtp <计算机视觉基础>课程介绍 概述 本课程是信息科学与工程专业的选修课程, ...

  8. 学习笔记 | Apollo Udacity自动驾驶课程笔记——高精度地图、厘米级定位

    点击上方"AI算法修炼营",选择加星标或"置顶" 标题以下,全是干货 前言:目前 Apollo 内部高精地图主要应用在高精定位.环境感知.决策规划.仿真运行四大 ...

  9. APOLLO UDACITY自动驾驶课程笔记——感知、预测

    1.计算机视觉 无人驾驶车有四个感知世界的核心任务:检测--指找出物体在环境中的位置:分类--指明确对象是什么:跟踪--指随时间的推移观察移动物体:语义分割--将图像中的每个像素与语义类别进行匹配如道 ...

最新文章

  1. Java中的微信支付(2):API V3 微信平台证书的获取与刷新
  2. 【Groovy】Groovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )
  3. WebMisDeveloper4.2.0面世
  4. deap实战_2017中国数学建模大赛_B题_第二题
  5. 水晶报表自定义函数(替换并截取特殊字符后内容)
  6. BZOJ.4821.[SDOI2017]相关分析(线段树)
  7. 如何在IDEA 中使用Git
  8. 《走遍中国》珍藏版(六)
  9. firebase使用_如何开始使用Firebase Hosting
  10. 如何仅凭 README 就名列 GitHub No.1 并收获上万 Star?
  11. matlab中realmax
  12. 拓端tecdat|Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
  13. C++ 从零单排(2)-基础知识二
  14. 磁共振成像原理-物理基础2(质子在外部磁场的情况)
  15. 利用addr2line命令定位backtrace的Error行数
  16. 计算机网络连接无线局域网,无线局域网的连接方法
  17. Linux平台下rar, 7z, zip压缩文件密码破解
  18. 网络编程中同步与异步,IO阻塞与非阻塞总结
  19. linux mkdir命令用法,linux里面的mkdir命令
  20. 电脑莫名奇妙地出现了嘀嗒壁纸,只有下拉的水滴图标,找不到文件所在位置,怎么删除?

热门文章

  1. js简单实现基于图片的路线规划导航
  2. [墨者安全]解析2019年国内DDOS第一季度报告
  3. kindeditor4.1.11版自定义插入网络视频代码(支持哔哩、优酷、爱奇艺、土豆、腾讯视频、56等视频网站)
  4. DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版及制作Visual Studio C#项目模板文件详解...
  5. About What Is a DBA?
  6. Spring中的@ConditionalOnProperty注解
  7. lcl手术和飞秒区别_主流近视手术大解密!一文读懂全飞秒和ICL的区别
  8. 白色皮包变黄处理绝招
  9. 端口映射--自己主机做服务器
  10. map取值,key不存在的情况