上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 视觉传感器的识别
驾驶场景中的车辆和视觉传感器的识别可以根据需要进行设置。