深度学习与图像处理(PaddlePaddle版)课件1. 图像处理基础_第1页
深度学习与图像处理(PaddlePaddle版)课件1. 图像处理基础_第2页
深度学习与图像处理(PaddlePaddle版)课件1. 图像处理基础_第3页
深度学习与图像处理(PaddlePaddle版)课件1. 图像处理基础_第4页
深度学习与图像处理(PaddlePaddle版)课件1. 图像处理基础_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章图像处理基础微课视频OpenCV自动驾驶小车主讲人:钱彬、朱会杰内容安排图像处理的基本概念01.图像处理基本操作02.图像卷积和滤波03.综合案例应用:基于OpenCV的自动驾驶小车04.PART01图像处理的基本概念模拟图像是指通过某种光、电物理量的强弱变化来记录亮度信息的图像,例如纸质照片、老式电视机播放的画面等。模拟图像最大的特点就是其物理量的变化是连续的。模拟图像不能直接用计算机来处理,必须首先转化为数字图像。模拟图像图像处理的基本概念01图像数字化就是把模拟图像分割成一个个称为像素的小区域,这个过程称为采样。每个像素的亮度值用一个整数来表示,这个过程称为量化。数字图像图像是人类视觉的基础,是自然景物的客观反映,是人类认识世界和人类本身的重要源泉。“图”是物体反射或透射光的分布,“像“是人的视觉系统所接受的图在人脑中所形成的印象或认识,照片、绘画、剪贴画、地图、书法作品、手写汉字、传真、卫星云图、影视画面、X光片、脑电图、心电图等都是图像。图像是客观对象的一种相似性的、生动性的描述或写真,是人类社会活动中最常用的信息载体。或者说图像是客观对象的一种表示,它包含了被描述对象的有关信息。它是人们最主要的信息源。据统计,一个人获取的信息大约有75%来自视觉图像处理的基本概念01

模拟图像数字化图像处理的基本概念01数字图像常见类型二值图像只有两个值:0或1单通道灰度图像每个像素用8个比特来表示,每个像素有种可能,因此其灰度取值范围是0~255自然界中的绝大部分彩色都可以由三种基色按一定比例混合得到,而每种基色用一个通道表示,合起来称为三通道图像。典型的三通道图像分别对应红(Red)、绿(Green)、蓝(Blue)三种颜色,每种颜色取值范围都在0~255之间。图像处理的基本概念01数字图像常见类型四通道彩色图像图像处理的基本概念01图像去噪图像去雾低光照增强底层处理:基于轮廓、纹理、颜色等底层特征对图像进行滤波和增强。应用方向图像处理的基本概念01目标检测语义分割关键点检测中层处理:基于物体的局部特征对图像进行建模与表达。应用方向图像处理的基本概念01人体属性分析手势识别高层处理:基于图像的完整结构和时空内容对图像进行理解应用方向PART02图像处理基本操作PILMatplotlibOpenCV图像处理基本操作

02图像处理:OpenCV提供了一系列用于处理图像的函数和算法,包括图像滤波、图像变换、图像分割、形态学操作等。特征检测与描述:OpenCV提供了用于检测和描述图像中的特征的函数和算法,例如SIFT、SURF、ORB、FAST等。目标检测与识别:OpenCV提供了用于目标检测和识别的函数和算法,例如HaarCascade分类器、HOG+SVM分类器等。视频处理:OpenCV提供了一些用于处理视频的函数和算法,包括视频捕捉、视频压缩、视频分析等。机器学习:OpenCV提供了一些用于机器学习的函数和算法,例如支持向量机、神经网络、K均值聚类等。OpenCV是一个开源跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和MacOS操作系统上。提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV用C++语言编写,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和MacOS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令,如今也提供对于C#、Ch、Ruby,GO的支持。图像处理基本操作----安装OpenCV02本书将下载和使用opencv-python库,对应OpenCV的Python版本,具体安装命令如下:pipinstallopencv-python如果下载速度比较慢可以使用国内镜像源(如百度镜像、清华大学镜像等)来加速下载(这个方法也适用于其他Python库的安装),命令如下:pipinstallopencv-python-i/pypi/simple安装OpenCV图像处理基本操作----图像读取、保存和可视化02#demo1.py#导入OpenCV库importcv2#读取图像img=cv2.imread('./imgs/whale.jpg',cv2.IMREAD_UNCHANGED)#查看图像尺寸print(img.shape)img=cv2.imread('./imgs/whale.jpg',cv2.IMREAD_GRAYSCALE)print(img.shape)图像读取(demo/demo1.py)(480,815,3)(480,815)

输出为:02importcv2img=cv2.imread('./imgs/pepper.png')#读取图像cv2.imwrite('pepper.jpg',img)#保存为JPEG图像图像保存(demo/demo2.py)(a)PNG格式(106KB)(b)JPEG格式(22KB)图像压缩保存(PNGvsJPEG)图像处理基本操作----图像读取、保存和可视化02#图像压缩保存cv2.imwrite('pepper_80.jpg',img,[cv2.IMWRITE_JPEG_QUALITY,80])cv2.imwrite('pepper_5.jpg',img,[cv2.IMWRITE_JPEG_QUALITY,5])图像保存(demo/demo3.py)图像处理基本操作----图像读取、保存和可视化02importcv2#读取图像img=cv2.imread('./imgs/girl.jpg')#定义可视化窗口dWindow('window',cv2.WINDOW_NORMAL)#更改窗口的大小cv2.resizeWindow('window',640,480)#展示可视化窗口cv2.imshow('window',img)#等待按键(按任意键退出)key=cv2.waitKey(0)#关闭所有窗口cv2.destroyAllWindows()图像可视化(demo/demo4.py)图像处理基本操作----图像读取、保存和可视化02图像可视化(demo/demo4.py)图像处理基本操作----图像读取、保存和可视化02#如果使用Notebook中的图片可视化%matplotlibinlineimportmatplotlibimportmatplotlib.pyplotaspltimportmatplotlib.imageasmpimg#设置显示中文importmatplotlib.font_managerasfont_managerfont=font_manager.FontProperties(fname='./ziti/FZSYJW.ttf',size=16)#创建字体对象#采用matplotlib展示图片image=mpimg.imread('./imgs/girl.jpg')plt.imshow(image)plt.xticks([])plt.yticks([])#plt.title("显示结果",fontproperties=font)plt.xlabel("处理后",fontproperties=font)图像可视化(demo/demo4.py)图像处理基本操作----图像读取、保存和可视化02图像可视化(demo/demo4.py)图像处理基本操作----图像读取、保存和可视化02importcv2#读取图像img=cv2.imread('./imgs/cycle.jpg')#修改图像部分区域像素值img[100:200,100:300]=[0,0,0]#保存结果cv2.imwrite('result.jpg',img)直接操作像素值(demo/demo5.py)图像处理基本操作----像素操作02importcv2#按照单通道方式读取图像img=cv2.imread('./imgs/beans.png',cv2.IMREAD_GRAYSCALE)#图像和标量相加img=cv2.add(img,80)#保存结果cv2.imwrite('result.jpg',img)图像亮度调整(demo/demo6.py)图像处理基本操作----像素操作02importcv2#读取图像img=cv2.imread('./imgs/cycle.jpg')#三通道彩色转换为单通道灰度图img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#保存结果cv2.imwrite('result.jpg',img)彩色图与灰度图互转(demo/demo7.py)图像处理基本操作----图像转换02importcv2#读取图像img=cv2.imread('./imgs/elephant.jpg',cv2.IMREAD_GRAYSCALE)#单通道灰度图转换为三通道图像img=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)#保存结果cv2.imwrite('result.jpg',img)彩色图与灰度图互转(demo/demo8.py)图像处理基本操作----图像转换02img=cv2.cvtColor(img,cv2.COLOR)#四通道图像转灰度图像img=cv2.cvtColor(img,cv2.COLOR_RGBA2BGR)#四通道图像转三通道图像彩色图与灰度图互转常用的彩色图像和灰度图像之间的转换图像处理基本操作----图像转换img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#BGR转RGBBGR转RGB02importcv2importnumpyasnp#使用numpy创建一个元素值均为50的二维矩阵img=np.ones((200,100))*50#转换成uint8类型img=np.uint8(img)#保存结果cv2.imwrite('result.jpg',img)二值化(demo/demo9.py)图像处理基本操作----图像转换02importcv2#读取图像img=cv2.imread('./imgs/whale_gray.jpg',cv2.IMREAD_GRAYSCALE)#二值化thr=127_,img=cv2.threshold(img,thr,255,cv2.THRESH_BINARY)#保存结果cv2.imwrite('result.jpg',img)图像缩放(demo/demo10.py)图像处理基本操作----图像转换02importcv2#读取图像img=cv2.imread('./imgs/tajmahal.jpg')print(img.shape)#缩放图像height,width,_=img.shapenew_height=int(height/2)new_width=int(width/2)img=cv2.resize(img,(new_width,new_height),cv2.INTER_LINEAR)print(img.shape)#保存结果cv2.imwrite('result.jpg',img)图像缩放(demo/demo11.py)图像处理基本操作----图像缩放02importcv2#读取图像img=cv2.imread('./imgs/eagle.jpg')#定义裁剪区域x,y,w,h=1089,1000,1000,1800#裁剪并保存图片crop=img[y:y+h,x:x+w]#保存结果cv2.imwrite('result.jpg',crop)图像裁剪(demo/demo12.py)图像处理基本操作----图像裁剪02importcv2#读取图像img=cv2.imread('./imgs/fish.jpg')#垂直翻转img_vertical=cv2.flip(img,0)cv2.imwrite('vertical.jpg',img_vertical)#水平翻转img_horizontal=cv2.flip(img,1)cv2.imwrite('horizontal.jpg',img_horizontal)翻转(demo/demo13.py)图像处理基本操作----翻转与旋转02importcv2#读取图像img=cv2.imread('./imgs/fish.jpg')#垂直翻转img_vertical=cv2.flip(img,0)cv2.imwrite('vertical.jpg',img_vertical)#水平翻转img_horizontal=cv2.flip(img,1)cv2.imwrite('horizontal.jpg',img_horizontal)旋转(demo/demo14.py)图像处理基本操作----翻转与旋转PART03图像卷积和滤波03图像卷积和滤波----线性滤波与卷积(1)滤波器的大小应该是奇数,这样它才有一个中心点,例如3×3,5×5或7×7。(2)滤波器矩阵所有的元素之和一般要等于1,这是为了保证滤波前后图像的整体亮度保持不变。(3)对于滤波后的结构,可能会出现负数或者大于255的数值,这种情况下,可以直接截断其值,使其保持在0~255之间。线性滤波是图像处理中最基本的方法之一,以二维滤波器为例,对于图像上的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值03图像卷积和滤波----常见卷积核importcv2#读取图像img=cv2.imread('./imgs/fish.jpg')#垂直翻转img_vertical=cv2.flip(img,0)cv2.imwrite('vertical.jpg',img_vertical)#水平翻转img_horizontal=cv2.flip(img,1)cv2.imwrite('horizontal.jpg',img_horizontal)一个简单的卷积运算(demo/demo15.py)03图像卷积和滤波----常见卷积核importcv2importnumpyasnp#读取图像img=cv2.imread("./imgs/pepper.png")#锐化卷积核kernel=np.array(([-1,-1,-1],[-1,9,-1],[-1,-1,-1]))#执行卷积dst=cv2.filter2D(img,-1,kernel)cv2.imwrite("result.jpg",dst)图像锐化(demo/demo16.py)03图像卷积和滤波----常见卷积核importcv2importnumpyasnp#读取图像img=cv2.imread("./imgs/pepper.png")#边缘检测卷积核kernel=np.array(([-1,-1,-1],[-1,8,-1],[-1,-1,-1]))#执行卷积dst=cv2.filter2D(img,-1,kernel)cv2.imwrite("result.jpg",dst)边缘检测(demo/demo17.py)03图像卷积和滤波----常见卷积核importcv2importnumpyasnp#读取图像img=cv2.imread("./imgs/pepper.png")#均值模糊卷积核kernel=np.array(([1/9,1/9,1/9],[1/9,1/9,1/9],[1/9,1/9,1/9]))#执行卷积dst=cv2.filter2D(img,-1,kernel)cv2.imwrite("result.jpg",dst)均值模糊(demo/demo18.py)03图像卷积和滤波----常见卷积核importcv2importnumpyasnp#读取图像img=cv2.imread("./imgs/pepper.png")#高斯模糊卷积核kernel=(np.array(([1,4,7,4,1],[4,16,26,16,4],[7,26,41,26,7],[4,16,26,16,4],[1,4,7,4,1],))/273.0)#执行卷积dst=cv2.filter2D(img,-1,kernel)cv2.imwrite("result.jpg",dst)高斯模糊(demo/demo19.py)PART04综合案例应用:基于OpenCV的自动驾驶小车04基于OpenCV的自动驾驶小车----任务概述自动驾驶汽车能够减少驾驶疲劳、缓解道路拥堵、提升交通安全,为用户提供更便利的出行体验本节内容将基于OpenCV的图像处理算法来实现一款简易的自动驾驶小车使用纯视觉方案实现一个能够在规定道路上行驶的自动驾驶小车,通过行车记录仪拍摄路面图像,实时分析并规划车辆转向角度本书使用仿真平台来实现。当然,如果有条件的话,可以将相关算法部署到真实的硬件平台上(例如树莓派小车)进行实战演练任务概述04基于OpenCV的自动驾驶小车----安装仿真平台下载并解压后内容模拟器主界面从本书配套资源网站上下载模拟器是下载后就可以直接在Windows平台在模拟器主界面左侧是相关设置菜单,可以设置不同的运行模式、不同的观察视角等。右侧是模拟器提供的各个赛道下载模拟器(DonkeySimWin.zip)04基于OpenCV的自动驾驶小车----安装仿真平台下载并解压后内容先设置左侧的菜单,在paceCar处勾选manualDriving,可以手动操控小车在右侧赛道上,本章选择最简单的赛道generated_road,因为这个赛道没有障碍物,上手比较容易。单击generated_road,进入具体的场景W键表示前进,A键表示左转,D键表示右转,S键表示后退,油门(W和S键)和转向角度(A和D键)模拟器参数设置generated_road赛道运行界面04基于OpenCV的自动驾驶小车----Python控制模拟器首先在Windows上安装git工具通过Python代码来控制模拟器pipinstallsetuptools==65.5.0-i/pypi/simplepipinstall--userwheel==0.38.0-i/pypi/simplepipinstallgit+/binghai228/gym-donkeycar接下来使用下面的命令安装仿真平台的驱动库04基于OpenCV的自动驾驶小车----Python控制模拟器#导入游戏引擎库importgymimportgym_donkeycarimportnumpyasnpimportcv2#设置模拟器环境,选择赛道env=gym.make("donkey-generated-roads-v0")#重置当前场景obv=env.reset()Python代码实现小车的控制(opencv_drive/drive_test.py)04基于OpenCV的自动驾驶小车----Python控制模拟器#运行100帧fortinrange(100):#定义控制动作

action=np.array([0.3,0.5])#0.3表示转向,0.5表示油门

#执行动作

img,reward,done,info=env.step(action)#取一张图像保存

ift==20:img=cv2.cvtColor(img,cv2.COLOR_RGB2BGR)cv2.imwrite('test.jpg',img)#运行完以后重置当前场景obv=env.reset()Python代码实现小车的控制(opencv_drive/drive_test.py)04基于OpenCV的自动驾驶小车----车道线检测感知部分主要通过车道线检测来实现动作规划则通过操控转向角度来实现简化控制变量,对于油门值,可以在运行时保持低匀速,这样只需要控制转向角度感知和动作规划基本思路图像处理领域,针对特定颜色提取问题,使用较多的是HSV颜色空间,比RGB空间更接近人类对色彩的感知经验,可以非常直观地表达色彩的色调、鲜艳程度和明暗程度HSV表达彩色图像的方式由三个部分组成:色调(Hue)、饱和度(Saturation)、明度(Value)色调用角度度量表示,取值范围为0~360,在OpenCV中色调取值范围是[0~180]要提取出黄色线,可以将色调范围控制在30~90,在OpenCV中黄色范围需要缩小1倍,即[15~45]检测白色车道线也是采用类似的原理基于HSV空间的特定颜色区域提取04基于OpenCV的自动驾驶小车----车道线检测importcv2importnumpyasnpimportmath#----------------------1.基于HSV空间的特定颜色区域提取------------------#读取图像并转换到HSV空间frame=cv2.imread('test.jpg')hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)#黄色线检测lower_blue=np.array([15,40,40])upper_blue=np.array([45,255,255])yellow_mask=cv2.inRange(hsv,lower_blue,upper_blue)cv2.imwrite('yellow_mask.jpg',yellow_mask)基于HSV空间的特定颜色区域提取(opencv_drive/img_analysis.py)04基于OpenCV的自动驾驶小车----车道线检测#白色线检测lower_blue=np.array([0,0,200])upper_blue=np.array([180,30,255])white_mask=cv2.inRange(hsv,lower_blue,upper_blue)#保存中间结果cv2.imwrite('yellow_mask.jpg',yellow_mask)cv2.imwrite('white_mask.jpg',white_mask)基于HSV空间的特定颜色区域提取(opencv_drive/img_analysis.py)04基于OpenCV的自动驾驶小车----车道线检测#黄色线边缘提取yellow_edge=cv2.Canny(yellow_mask,200,400)#白色线边缘提取whitewhite_edge=cv2.Canny(white_mask,200,400)基于高斯模糊的噪声滤除(1)使用高斯滤波器,以平滑图像、滤除噪声;(2)计算图像中每个像素点的梯度强度和方向;(3)应用非极大值抑制(Non-MaximumSuppression,NMS),消除边缘检测带来的杂散响应;(4)应用双阈值检测来确定真实的和潜在的边缘;(5)抑制孤立的弱边缘;Canny边缘检测(从左至右:原图、白色边缘、黄色边缘)04基于OpenCV的自动驾驶小车----车道线检测frame=cv2.imread('test.jpg')frame=cv2.GaussianBlur(frame,(5,5),1)#添加高斯模糊代码基于Canny算子的边缘轮廓提取通过OpenCV提供的现成的高斯模糊函数cv2.GaussianBlur()来实现,在读入图像后立即用高斯模糊操作一下,高斯核大小选择5×5,然后再进行特定颜色提取高斯模糊后特定颜色区域提取(从左至右:原图、白色提取区域、黄色提取区域)04基于OpenCV的自动驾驶小车----车道线检测#----------------------------4.感兴趣区域提取----------------------------defregion_of_interest(edges,color="yellow"):height,width=edges.shapemask=np.zeros_like(edges)#定义感兴趣区域掩码轮廓

ifcolor=='yellow':polygon=np.array([[(0,height*1/2),(width*1/2,height*1/2),(width*1/2,height),(0,height)]],32)else:polygon=np.array([[(width*1/2,height*1/2),(width,height*1/2),(width,height),(width*1/2,height)]],32)感兴趣区域提取很多情况下只需要对部分感兴趣区域(RegionOfInterest,ROI)进行处理。正常情况下,黄色车道线位于图像左下角,白色车道线位于图像右下角,而图像中其他区域并不需要处理04基于OpenCV的自动驾驶小车----车道线检测#填充感兴趣区域掩码

cv2.fillPoly(mask,polygon,255)#提取感兴趣区域

croped_edge=cv2.bitwise_and(edges,mask)returncroped_edge#黄色车道线感兴趣区域提取yellow_croped=region_of_interest(yellow_edge,color="yellow")cv2.imwrite("yellow_croped.jpg",yellow_croped)#白色车道线感兴趣区域提取white_croped=region_of_interest(white_edge,color="white")cv2.imwrite("white_croped.jpg",white_croped)感兴趣区域提取很多情况下只需要对部分感兴趣区域(RegionOfInterest,ROI)进行处理。正常情况下,黄色车道线位于图像左下角,白色车道线位于图像右下角,而图像中其他区域并不需要处理04基于OpenCV的自动驾驶小车----车道线检测感兴趣区域提取很多情况下只需要对部分感兴趣区域(RegionOfInterest,ROI)进行处理。正常情况下,黄色车道线位于图像左下角,白色车道线位于图像右下角,而图像中其他区域并不需要处理感兴趣区域提取(从左至右:原图、白色边缘、黄色边缘)04基于OpenCV的自动驾驶小车----车道线检测可以设置两个坐标系,左边的坐标系表示的是值,对应图像空间(ImageSpace),右边的坐标系表示的是的值,对应参数空间(ParameterSpace),即直线的参数值基于霍夫变换的线段检测霍夫变换(HoughTransform,HT),可以检测图像中的直线、圆等几何图形防止(m,b)取值范围太大,在直线的表示方面可以改用的规范式代替一般直线表达式,参数空间由此变成04基于OpenCV的自动驾驶小车----车道线检测#----------------------------5.基于霍夫变换的直线检测----------------------------rho=1#距离精度:1像素angle=np.pi/180#角度精度:1度min_thr=10#最少投票数white_lines=cv2.HoughLinesP(white_croped,rho,angle,min_thr,np.array([]),minLineLength=8,maxLineGap=8)yellow_lines=cv2.HoughLinesP(yellow_croped,rho,angle,min_thr,np.array([]),minLineLength=8,maxLineGap=8)#输出查看返回的线段print(white_lines)基于霍夫变换的线段检测OpenCV已经封装好了基于霍夫变换的直线线段检测方法cv2.HoughLinesP()输出结果为[[[11287142117]][[9469134119]][[11185137111]][[10784132115]][[11998134117]]]04基于OpenCV的自动驾驶小车----车道线检测#--------------------------------6.小线段聚类------------------------------------defmake_points(frame,line):'''根据直线斜率和截距计算指定高度处的起始坐标'''height,width,_=frame.shapeslope,intercept=liney1=heighty2=int(y1*1/2)x1=int((y1-intercept)/slope)x2=int((y2-intercept)/slope)return[x1,y1,x2,y2]defaverage_lines(frame,lines,direction="left"):"""对小线段进行聚类"""lane_line=[]iflinesisNone:print(direction+"没有检测到线段")returnlane_linefits=[]基于霍夫变换的线段检测对检测出来的小线段做一下聚类和平均,最终生成两条线段04基于OpenCV的自动驾驶小车----车道线检测#计算每条小线段的斜率和截距forlineinlines:forx1,y1,x2,y2inline:#最小二乘法拟合fit=np.polyfit((x1,x2),(y1,y2),1)slope=fit[0]#斜率intercept=fit[1]#截距ifdirection=="left"andslope<0:fits.append((slope,intercept))elifdirection=="right"andslope>0:fits.append((slope,intercept))#计算所有小线段的平均斜率和截距iflen(fits)>0:fit_average=np.average(fits,axis=0)lane_line=make_points(frame,fit_average)returnlane_line基于霍夫变换的线段检测对检测出来的小线段做一下聚类和平均,最终生成两条线段04基于OpenCV的自动驾驶小车----车道线检测#聚合线段yellow_lane=average_lines(frame,yellow_lines,direction="left")white_lane=average_lines(frame,white_lines,direction="right")print(white_lane)基于霍夫变换的线段检测对检测出来的小线段做一下聚类和平均,最终生成两条线段在计算每条车道线的起始坐标时,分别令起始点的纵坐标然后计算对应的横坐标和的值,得到代表线段的起始点坐标04基于OpenCV的自动驾驶小车----车道线检测#----------------------------7.可视化显示检测结果-------------------------------defdisplay_line(frame,line,line_color=(0,0,255),line_width=3):'''在原图上合成展示线段'''line_img=np.zeros_like(frame)x1,y1,x2,y2=linecv2.line(line_img,(x1,y1),(x2,y2),line_color,line_width)line_img=cv2.addWeighted(frame,0.8,line_img,1,1)#图像合成方式显示检测结果returnline_img#显示检测结果img_yellow=display_line(frame,yellow_lane,line_color=(0,0,255),line_width=3)img_white=display_line(frame,white_lane,line_color=(0,0,255),line_width=3)cv2.imwrite("img_yellow.jpg",img_yellow)cv2.imwrite("img_white.jpg",img_white)基于霍夫变换的线段检测04基于OpenCV的自动驾驶小车----车道线检测基于霍夫变换的线段检测车道线检测结果

(从左至右依次为原图、白色线检测结果和黄色线检测结果)04基于OpenCV的自动驾驶小车----动作控制(1)正常检测到2条车道线:这种情况一般是直线车道且车辆稳定运行在车道线内,这时候只需要根据检测出的两条车道线微调角度即可;(2)检测出1条车道线:这种情况在转弯处容易出现,或者在小车开始大范围偏离时出现,这时候的策略应该是向已经检测到的这条车道线方向快速靠近;(3)检测不到车道线:这种情况说明已经失控并冲出了车道,应该立即停下小车。车道线检测结果主要有三种情况04基于OpenCV的自动驾驶小车----动作控制#-------------------------8.动作控制(转向角计算)-------------------------------defcompute_steer_angle(yellow_lane,white_lane,height,width):x_offset=0y_offset=int(height/2)#分情况计算横纵偏移值iflen(yellow_lane)>0andlen(white_lane)>0:#检测到2条线_,_,left_x2,_=yellow_lane_,_,right_x2,_=white_lanemid=int(width/2)x_offset=(left_x2+right_x2)/2-mideliflen(yellow_lane)>0:#只检测到黄色车道线x1,_,x2,_=yellow_lanex_offset=x2-x1eliflen(white_lane)>0:#只检测到白色车道线x1,_,x2,_=white_lanex_offset=x2-x1else:#都没检测到print("检测不到车道线,即将停止")return-1三种动作控制04基于OpenCV的自动驾驶小车----动作控制#计算最终转向角度angle_to_mid_radian=math.atan(x_offset/y_offset)angle_to_mid_deg=int(angle_to_mid_radian*180.0/math.pi)#转换为角度steering_angle=angle_to_mid_deg/45.0#归一化到区间returnsteering_angle#计算转向角height,width,_=frame.shapesteering_angle=compute_steer_angle(yellow_lane,white_lane,height,width)print(steering_angle)三种动作控制最终输出-0.2444444444444444404基于OpenCV的自动驾驶小车importcv2importnumpyasnpimportgymimportgym_donkeycar#导入自定义库fromimg_analysisimportregion_of_interest,average_lines,compute_steer_angle#设置模拟器环境env=gym.make("donkey-generated-roads-v0")obv=env.reset()#开始启动,并获取首帧图像action=np.array([0,0.2])#动作控制,第1个参数为转向值,第2个参数为油门值frame,reward,done,info=env.step(action)完整代码如下(opencv_drive/auto_drive.py)04基于OpenCV的自动驾驶小车#运行2000次动作fortinrange(2000):#高斯滤波去噪frame=cv2.GaussianBlu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论