智能网联汽车技术及仿真实例(微课版)
上QQ阅读APP看书,第一时间看更新

项目2 视觉传感器

学习任务2.1 视觉传感器认知

学习任务2.2 视觉传感器函数和模块

学习任务2.3 视觉传感器仿真实例

【例2-1】使用棋盘格配置单目摄像机,并利用鸟瞰图验证配置单目摄像机的正确性。

解:在MATLAB命令行窗口输入以下程序。


1 mappingCoeffs=[8.751e+2,-3.038e-4,-4.815e-8,1.709e-11];                        %映射系数 
2 imageSize=[1500,2000];                                                         %图像大小 
3 distortionCenter=[1000,750];                                                   %畸变中心 
4 stretchMatrix=[1,0;0,1];                                                       %转换矩阵 
5 intrinsics=fisheyeIntrinsics(mappingCoeffs,imageSize, ...                      %内部参数 
 distortionCenter, stretchMatrix); 
6 I=imread('checkerboard.png');                                                  %读取棋盘图像 
7 imshow(I)                                                                      %显示棋盘图像 
8 [imagePoints,boardSize]=detectCheckerboardPoints(I);                           %识别棋盘图像 
9 squareSize=0.029;                                                              %棋盘方格边长 
10 worldPoints=generateCheckerboardPoints(boardSize,squareSize);                 %棋盘角点世界坐标 
11 patternOriginHeight=0;                                                        %棋盘原点高度 
12 [pitch,yaw,roll,height]=estimateMonoCameraParameters(intrinsics, ...          %估计外部参数 
                                imagePoints,worldPoints,patternOriginHeight); 
13 [undistortedI,camIntrinsics]=undistortFisheyeImage(I, ...                     %修正鱼眼图像失真 
 intrinsics,'Output','full'); 
14 figure                                                                        %设置图形窗口 
15 imshow(undistortedI)                                                          %显示无失真图像 
16 monoCam=monoCamera(camIntrinsics,height, ...                                  %配置鱼眼相机 
 'Pitch',pitch,'Yaw',yaw,'Roll',roll) 
17 distAheadOfSensor=6;                                                          %传感器前方距离 
18 spaceToOneSide=2.5;                                                           %左右各2.5m 
19 bottomOffset=0.2;                                                             %在传感器前0.2m看 
20 outView=[bottomOffset,distAheadOfSensor, ...                                  %观测区域 
 -spaceToOneSide,spaceToOneSide]; 
21 outImageSize=[NaN,1000];                                                      %输出图像尺寸 
22 birdsEyeConfig=birdsEyeView(monoCam,outView,outImageSize);                    %创建鸟瞰图 
23 B=transformImage(birdsEyeConfig,undistortedI);                                %图像转换为鸟瞰图 
24 imagePoint0=vehicleToImage(birdsEyeConfig,[1.5,0]);                           %车辆转换成图像 
25 annotatedB=insertMarker(B,imagePoint0);                                       %添加标记 
26 annotatedB=insertText(annotatedB,imagePoint0,'1.5m');                         %插入文本 
27 figure                                                                        %设置图形窗口 
28 imshow(annotatedB)                                                            %显示鸟瞰图像 

单目摄像机配置为


monoCam =  
  monoCamera - 属性: 
        Intrinsics: [1×1 cameraIntrinsics] 
        WorldUnits: 'meters' 
            Height: 0.4437 
             Pitch: 22.2689 
               Yaw: -3.2898 
              Roll: -3.0256 
    SensorLocation: [0 0] 

输出结果如图2-22所示。

图2-22 单目摄像机标定

【例2-2】配置单目摄像机,并测量摄像机前任意点的坐标和图像中任意点的坐标。

解:在MATLAB命令行窗口输入以下程序。


1 focalLength=[800,800];                                                            %焦距 
2 principalPoint=[320,240];                                                         %光学中心
3 imageSize=[480,640];                                                              %图像尺寸 
4 intrinsics=cameraIntrinsics(focalLength,principalPoint,imageSize);                %内部参数 
5 height=2.18;                                                                      %安装高度 
6 pitch=14;                                                                         %俯仰角 
7 sensor=monoCamera(intrinsics,height,'Pitch',pitch)                                %配置单目摄像机 
8 Ioriginal=imread('road.png');                                                     %读取图像 
9 imshow(Ioriginal)                                                                 %显示图像 
10 xyVehicleLoc1=[10,0];                                                            %摄像机前方8m 
11 xyImageLoc1=vehicleToImage(sensor,xyVehicleLoc1);                                %转换成图像坐标 
12 IvehicleToImage=insertMarker(Ioriginal,xyImageLoc1);                             %插入标记 
13 IvehicleToImage=insertText(IvehicleToImage,xyImageLoc1+5,'10m');                 %插入文本 
14 figure                                                                           %设置图形窗口 
15 imshow(IvehicleToImage)                                                          %显示摄像机前方点 
16 xyImageLoc2=[300,300];                                                           %图像点 
17 xyVehicleLoc2=imageToVehicle(sensor,xyImageLoc2)                                 %转换成车辆坐标 
18 IimageToVehicle=insertMarker(Ioriginal,xyImageLoc2);                             %插入标记 
19  displayText=sprintf('(%.2f m,%.2f m)',xyVehicleLoc2);                           %字符串 
20 IimageToVehicle=insertText(IimageToVehicle,xyImageLoc2+5,displayText);           %插入文本 
21 figure                                                                           %设置图形窗口 
22 imshow(IimageToVehicle)                                                          %显示图像点

输出结果如图2-23所示。

图2-23 单目摄像机配置及测量

图2-23 单目摄像机配置及测量(续)

【例2-3】单目摄像机产生视觉识别。

解:在MATLAB命令行窗口输入以下程序。


1 focalLength=[800,800];                                                        %焦距 
2 principalPoint=[320,240];                                                     %光学中心 
3 imageSize=[480,640];                                                          %图像尺寸 
4 intrinsics=cameraIntrinsics(focalLength,principalPoint,imageSize);            %内部参数 
5 height=1.5;                                                                   %安装高度 
6 pitch=1;                                                                      %俯仰角 
7 monoCamConfig=monoCamera(intrinsics,height,'Pitch',pitch);                    %配置摄像机 
8 visionSensor=visionDetectionGenerator(monoCamConfig);                         %视觉检测器 
9 scenario=drivingScenario;                                                     %创建驾驶场景 
10 egoVehicle=vehicle(scenario);                                                %添加主车辆 
11 targetCar1=vehicle(scenario,'Position',[30,0,0]);                            %添加车辆1 
12 targetCar2=vehicle(scenario,'Position',[20,3,0]);                            %添加车辆2 
13 bep=birdsEyePlot('XLim',[0,50],'YLim',[-20,20]);                             %创建鸟瞰图 
14 olPlotter=outlinePlotter(bep);                                               %轮廓绘图仪 
15 [position,yaw,length,width,originOffset,color]=targetOutlines(egoVehicle);   %目标轮廓 
16 plotOutline(olPlotter,position,yaw,length,width);                            %显示轮廓 
17 caPlotter=coverageAreaPlotter(bep,'DisplayName', ...                         %覆盖绘图仪 
 'Coverage area','FaceColor','blue'); 
18 plotCoverageArea(caPlotter,visionSensor.SensorLocation, ...                  %显示覆盖区域 
 visionSensor.MaxRange,visionSensor.Yaw,visionSensor.FieldOfView(1)) 
19 poses=targetPoses(egoVehicle);                                               %目标车辆姿态 
20 [dets,numValidDets]=visionSensor(poses,scenario.SimulationTime);             %视觉传感器识别 
21 for i=1:numValidDets                                                         %有效识别数循环 
22        XY=dets{i}.Measurement(1:2);                                          %测量值 
23        detXY=sprintf('位置%d:X=%.2f m,Y=%.2f m',i,XY);                       %设置位置 
24        disp(detXY)                                                           %显示识别位置 
25 end                                                                          %循环结束 

输出结果如图2-24所示。

图2-24 视觉传感器识别

识别距离为

车辆位置1:X=18.93 m,Y=2.75 m

车辆位置2:X=29.53 m,Y=-0.02 m

【例2-4】利用视觉检测器模块对驾驶场景中的车辆进行识别。

解:在MATLAB编辑器窗口输入以下命令。


drivingScenarioDesigner('EgoVehicleGoesStraight_VehicleFromLeftGoesStraight.mat') 

输出结果如图2-25所示。该驾驶场景表示主车辆自南向北行驶,直行穿过十字路口,包含一个视觉传感器;另一辆车辆在十字路口的左侧车道驶来,直行穿过十字路口。

图2-25 含有视觉传感器的驾驶场景

在应用程序工具栏上,选择“Export”→“Export Simulink Model”选项,生成驾驶场景和视觉传感器的Simulink模型,如图2-26所示。

图2-26 驾驶场景和视觉传感器的Simulink模型

单击“BIRD'S-EYE Scope”选项,打开鸟瞰图,单击“Find Signals”选项后单击“Run”按钮,车辆开始运动并进行识别,如图2-27所示,识别结果存储在MATLAB的工作区。

图2-27 视觉传感器的识别

驾驶场景中的车辆和视觉传感器的识别可以根据需要进行设置。