




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
图像处理在智能车路径识别中的应用摘要机器视觉技术在智能车中得到了广泛的应用,这项技术在智能车的路径识别、障碍物判断中起着重要作用。基于此,依据飞思卡尔小车的硬件架构,研究机器视觉技术应用于飞思卡尔小车。飞思卡尔智能车处理器采用了MC9S12XS128芯片,路况采集使用的是数字摄像头OV7620。由于飞思卡尔智能车是是一款竞速小车,因此图像采集和处理要协调准确性和快速性,需要找到其中的最优控制。因此本设计主要需要完成的任务是:怎样用摄像头准确的采集每一场的图像,然后怎样进行二值化处理;以及怎样对图像进行去噪处理;最后也就是本设计的难点也是设计的核心,怎样对小车的轨迹进行补线。本设计的先进性,在众多的图像处理技术中找到了适合飞思卡尔智能车的图像处理方法。充分发挥了摄像头的有点。经过小车的实际测试以及相关的MATLAB仿真,最终相关设计内容都基本满足要求。小车的稳定性和快速性得到显著提高。关键词:OV7620,视频采集,图像处理,二值化
TheApplicationofImageProcessingintheRecognitionofIntelligentVehiclePathABSTRACTCameraMachinevisiontechnologyinthesmartcarinawiderangeofapplications,thetechnologyidentifiedinthepathofthesmartcar,andplaysanimportantroleintheobstaclestojudge.Basedonthis,basedonthearchitectureoftheFreescalecar,machinevisiontechnologyusedintheFreescalecar.FreescalesmartcartheprocessorMC9S12XS128chiptrafficcollectedusingadigitalcameraOV7620.
Freescale'sSmartcarisaracingcar,sotheimageacquisitionandprocessingtocoordinatetheaccuracyandfast,youneedtofindtheoptimalcontrol.Thisdesignneedtocompletethetask:howtousethecameratoaccuratelycaptureeveryimage,andthenhowtobinarizationprocessing;andhowtoimagedenoising;lastisthedifficultyofthisdesignisthedesignofthecore,howtofilllineonthetrajectoryofthecar.
TheadvancednatureofthedesignfoundinmanyimageprocessingtechniquesofimageprocessingmethodsforFreescaleSmartCar.Givefullplaytothecameraabit.TheactualtestingofthecarandMATLABsimulation,thefinaldesigncontentcanbasicallymeettherequirements.Thecar'sstabilityandfasttogetimprovedsignificantly.KEYWORDS:OV7620,VideoCapture,PictureProcessing,Binarization目录前言 1第1章飞思卡尔赛车及机器视觉的概述 21.1智能车的研究背景 21.1.1智能车的发展历史 21.1.2应用前景 21.2智能车设计要求介绍 31.3机器视觉介绍 41.4小结 4第2章主要思路及技术方案概要 52.1总体设计主要方法步骤 52.2摄像头的对比与选择 52.2.1摄像头的选取 52.2.2模拟摄像头 62.2.3数字摄像头 62.2.4摄像头的选定 72.3二值化方案的选取 72.3.1双峰值法 72.3.2迭代法 82.3.3大津法 82.3.4灰度拉伸-一种改进的大津法 92.3.5二值化方案的最终选定 92.4对图像进行去噪 92.4.1传统的去噪法 92.4.2小波去噪 112.4.3去噪方法的最终确定 132.5小结 13第3章硬件设计 143.1硬件总体方案设计 143.2核心控制板 153.3摄像头的安装 153.4小结 16第4章软件设计 174.1系统软件总体设计方案 174.2图像二值化软件设计 174.3去噪设计 194.3.1实验信号的产生 194.3.2 各参数下去噪效果对比 204.4二值化后补线 244.5小结 32第5章结果分析 335.1采集到的灰度值去噪前的MATLAB仿真 335.1.1去噪前MATLAB函数和仿真结果 335.1.2去噪后MATLAB仿真结果 345.2边界扣取 355.2.1边界扣取函数 355.2.2边界扣取仿真结果 365.3补线后效果 375.4小结 38结论 39谢辞 40参考文献 41附录 42外文资料翻译 45前言机器视觉技术近几十年来已经得到广泛的应用,并且已经取得了巨大的成功,大大改善了人们的日常生活。例如:智能导航系统,以及倒车摄像头等。机器视觉技术的核心是对图像的处理,根据不同的应用场合,图像处理也采用相应的技术。例如:对高清图像的处理,这个一定要保证图像的精确性,可以相应的牺牲一些,处理的速度,但是对图像的要求不高的情况下,对处理速度要求较高的情况下,就必须考虑牺牲一些对图像质量的要求,基于飞思卡尔小车模型的图像处理,需要兼顾这两方面的因素。需要考虑对图像处理的准确性还要考虑快速性,因此需要找到满足要求的最优方案。本设计的主要任务是,怎样保证图像处理的准确性;怎样对采集回来的灰度值图像进行二值化处理,以及为什么进行二值化;当出现干扰的情况下,怎样进行去噪处理;当在光照不均匀或者出现反光的情况下,采集到的灰度值会出现一定错误影响判断,这时怎样补出准确的轨迹。这些都是需要设计的内容。本设计内容按如下顺序展开:第一章主要论述了所研究的内容的背景及应用场合。第二章主要论述了各个设计方案的选取以及总体方案设计内容。重点论述了选择本方案的原因,以及其他方案的缺点。第三章主要讲述了本设计相关的硬件设计。本章主要分析了硬件的主要组成,以及每一部分在设计中的作用。第四章深刻分析了相关的算法设计以及部分程序调试效果。分析了每一种方案的算法的优缺点,以及最终选择作为本算法的最终原因。第五章给出了相关仿真效果以及最终本设计在小车调试中的实际性能表现,以及通过本设计改善了那些性能,以及还有那些性能不够理想,今后如何改进等。第1章飞思卡尔赛车及机器视觉的概述1.1智能车的研究背景1.1.1智能车的发展历史1953年,美国BarrettElectric公司制造了世界上第1台采用埋线电磁感应方式跟踪路径的自动导向车,也被称作“无人驾驶牵引车”。20世纪60年代和70年代初,AGV仍采用这种导向方式。但是,20世纪70年代中期,具有载货功能的AGV在欧洲得到了应用并被引入到美国。这些自动导向车主要用于自动化仓贮系统和柔性装配系统的物料运输。在20世纪70年代和80年代初,AGV的应用领域扩大而且工作条件也变得多样化,因此,新的导向方式和技术得到了更广泛的研究与开发。在最近的10-15年里,各种新型AGV被广泛地应用于各个领域。单元式AGV主要用于短距离的物料运输并与自动化程度较高的加工设备组成柔性生产线,除此以外,AGV还用于搬运体积和重量都很大的物品,尤其是在汽车制造过程中用多个载货平台式AGV组成移动式输送线,构成整车柔性装配生产线。最近,小型AGV应用更为广泛,而且以长距离不复杂的路径规划为主。AGV从仅由大公司应用,正向小公司单台应用转变,而且其效率和效益更好。至此出现了智能车的概念。1.1.2应用前景城市公共交通是与人民群众生产生活息息相关的重要基础设施。然而,目前世界上许多大城市都面临着由私人汽车过度使用而带来的诸多问题,例如道路堵塞、停车困难、能源消耗、噪声污染和环境污染等,这些问题严重降低了城市生活的质量。优先发展城市公共交通是提高交通资源利用效率,缓解交通拥堵的重要手段。国务院总理温家宝于2005年10月做出重要批示,要求优先发展城市公共交通,这是贯彻落实科学发展观和建设节约型社会的重要举措。大容量城市公共交通,如地铁、轻轨等,其最大优点是空间利用率和能源利用率较高。然而,由于缺乏足够的时间、空间、运力灵活性,在客流量不足的情况下,系统效率将大大降低,运营成本过高,难以大力推广和应用。回顾汽车发展的百年历史,不难发现其控制方式从未发生过根本性改变,即由人观察道路并驾驶车辆,形成“路-人-车”的闭环交通系统。随着交通需求的增加,这种传统车辆控制方式的局限性日益明显,例如安全性低(交通事故)和效率低(交通堵塞)。最新调查表明,95%的交通事故是由人为因素造成,交通堵塞也大都与驾驶员不严格遵守交通规则有关。如果要从根本上解决这一问题,就需要将“人”从交通控制系统中请出来,形成“车-路”闭环交通系统,从而提高安全性和系统效率。这种新型车辆控制方法的核心,就是实现车辆的智能化。智能车有着极为广泛的应用前景。结合传感器技术和自动驾驶技术可以实现汽车的自适应巡航并把车开得又快又稳、安全可靠;汽车夜间行驶时,如果装上红外摄像头,就能实现夜晚汽车的安全辅助驾驶;他也可以工作在仓库、码头、工厂或危险、有毒、有害的工作环境里,此外他还能担当起无人值守的巡逻监视、物料的运输、消防灭火等任务。在普通家庭轿车消费中,智能车的研发也是很有价值的,比如雾天能见度差,人工驾驶经常发生碰撞,如果用上这种设备,激光雷达会自动探测前方的障碍物,电脑会控制车辆自动停下来,撞车就不会发生了。1.2智能车设计要求介绍在在飞思卡尔比赛中,参赛选手使用大赛组委会统一提供的竞赛车模,以Freescale公司生产的16位微控制器MC9S12DG128B作为核心控制单元,自主构思控制方案及系统设计,包括传感器信号采集处理、控制算法及执行、动力电机驱动、转向舵机控制等,最终实现一套能够自主识别路线,并且可以实时输出车体状态的智能车控制软硬件系统。各参赛队完成智能车工程制作及调试后,于指定日期与地点参加比赛。参赛队伍之名次以赛车现场成功完成赛道比赛时间为主,技术方案及工程制作质量为辅来决定。但与去年不同的是,今年的赛道与去年不同,今年的赛道黑色轨迹不是在中间而是在两边,对于摄像头足来说难度不是太大,对于激光组来说有一定的挑战性。1.3机器视觉介绍所谓机器视觉就是用视觉传感器代替人眼来做测量和判断,这也是模式识别的基础。机器视觉系统是指通过图像传感器(即图像摄取装置,分为CMOS摄像头和CCD摄像头两种)将被摄取目标转换成图像信号,这个过程是由AD采样来完成的,然后把结果传送给专用的图像处理系统,根据像素分布和亮度、颜色等信息,转变成数字化信号;图像系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。在智能车导航技术方面,机器视觉技术由于其能提供丰富的信息、价格相对低廉、能与其他传感器方便的进行数据融合等特点,成为当前有着广泛应用前景的导航技术之一。1.4小结基于此,本文主要解决的问题如下:如何选择摄像头。摄像头有数字摄像头,有模拟摄像头。关键是如何选择。对图像采集时,在满足快速的情况下如何保证图像的准确性。飞思卡尔比赛是竞速比赛,利用摄像头采集图像时必须要满足图像的快速性,因为采集的速度直接影响到处理器对赛车的实时控制。如何对图像进行二值化。二值化有多种方式,如何找到一种最优的二值化方式。如何对反光处进行补线,并进行去噪。通过以上几个问题的解决,可以大大的提高飞思卡尔赛车的稳定性和快速性。第2章主要思路及技术方案概要2.1总体设计主要方法步骤为满足飞思卡尔赛车的设计要求,总体设计思路如下设计思路:通过对摄像头采集到的图像的进行处理,然后通过测速电机对小车的实时速度的采集,处理器再对采集到的数据进行分析,然后控制小车的运动方向和速度。同时外加小液晶和相应按键,这样可以根据现场情况来调节相应的PID参数来适应相应路况。本章主要论述的是各种方案的对比以及最终方案的选择。2.2摄像头的对比与选择2.2.1摄像头的选取图像传感器即摄像头是组成机器视觉系统的非常重要的元器件。根据其原理不同摄像头主要分为两种:CCD(ChargeCoupledDevice)摄像头、CMOS摄像头。CCD也称电耦合器件,其工作原理是:被摄物体反射光线到摄像头上,经过镜头聚焦到CCD感光芯片上,感光芯片根据光线的强弱积聚相应电荷,经周期性放电而产生表示图像的电信号。CMOS摄像头其实跟CCD差不多,也是将光转换成电信号的器件。它们的差异之处就是图像的扫描方式不同,CCD是采用连续扫描方式,即它只有等到最后一个像素扫描完成后才进行放大;CMOS传感器的每个像素都有一个将电荷放大为电信号的转换器。所以CMOS的功耗比CCD要小。由于CMOS功耗小,较CCD要便宜,而且图像质量满足要求。对于摄像头图像采集,也可以用OV7620数字摄像头模块,或者使用高速外部AD进行采集。也可以使用PAL制式黑白摄像头和单片机片内部AD来进行图像采集。另外根据摄像头的安装方式不同,也有旋转90度进行采集的。对于整个程序的流程也有很多不同,有采完一场图像后进行处理的,也有采集一行就进行处理的。2.2.2模拟摄像头在采集图像之前,我们首先要知道摄像头输出信号的特性。目前的模拟摄像头一般都是PAL制式的,输出的信号由复合同步信号,复合消隐信号和视频信号组成。视频信号:真正的图像信号,对于黑白摄像头,图像越黑,电压越低,图像越白,电压越高。在这里我们通过AD采集来得到亮度信号。复合同步信号:用于控制电视机的电子枪对电子的偏转。当电子枪收到行同步信号时,电子束就从上一行的最右端移动到下一行的最左端。当电子枪收到场同步信号时就从屏幕的最右下角移到最左上角。在这里我们需要用这个信号来控制采集像素的时序。复合消隐信号:在图像换行和换场时电子枪回扫时不发射电子。即收到复合同步信号后,电子枪要换位置时是不能发射电子束的,这时候就由这个信号来消隐。在这里我们完全不用理会这个信号。由于人眼看到的图像大于等于24Hz时人才不会觉得图像闪烁,所以PAL制式输出的图像是25Hz,即每秒钟有25幅画面,说的专业点就是每秒25帧,其中每一帧有625行。但由于在早期电子技术还不发达时,电源不稳定,容易对电视信号进行干扰,而交流电源是50Hz所以,为了和电网兼容,同时由于25Hz时图像不稳定,所以后来工程师们把一副图像分成两场显示,对于一幅画面,一共有625行,但是电子枪先扫描奇数场1,3,5,然后再扫描2,4,6,所以这样的话,一副图像就变成了隔行扫描,每秒钟就有50场了。2.2.3数字摄像头OV7620是1/3CMOS彩色/黑白图像传感器。它支持连续和隔行两种扫描方式,VGA与QVGA两种图像格式;最高像素为664×492,帧速率为30fps;数据格式包括YUV,YCrCb,RGB三种,能够满足智能车图像采集系统的要求。OV7620采用的是NTSC制,每秒30帧,一帧两场,那么每秒就有60场。意味着50/3MS就有一幅图像产生。7620支持VGA(640x320)QVGA(320x240),且默认的是VGA格式,通过调整SCCB可以改为QVGA格式。这样改有两个好处:首先像素小了。那么像素同步时间增大了,采点方便。再者减小计算量,没必要搞那么多的点。320x240pixels,理解为:有320行,一行有240个点。视野和可视距离:这个和镜头的选择有关,据我测试,f=3.6MM时视野应该有25度左右,f越大视场越小.可视距离需要调节镜头对焦.经我测试可视距离可以看十几米,毕竟相素值只有30万多,用单片机读可以看到3-4M的距离.这里解释一下为什么用单片机读会打折扣.因为黑线宽度只有2.5CM,太远了黑线会很细,采点之后就分辩不出是噪声还是有用信号了.在1米左右时,黑线宽度可用8个点表示。2.2.4摄像头的选定经过对比,选择数字摄像头不仅可以缩短设计周期,而且采集速度准确快速,所以最终选择数字摄像头OV7620。2.3二值化方案的选取图像二值化是数字图像处理技术中的一项基本技术,该系统中由于赛道是由黑色和白色两种颜色组成的,并且背景颜色基本也是白色的,系统的任务是识别出黑色的引跑线位置,由于其图像的干扰并不是很强,因此可以采用二值化的技术作为系统的图像预处理。经过二值化处理后将原来白色的像素点用“0”表示,而黑色像素点用“1”表示。根据阈值选取的不同,二值化的算法分为固定阈值和自适应阈值。比较常用的二值化方法则有:双峰法、迭代法、大津法和灰度拉伸法等。2.3.1双峰值法在对赛道环境的分析中,我们可以发现黑线部分的亮度是相对比较固定的,其波动的范围非常小,小于20(亮度值最大为255),而白色底板的亮度值变化相对较大一些,但仍能保证其与黑线的亮度值有较大的梯度。因此,可以采用直方图统计法来对其阀值进行自动设定,具体方法如下。首先存储一幅原始图像的所有数据,然后对整幅图像的第一像素点进行统计,最终把第个亮度值所对应的像素点个数统计出来,结果将出现一个双波峰形图,如图4-2所示。这将能较直接地比较出亮度值集中的区域,以两个波峰的中心位置所在的中点值作为该赛道的二值化阀值。该算法计算的精度较高,能够找到理想的一个阀值点,虽然它执行的时间较长,但是这只是在赛车未起跑前进行的初始化运算,对赛车起跑后的速度完全没有影响,因此该方案是可以采用的。2.3.2迭代法迭代法是基于逼近的思想进行设计的。其步骤如下:(1).求出图象的最大灰度值和最小灰度值,分别记为ZMAX和ZMIN,令初始阈值T0=(ZMAX+ZMIN)/2;(2)根据阈值TK将图象分割为前景和背景,分别求出两者的平均灰度值ZO和ZB;(3)求出新阈值TK+1=(ZO+ZB)/2;(4)若TK=TK+1,则所得即为阈值;否则转2,迭代计算。迭代所得的阈值分割的图象效果良好。基于迭代的阈值能区分出图像的前景和背景的主要区域所在,但在图像的细微处还没有很好的区分度。2.3.3大津法大津法由大津于1979年提出,对图像Image,记t为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。图像的总平均灰度为:u=w0*u0+w1*u1。从最小灰度值到最大灰度值遍历t,当t使得值g=w0*(u0-u)2+w1*(u1-u)2最大时t即为分割的最佳阈值。对大津法可作如下理解:该式实际上就是类间方差值,阈值t分割出的前景和背景两部分构成了整幅图像,而前景取值u0,概率为w0,背景取值u1,概率为w1,总均值为u,根据方差的定义即得该式。因方差是灰度分布均匀性的一种度量,方差值越大,说明构成图像的两部分差别越大,当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小,因此使类间方差最大的分割意味着错分概率最小。直接应用大津法计算量较大,因此我们在实现时采用了等价的公式g=w0*w1*(u0-u1)2。2.3.4灰度拉伸-一种改进的大津法大津法得到了广泛的应用,但有人发现,大津法致命的缺陷是当目标物与背景灰度差不明显时,会出现无法忍受的大块黑色区域,甚至会丢失整幅图像的信息。为了解决这个问题,有人提出了灰度拉伸的增强大津法。这种方法的原理其实就是在大津法的基础上通过增加灰度的级数来增强前后景的灰度差,从而解决问题。灰度增加的方法是用原有的灰度级乘上同一个系数,从而扩大灰度的级数,特别地,当乘上的系数为1时,这就是大津法的原型,因此,大津法可以看做是这种方法的一个特例。2.3.5二值化方案的最终选定在飞思卡尔赛车比赛中,由于要考虑到图像采集的速度和准确度。迭代所得的阈值分割的图象效果良好。基于迭代的阈值能区分出图像的前景和背景的主要区域所在,但在图像的细微处还没有很好的区分度,因此不采用。而对于大津法,其运算量大,影响速度,大津法致命的缺陷是当目标物与背景灰度差不明显时,会出现无法忍受的大块黑色区域,甚至会丢失整幅图像的信息,因此也不予采用。而对于灰度拉伸法,适合处理对速度要求不高的图像处理,处理数据量大,因此也不予采用。经过各种方案对比,最终选择双峰法,这种方法不仅满足对图像处理精度的要求,而且满足对速度的要求。2.4对图像进行去噪2.4.1传统的去噪法对随时间变化的信号,通常采用两种最基本的描述形式,即时域和频域。时域描述信号强度随时间的变化,频域描述在一定时间范围内信号的频率分布。对应的图像的去噪处理方法基本上可分为空间域法和变换域法两大类。前者即是在原图像上直接进行数据运算,对像素的灰度值进行处理。变换域法是在图像的变换域上进行处理,对变换后的系数进行相应的处理,然后进行反变换达到图像去噪的目的。由于传统的频域去燥方法比较复杂,这里不采用也不再叙述,主要介绍一下传统的时域去噪处理方法。传统时域处理方法主要有均值滤波和中值滤波。均值滤波邻域平均法是一种局部空间域处理的算法。设一幅图像为的阵列,处理后的图像为,它的每个像素的灰度级由包含领域的几个像素的灰度级的平均值所决定,即用下式得到处理后的图像: (2-l)式中;s是以点为中心的邻域的集合,M是s内坐标总数。图像邻域平均法的处理效果与所用的邻域半径有关。半径愈大,则图像模糊程度也愈大。另外,图像邻域平均法算法简单,计算速度快,但它的主要缺点是在降低噪声的同时使图像产生模糊,特别在边缘和细节处,邻域越大,模越厉害。中值滤波中值滤波是一种非线性滤波,由于它在实际运算过程中并不需要图像的统计特性,所以比较方便。中值滤波首先是被应用在一维信号处理技术中,后来被二维图像信号处理技术所应用。在一定的条件下,可以克服线性滤波器所带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声最为有效。但是对一些细节多,特别是点、线、尖顶细节多的图像不宜采用中值滤波的方法。中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替。设有一个一维序列,,…,,取窗口长度为m(m为奇数),对此序列进行中值滤波,就是从输入序列中相继抽出m个数,,…,,…,,…,,…,,其中为窗口的中心位置,,再将这m个点按其数值大小排列,取其序号为正中间的那作为出。用数学公式表示为: (2-2)例如:有一个序列为{0,3,4,0,7},则中值滤波为重新排序后的序列{0,0,3,4,7}中间的值为3。此例若用平均滤波,窗口也是取5,那么平均滤波输出为。因此平均滤波的一般输出为: (2-3)对于二位序列进行中值滤波时,滤波窗口也是二维的,但这种二位窗口可以有各种不同的形状,如线状、方形、圆形、十字形、圆环形等。二维数据的中值滤波可以表示为: (2-4)在实际使用窗口时,窗口的尺寸一般先用再取逐渐增大,直到其滤波效果满意为止。对于有缓变的较长轮廓线物体的图像,采用方形或圆形窗口为宜,对于包含尖顶角物体的图像,适宜用十字形窗口。使用二维中值滤波最值得注意的是保持图像中有效的细线状物体。与平均滤波器相比,中值滤波器从总体上来说,能够较好地保留原图像中的跃变部分。2.4.2小波去噪近年来,小波理论得了非常迅速的发展,由于其具备良好的时频特性和多分辨率特性,小波理论成功地在许多领域得到了广泛的应用。现在小波分析已经渗透到自然科学、应用科学、社会科学等领域。在图像去噪领域中,应用小波理论进行图像去噪受到许多专家学者的重视,并取得了非常好的效果。小波去噪的方法有多种,如利用小波分解与重构的方法滤波降噪、利用小波变换模极大值的方法去噪、利用信号小波变换后空域相关性进行信噪分离、非线性小波阈值方法去噪、平移不变量小波去噪法,以及多小波去噪等等。归结起来主要有三类:模极大值检测法、阈值去噪法和屏蔽(相关)去噪法。其中最常用的就是阈值法去噪,本文主要研究阈值去噪。小波去噪的基本思路:(1).先对含噪信号做小波变换,得到一组小波系数;(2).通过对进行阈值处理,得到估计系数,使得与两者的差值尽可能小;(3).利用进行小波重构,得到估计信号即为去噪后的信号。Donoho提出了一种非常简洁的方法对小波系数进行估计。对连续做几次小波分解后,有空间分布不均匀信号各尺度上小波系数在某些特定位置有较大的值,这些点对应于原始信号的奇变位置和重要信息,而其他大部分位置的较小;对于白噪声,它对应的小波系数在每个尺度上的分布都是均匀的,并随尺度的增加,系数的幅值减小。因此,通常的去噪办法是寻找一个合适的数作为阈值(门限),把低于λ的小波函数(主要由信号引起),设为零,而对于高于的小波函数(主要由信号引起),则予以保留或进行收缩,从而得到估计小波系数,它可理解为基本由信号引起的,然后对进行重构,就可以重构原始信号。估计小波系数的方法如下,取: (2-5)定义: (2-6)称之为硬阈值估计方法。一般软阈值估计定义为 (2-7)(4).综上所述基于空域的平均滤波法和非线性的中值滤波都是通过对图像像素的灰度值进行运算,达到平滑图像的效果。平均滤波是以点邻域像素灰度平均值来代替该点的灰度值,而中值滤波则以点邻域像素灰度值中值来代替该点的灰度值,因此,对于随机噪音的抑制能力,中值滤波器的性能要比均值滤波器的差些。但对于脉冲干扰来讲,特别是脉冲宽度小于滤波器的窗口宽度一半,中值滤波还是很有效的。不过,他们在平滑图像的同时亦会使图像轮廓变得模糊,它们的噪音平滑效果与窗口的宽度有关,窗口宽度越宽,噪音平滑效果越好,但图像就越模糊,这个矛盾难于解决,也是均值滤波和中值滤波的缺点。2.4.3去噪方法的最终确定综上所述基于空域的平均滤波法和非线性的中值滤波都是通过对图像像素的灰度值进行运算,达到平滑图像的效果。平均滤波是以点邻域像素灰度平均值来代替该点的灰度值,而中值滤波则以点邻域像素灰度值中值来代替该点的灰度值,因此,对于随机噪音的抑制能力,中值滤波器的性能要比均值滤波器的差些。但对于脉冲干扰来讲,特别是脉冲宽度小于滤波器的窗口宽度一半,中值滤波还是很有效的。不过,他们在平滑图像的同时亦会使图像轮廓变得模糊,它们的噪音平滑效果与窗口的宽度有关,窗口宽度越宽,噪音平滑效果越好,但图像就越模糊,这个矛盾难于解决,也是均值滤波和中值滤波的缺点。而小波法去噪又刚好克服了这些缺点,所以最终选择了小波法去噪。2.5小结经过对比和选择,摄像头选择为数字摄像头;二值化算法选择双峰法;去噪选择小波去噪法。
第3章硬件设计3.1硬件总体方案设计为满足飞思卡尔赛车的设计要求,总体硬件思路如下设计思路:通过对摄像头采集到的图像的进行处理,然后通过测速电机对小车的实时速度的采集,通过处理器对采集到的数据进行分析,然后控制小车的运动方向和速度。同时外加小液晶和相应按键,这样可以根据实时情况来调节相应的PID参数来适应相应路况。本章主要论述的是各种方案的对比以及最终方案的选择。此智能车辆定位系统用摄像头拍摄车辆前方的赛道,通过MC9S12DG12采样视频信号,获得图像数据。然后用合适的算法,如跟踪边缘检测算法,分析图像数据,提取目标指引线。然后,系统根据目标指引线的位置信息,对舵机和电机施以合适的控制。本智能车辆定位系统的结构图如图3-1所示。因为系统是一个有机的整体,所以任何一部分的改进都能提高小车的性能。头电路图3-1智能车结构图虽然轮胎、驱动电机、舵机和电池等车模主要结构不能作改动,但是一些机械结构上的细节仍然会对小车性能产生影响,为此我们对这些细节进行了一定的调整。3.2核心控制板核心控制板(如图3-2所示)负责视频采集、获取速度并输出舵机和驱动电机的控制信号。电路板上包括了S12单片机工作所必需的稳压模块、时钟模块和复位模块,同时还包括了调PID参数电路、串口以及无线SPI接口等。图3-2核心控制板核心控制板的原理图见附录。3.3摄像头的安装摄像头的安装位置应合适选取。安装位置太低,会导致视域不够广阔,影响寻线的有效范围;安装位置太高,导引线会变得过窄而无法被检测到,而且赛车系统会因重心抬高而稳定性变差。安装位置合适的一个标准是:在此位置的拍摄范围能满足控制的需要。控制的策略简单,则所需的拍摄范围就可以小一些;反之策略复杂,需获得的赛道信息较多,则拍摄范围就应大一些。作为本设计的赛车系统,控制策略涉及到赛车入弯时能区分S弯还是普通的单向弯。安装方式如图3-3所示,经过测试安装满足要求。图3-3智能车摄像头安装图3.4小结由于小车要快速奔跑,需要保证它的稳定性坚固性,对于小车的布局都有严格的要求,经过测试如上图的的布局最为合理。第4章软件设计4.1系统软件总体设计方案否是否是场同步信号检测图像采样舵机控制速度控制图像去噪二值化轨迹提取速度提取系统初始化图4-1系统软件结构4.2图像二值化软件设计根据第二章的双峰值法设计原理相应的程序的代码如下(部分代码):#pragmaCODE_SEGDEFAULTucharthreshold;//动态阈值ucharmax;//双峰法的最大值ucharmin;//双峰法的最小值/********************二值化***********************/voidBinary(void){for(temp_i=0;temp_i<line;temp_i++)//每行求一次动态阈值{max=110;//赋初值min=90;//赋初值for(temp_j=0;temp_j<point;temp_j++){/*取值范围在40-250中间*/if(Data_buffer[temp_i][temp_j]>max&&Data_buffer[temp_i][temp_j]<=250)max=Data_buffer[temp_i][temp_j];elseif(Data_buffer[temp_i][temp_j]<min&&Data_buffer[temp_i][temp_j]>=40)min=Data_buffer[temp_i][temp_j];}threshold=(uchar)((max+min)/2);//每行最大值最小值的平均值Data_Binary(temp_i,threshold);//每行求一次动态阈值//Data_Binary(temp_i+1,threshold);//没行求一次动态阈值//Data_Binary(temp_i+2,threshold);//没行求一次动态阈值//Data_Binary(temp_i+3,threshold);//没行求一次动态阈值//Data_Binary(temp_i+4,threshold);//没行求一次动态阈值}}阀值点个数黑线中心区域底板中心区域50004000300020001000宽度值图4-2直方图统计法从分割(如图4-2所示)的效果来看,当前后景的对比较为强烈时,分割效果较好;否则基本无效。4.3去噪设计接下来按照上述小波阈值变换在信号去噪中的算法及小波阈值函数进行计算机仿真,仿真程序采用MATLAB语言编写。该节首先产生一个实验信号,然后对小波去噪时各种参数设置进行了详细的对比研究,最后用MATLAB语言对小波去噪进行仿真。4.3.1实验信号的产生该节所用到的实验信号是由wnoise()函数产生的长度为211点、含标准高斯白噪声、信噪比为3的‘heavysine’信号。MATLAB工具箱提供了函数wnoise以实现为检验小波去噪性能产生测试噪声。其语法格式为:X=wnoise(FUN,N)[X,XN]=wnoise(FUN,N,SQRT_SNR)[X,XN]=wnoise(FUN,N,SQRT_SNR,INIT)1.X=wnoise(FUN,N)产生幅值在[0,1]之间长度为2N的信号,信号的类型由FUN指定:FUN=1BLOCKS产生不规则的方波信号FUN=2BUMPS产生低频噪声FUN=3HEAVYSIN产生随机间断的正弦信号FUN=4DROPLER产生chirp信号FUN=5QUADCHIRP产生4次调频信号FUN=6MISHMASH产生混杂信号2.[X,XN]=wnoise(FUN,N,SQRT_SNR)产生含有白噪声的信号XN,SQRT_SNR是信号的噪声比。3.[X,XN]=wnoise(FUN,N,SQRT_SNR,INIT)使用初始值INIT产生含噪信号。下面的MATLAB语句产生信号:%产生一个Heavysine初始信号x和长度为211点、含标准高斯白噪声的信号xrefsnr=3;init=2055615866;[xref,x]=wnoise(3,11,snr,init);subplot(221),plot(xref),axis([12048-1010]);title('Originalsignal');subplot(223),plot(x),axis([12048-1010]);title(['Noisysignal-Signaltonoiseratio=',...num2str(fix(snr))]);图4-3所示就是以上语句为产生的测试信号图形。图4-3原始信号和含燥信号各参数下去噪效果对比MATLAB工具箱提供了函数wden以实现自动利用小波进行一维信号的去噪。其语法格式为:[XD,CXD,LXD]=wden(X,TPTR,SORH,SCAL,N,'wname')[XD,CXD,LXD]=wden(C,L,TPTR,SORH,SCAL,N,'wname')(1)[XD,CXD,LXD]=wden(X,TPTR,SORH,SCAL,N,'wname')对输入信号X进行去噪处理,返回经过处理的信号XD,以及XD的小波分解结构[CXD,LXD]。(2)[XD,CXD,LXD]=wden(C,L,TPTR,SORH,SCAL,N,'wname')根据信号小波分解结构[C,L]对信号进行去噪处理。各参数的选择对比如下:1.四种阈值选取方式的对比(TPTR的设置)根据基本的噪声模型,程序中使用四种规则来选取阈值,每一种规则的选取有参数TPTR决定。TPTR的选择有以下四种阈值规则:(1)TPTR=‘rigrsure’是一种基于史坦的无偏似然估计(二次方程)原理的自适应阈值选择。对一个给定的阈值t,得到他的似然估计,再将非似然t最小化,就得到了所选的阈值,它是一种软件阈值估计器。(2)TPTR=‘sqtwolog’采用的是固定的阈值形式,产生的阈值大小事sqrt(2*log(length(x)))。(3)TPTR=‘heursure’事前两种阈值的综合,是最优预测变量阈值选择。如果噪声比很小(估计有很大的噪声),因此,采用此种启发式的阈值。(4)TPTR=‘minimaxi’采用的是一种极大极小原理,它产生一个最小均方误差值,而不是无误差。在统计学上,这种极值原理在于设计估计器。因为被消噪的信号可以看作与未知回归函数的估计式相似,这种极值估计器可以在一个给定的函数集中实现最大均方误差最小化。在MATLAB中运行以下语句:%不同阈值选取方式下滤波效果的比较snr=3;init=2055615866;[xref,x]=wnoise(3,11,snr,init);lev=5;xd=wden(x,'rigrsure','s','sln',lev,'sym8');subplot(221),plot(xd),axis([12048-1010]);title('rigrsure');xd=wden(x,'heursure','s','one',lev,'sym8');subplot(222),plot(xd),axis([12048-1010]);title('heursure');xd=wden(x,'sqtwolog','s','sln',lev,'sym8');subplot(223),plot(xd),axis([12048-1010]);title('sqtwolog');xd=wden(x,'minimaxi','s','sln',lev,'sym8');subplot(224),plot(xd),axis([12048-1010]);title('minimaxi');[c,l]=wavedec(x,lev,'sym8');xd=wden(c,l,'minimaxi','s','sln',lev,'sym8');得到4个去噪效果图如图4-4所示。图4-4MATLAB中的4种阀值选取方式对比可以看出,固定阈值形式(sqtwolog)和启发式阈值(heuesure)的去噪更彻底,而由于rigrsure和minimaxi阈值选取规则较为保守(阈值较小),导致只有部分系数置零噪声去除不彻底。2.软门限阈值和硬门限阈值处理比较(SORH的设置)对于阈值函数的确定,Donoho提出了两种:硬阈值和软阈值。在硬阈值处理中,由于收缩函数的不连续性,会在恢复的信号中产生一些人为的“噪声点”。软阈值的连续性较好。在MATLAB语句中,SORH=‘s’,则为软阈值处理,向量X为待处理的信号。当SORH=‘h’,则为硬阈值处理。一般来说,用硬阈值处理后的信号比用软阈值处理后的信号更为粗糙。在MATLAB下运行如下语句:%软门限阈值和硬门限阈值效果比较snr=3;init=2055615866;[xref,x]=wnoise(3,11,snr,init);thr=0.4;%作用硬阈值xthard=wthresh(x,'h',thr);%作用软阈值xtsoft=wthresh(x,'s',thr);subplot(221),plot(xthard);title('作用硬阈值的结果');subplot(223),plot(xtsoft);title('作用软阈值的结果');得到去噪效果对比图如图4-4所示。图4-4软门限阀值和硬门限阀值处理比较实验表明,软门限阈值处理方式一般能够取得更为平滑和理想的去噪效果。3.小波函数的比较选取(wname)小波函数可以选取一个正交小波,如Daubechies(dbN),symlets(symN),coiflets(soifN)等。具体选择可以根据实际需要决定,在我们的实验中选择的是sym8(光滑的紧支撑双正交小波)。4.4二值化后补线如果在拐弯处出现线丢失等状况需要补线,则补线的大致原则是:选择每一场离小车较近的几个连续点。取出其相应偏差值取其平均值,然后根据偏差趋势,补出其相应缺失的线。补线代码如下:voidMidline(void){if(Point.VFlag==0)//寻线正常{for(temp_line=(line-1);temp_line>=0;temp_line--){if(Point.Left[temp_line]==0&&Point.Right[temp_line]!=(point-1))//左边丢失{Middle[temp_line]=(int)((Middle[temp_line+1]+(Rate*(Point.Right[temp_line]-Point.Right[temp_line+1]))));}elseif(Point.Left[temp_line]!=0&&Point.Right[temp_line]==(point-1))//右边丢失{Middle[temp_line]=(int)((Middle[temp_line+1]+(Rate*(Point.Left[temp_line]-Point.Left[temp_line+1]))));}elseif(Point.Left[temp_line]!=0&&Point.Right[temp_line]!=(point-1))//正常{Middle[temp_line]=(int)((Point.Left[temp_line]+Point.Right[temp_line])/2);}else//两行全丢失保持{Middle[temp_line]=Middle[temp_line+1];}}}elseif(Point.VFlag!=1&&Point.VFlag!=0)//近处丢失后几行寻到{if(Point.RStartLine<(line-3)&&Point.RStartLine>=22)//近处几行丢失补出来{for(temp_i=(Point.RStartLine+3);temp_i<line;temp_i++){Point.Right[temp_i]=2*Point.Right[temp_i-1]-Point.Right[temp_i-2];}}if(Point.LStartLine<(line-3)&&Point.LStartLine>=22)//近处几行丢失补出来{for(temp_j=(Point.LStartLine+3);temp_j<line;temp_j++){Point.Left[temp_j]=2*Point.Left[temp_j-1]-Point.Left[temp_j-2];}}if(((Point.RStartLine<22)||(Point.LStartLine<22))&&(Point.RStartLine!=0&&Point.LStartLine!=0))//左右起始行不在同一行且无法先下补线{if(Point.LStartLine<Point.RStartLine){for(temp_line=(Point.LStartLine+2);temp_line>=0;temp_line--){if(Point.Left[temp_line]==0&&Point.Right[temp_line]!=(point-1)){Middle[temp_line]=(int)((Middle[temp_line+1]+(Rate*(Point.Right[temp_line]-Point.Right[temp_line+1]))));}elseif(Point.Left[temp_line]!=0&&Point.Right[temp_line]==(point-1)){Middle[temp_line]=(int)((Middle[temp_line+1]+(Rate*(Point.Left[temp_line]-Point.Left[temp_line+1]))));}elseif(Point.Left[temp_line]!=0&&Point.Right[temp_line]!=(point-1)){Middle[temp_line]=(int)((Point.Left[temp_line]+Point.Right[temp_line])/2);}else{Middle[temp_line]=Middle[temp_line+1];}}for(temp_line=(line-1);temp_line>(Point.LStartLine+2);temp_line--)//近处没有线的直接补出来{Middle[temp_line]=Middle[Point.LStartLine+2];}}else//左右起始行不在同一行且无法先下补线{for(temp_line=(Point.RStartLine+2);temp_line>=0;temp_line--){if(Point.Left[temp_line]==0&&Point.Right[temp_line]!=(point-1)){Middle[temp_line]=(int)((Middle[temp_line+1]+(Rate*(Point.Right[temp_line]-Point.Right[temp_line+1]))));}elseif(Point.Left[temp_line]!=0&&Point.Right[temp_line]==(point-1)){Middle[temp_line]=(int)((Middle[temp_line+1]+(Rate*(Point.Left[temp_line]-Point.Left[temp_line+1]))));}elseif(Point.Left[temp_line]!=0&&Point.Right[temp_line]!=(point-1)){Middle[temp_line]=(int)((Point.Left[temp_line]+Point.Right[temp_line])/2);}else{Middle[temp_line]=Middle[temp_line+1];}}for(temp_line=(line-1);temp_line>(Point.RStartLine+2);temp_line--)//近处没有线的直接补出来{Middle[temp_line]=Middle[Point.RStartLine+2];}}}elseif((Point.RStartLine==0)&&(Point.LStartLine>=22))//只有一边的线完整{Middle[line-1]=Point.Left[line-1]+50;for(temp_line=(line-2);temp_line>=0;temp_line--){if(Point.Left[temp_line]==0)Middle[temp_line]=Middle[temp_line+1];elseMiddle[temp_line]=(int)((Middle[temp_line+1]+(Rate*(Point.Left[temp_line]-Point.Left[temp_line+1]))));}}elseif((Point.LStartLine==0)&&(Point.RStartLine>=22))//只有一边的线完整{Middle[line-1]=Point.Right[line-1]-50;for(temp_line=(line-2);temp_line>=0;temp_line--){if(Point.Right[temp_line]==(point-1))Middle[temp_line]=Middle[temp_line+1];elseMiddle[temp_line]=(int)((Middle[temp_line+1]+(Rate*(Point.Right[temp_line]-Point.Right[temp_line+1]))));}}else//通过近处几行的补线图像完整{if(Point.LStartLine<=Point.RStartLine){for(temp_line=(line-1);temp_line>=Point.LStartLine;temp_line--)//补出来的线可能会有0或是point-1{Middle[temp_line]=(Point.Left[temp_line]+Point.Right[temp_line])/2;}for(temp_line=(Point.LStartLine-1);temp_line>=0;temp_line--){if(Point.Left[temp_line]==0&&Point.Right[temp_line]!=(point-1))//左边丢失{Middle[temp_line]=(int)((Middle[temp_line+1]+(Rate*(Point.Right[temp_line]-Point.Right[temp_line+1]))));}elseif(Point.Left[temp_line]!=0&&Point.Right[temp_line]==(point-1))//右边丢失{Middle[temp_line]=(int)((Middle[temp_line+1]+(Rate*(Point.Left[temp_line]-Point.Left[temp_line+1]))));}elseif(Point.Left[temp_line]!=0&&Point.Right[temp_line]!=(point-1))//正常{Middle[temp_line]=(Point.Left[temp_line]+Point.Right[temp_line])/2;}else//全丢失保持{Middle[temp_line]=Middle[temp_line+1];}}}else{for(temp_line=(line-1);temp_line>=Point.RStartLine;temp_line--)//补出来的线可能会有0或是point-1{Middle[temp_line]=(int)((Point.Left[temp_line]+Point.Right[temp_line])/2);}for(temp_line=(Point.RStartLine-1);temp_line>=0;temp_line--){if(Point.Left[temp_line]==0&&Point.Right[temp_line]!=(point-1))//左边丢失{Middle[temp_line]=(int)((Middle[temp_line+1]+(Rate*(Point.Right[temp_line]-Point.Right[temp_line+1]))));}elseif(Point.Left[temp_line]!=0&&Point.Right[temp_line]==(point-1))//右边丢失{Middle[temp_line]=(int)((Middle[temp_line+1]+(Rate*(Point.Left[temp_line]-Point.Left[temp_line+1]))));}elseif(Point.Left[temp_line]!=0&&Point.Right[temp_line]!=(point-1))//正常{Middle[temp_line]=(Point.Left[temp_line]+Point.Right[temp_line])/2;}else//全丢失保持{Middle[temp_line]=Middle[temp_line+1];}}}}}if(Point.VFlag==1)//未找到何时的中线时保持上场{Keep();}//qulv=Qulv();//Start_Line();}4.5小结本章简单概述了程序的总体设计方案,主要针对二值化,去噪,以及补线程序设计做了比较细致的设计说明,经测试验证该软件设计基本满足要求。第5章结果分析5.1采集到的灰度值去噪前的MATLAB仿真5.1.1去噪前MATLAB函数和仿真结果MATLAB仿真函数如下:%LastNumSum:上次数据个数%TXTName:文件名%CurrentTXTNum:当前文件名前缀%使用说明:只用更改更改TxTNum使之和实际待读文件数目一直clear%清除变量TxTNum=1;%文件个数NumSum=0;%记录数据总个数TXTSuffix='.txt';%文件后缀Auxi=48;%'0'的ASCIIholdon;%保持当前图画fortemp=49:(TxTNum+48)if(temp<58)CurrentTXTNum=temp;TXTName=strcat(CurrentTXTNum,TXTSuffix);%合并字符串else%超过十个文件CurrentTXTNum=48+mod((temp-48),10);%mod对10取余TXTName=strcat(49,CurrentTXTNum,TXTSuffix);endin=fopen(TXTName);%打开第TXTName个文件[RevDate,DataNum]=fscanf(in,'%d');%读取数据fclose(in);%关闭文件LastNumSum=NumSum+1;%计算个数NumSum=NumSum+DataNum;DataIndex=1:DataNum;x=LastNumSum:NumSum;y=RevDate(DataIndex);plot(x,y,'.');endaxis([040000255]);在直道处取一场数据30行每一行120个点二值化后进行MATLAB仿真仿真结果如图5.1所示图5-1噪声处理前仿真结果5.1.2去噪后MATLAB仿真结果加入去噪算法后相应的MATLAB仿真结果如图5-2所示图5-2噪声处理后仿真结果5.2边界扣取5.2.1边界扣取函数clcclearcloseall;%%Image=imread('image1.jpg');%figure,imshow(Image);%ImageGray=rgb2gray(Image);%figure,imshow(ImageGray);NumSum=0;%记录数据总个数TXTSuffix='.txt';%文件后缀Auxi=48;%'0'的ASCIICurrentTXTNum=49;TXTName=strcat(CurrentTXTNum,TXTSuffix);%合并字符串in=fopen(TXTName);%打开第TXTName个文件[RevDate,DataNum]=fscanf(in,'%d');%读取数据fclose(in);%关闭文件CRevDate=reshape(RevDate,130,30);CRevDate=CRevDate';U8date=uint8(CRevDate);figure,imshow(U8date);BW=edge(U8date,'sobel');figure,imshow(BW);[BW,thresh]=edge(U8date,'sobel');5.2.2边界扣取仿真结果仿真结果如图5-3和5-4所示:图5-3扣取出的直道灰度图像图5-4扣取出的直道二值化图像5.3补线后效果根据扣取的结果分析得实验的结果基本满足要求。根据补线的原则进行补线,然后根据两边黑线,得出小车需要沿着中间轨迹前进。下面是补线后的数据在直道时和在弯道时一场数据的情况。图5-5直道补线一场的边界图图5-6弯道补线一场的边界图分析如下:根据小车前进的趋势,可以大致补出出现盲区的黑线区域,通过串口采集回来的数据(如图5-5和5-6)分析后知效果基本理想,满足设计要求。5.4小结通过实验和小车的实际运行结果分析,无论是图像的二值化、去噪还
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校园电商推广合作合同(2篇)
- 2025企业员工劳动合同协议书
- 2025企业合同范本2
- 输卵管堵塞的临床护理
- 2025科技公司劳动合同样本参考
- 2025年监理工程师之合同管理提升训练试卷A卷附答案
- 2025年一级建造师之一建矿业工程实务基础试题库和答案要点
- 2025标准版商业店铺续租合同范本
- 藏医学专业就业能力展示
- 腹部创伤的临床护理
- 《汽车涂装》2024-2025学年第一学期工学一体化课程教学进度计划表
- 小学生涯回顾分享模板
- 机关财务课件
- 2025年冀教版七年级英语下册教学工作计划
- 成人雾化吸入护理课件
- 【MOOC】创造学-我爱创新-江西财经大学 中国大学慕课MOOC答案
- 三相异步电机基础培训
- 公对公劳务合同范例
- 2025新外研社版英语七年级下单词表
- 急救救援知识培训
- 脑血管支架置入术后护理
评论
0/150
提交评论