为课程的笔记
课程地址:http://www.auto-mooc.com/chapter/study?class_id=337397AAE545AB50326C9F8A9AC8AD7D&item_id=B3BD74301BCF3D94380E0E2743912E45
资料库:待更新
导论:
第一部分介绍计算机视觉与自动驾驶,
第二部分介绍图像处理与视觉基础,
第三部分介绍车道线检测与识别,
第四部分介绍基于深度学习的车道线检测。
基本概念
模式识别 | 机器学习 | 计算机视觉 | 深度学习 |
---|---|---|---|
通过计算机用数学技术方法来研究模式的自动处理和判读。 | 是模式识别的方法。 | 机器学习的应用场景/应用领域 | 一种机器学习的途径和方法(分支) |
传统模式识别的基本框架:从低维感知,预处理,到特征提取和特征选择,最后到预测与感知识别。
CV 发展
2.0 正常场景中的:车道线检测与寻迹
车道线检测系统通过运用数字图像处理及模式识别技术,在道路图像中有效提取车道线的信息并拟合车道线,帮助自动驾驶过程中的道路线识别与纠偏。
不包括以下场景:例如高反差的
目标结果:
2.2 数字图像处理
灰度值:范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像
基本步骤
本章节基本内容:
图片两种类型:
计算机-位图的表示方法:
数字图像处理的基本概念
什么是图像?
定义为二维函数f(x,y),其中,x,y是空间坐标,f(x,y)是点(x,y)的幅值。
灰度图像是一个二维灰度(或亮度)函数f(x,y)。
彩色图像由三个(如RGB,HSV)二维灰度(或亮度)函数f(x,y)组成。
什么是数字图像?
-
像素组成的二维排列,可以用矩阵表示。
-
对于单色(灰度)图像而言,每个像素的亮度用一个数值来表示,通常数值范围在0到255之间,0表示黑、255表示白,其它值表示处于黑白之间的灰度。
-
彩色图像可以用红、绿、蓝三元组的二维矩阵来表示。
通常,三元组的每个数值也是在0到255之间,0表示相应的基色在该像素中没有,而255则代表相应的基色在该像素中取得最大值。
数字图像的像素表示:
什么是像素?
数字图像由二维的元素组成,每一个元素具有一个特定的位置(x,y)和幅值f(x,y),这些元素就称为像素。
图像的取样和量化
大多数传感器的输出是连续电压波形,为了产生一幅数字图像,需要把连续的感知数据转化为数字形式。这包括两种处理:取样和量化。
取样:图像空间坐标的数字化
量化:图像函数值(灰度值)的数字化
图像采样
空间坐标(x,y)的数字化被称为图像采样,确定水平和垂直方向上的像素个数N、M。
图像的量化
函数取值的数字化被称为图像的量化,如量化到256个灰度级。
图像的采样和量化
非统一的图像的采样
在灰度级变化尖锐的区域,用细腻的采样,在灰度级比较平滑的区域,用粗糙的采样。
非统一的图像的量化
在边界附近使用较少的灰度级。剩余的灰度级可用于灰度级变化比较平滑的区域,避免或减少由于量化的太粗糙,在灰度级变化比较平滑的区域出现假轮廓的现象。
数字图像的表示
二维离散亮度函——f(x,y)
x,y说明图像像素的空间坐标,函数值f 代表了在点(x,y)处像素的灰度值
二维矩阵——A[m,n]
m , n说明图像的宽和高。矩阵元素a(i,j)的值,表示图像在第i行,第j 列的像素的灰度值;i,j表示几何位置
安装软件
采用notepad++ 然后运行bat尝试,做自建集成开发环境
2.2 Opencv操作
读取图片:
import cv2
image = cv2.imread('E:\\linedetect\\Python baby.jpg')
#print image.size.width
#print image.size.height
h,w = image.shape[:2]
print(h,w)
cv2.namedWindow("Image")
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
视频读取
import cv2
cap = cv2.VideoCapture('E:\\linedetect\\input-video_3.mp4')
ret = True
#while(cap.isOpened()):
while(ret):
ret,frame = cap.read()
if ret == True:
cv2.imshow('image', frame)
k = cv2.waitKey(20)
#q键退出
if (k & 0xff == ord('q')):
cap.release()
cv2.destroyAllWindows()
break
cap.release()
cv2.waitKey(0)
cv2.destroyAllWindows()
画图
import cv2
import numpy as np
# Create a black image
#img = np.zeros((512,512,3), np.uint8)
img=cv2.imread('E:\\linedetect\\test1.png')
# Draw a diagonal blue line with thickness of 5 px
img = cv2.line(img,(0,0),(511,511),(0,0,255),5)
cv2.namedWindow('Image')
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = np.zeros((512,512,3), np.uint8) 语句中(512,512,3)分别指像素高,像素宽,3种RGB颜色
灰度化的几种方法
import cv2
import numpy as np
image = cv2.imread('E:\\linedetect\\test1.png')
sp = image.shape
height = sp[0]
width = sp[1]
#在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值。
new = np.zeros((height,width,3), np.uint8)
for i in range(height):
for j in range(width):
new[i,j] = 0.3 * image[i,j][0] + 0.59 * image[i,j][1] + 0.11 * image[i,j][2]
cv2.namedWindow('Image')
cv2.imshow('Image', new)
cv2.imwrite("E:\\linedetect\\test1-gray.jpg", new)
cv2.waitKey(0)
cv2.destroyAllWindows()
二值化
3.0 车道检测
数据集
距离处理:
平滑处理
高斯滤波是一种低通滤波,去除高频部分。
通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
Canny边缘检测
Canny边缘检测是基于求梯度变化最大值的方法来实现边缘检测,其基本原理就是对图像中各个点求梯度,梯度最大的地方就是边缘。
注意:利用CNN的卷积核也可做边缘检测
Canny最优准则:
再Opencv上实现canny边缘检测
思考:Canny算子的取值方法??
思考:ROI区域的确定??
按位操作-bitwise operations:利用掩膜(mask)进行“与”操作,即掩膜图像白色区域是对需要处理图像像素的保留,黑色区域是对需要处理图像像素的剔除,其余按位操作原理类似只是效果不同而已。
cv2.fillPoly()函数可以用来填充任意形状的图型.可以用来绘制多边形,工作中也经常使用非常多个边来近似的画一条曲线.cv2.fillPoly()函数可以一次填充多个图型.
img = np.zeros((1080, 1920, 3), np.uint8)
area1 = np.array([[250, 200], [300, 100], [750, 800], [100, 1000]])
area2 = np.array([[1000, 200], [1500, 200], [1500, 400], [1000, 400]])
cv2.fillPoly(img, [area1, area2], (255, 255, 255))
plt.imshow(img)
plt.show()
哈夫变换
在完成边缘检测、提取兴趣区域之后,我们得到了区域散点的集合,不仅有多条线,还有一些点状和块状区域,哈夫变换的目的就是找到途中的线,并与原图进行叠加。