鸟瞰图-BirdView及其在MATLAB中的表示与实例

1 什么是鸟瞰图

顾名思义,鸟瞰图就是从鸟的视角去俯视看到的视图,好处就在于视野宽广,对比清晰。从自动驾驶角度来看,我们更关心跟车辆在同一平面上的物体(尤其是车和人)以及物体与道路之间的关系,如果垂直俯视则可以在x、y两个维度上得到比例相同的物体轮廓,更利于展示和分析。
在这里插入图片描述
在这里插入图片描述

2 MATLAB鸟瞰图

MATLAB主要提供了两种展示鸟瞰图的类——birdsEyePlot和birdsEyeView。以下分别介绍。

2.1 birdsEyePlot

birdsEyePlot类主要是提供一个的含自车、物体(含其他车辆、人等)、车道的x、y平面的二维俯视图。

老规矩,先看下属性和函数:
在这里插入图片描述
birdsEyePlot本身的属性不多,主要是x、y方向上的范围。但是函数还是较丰富的,可以绘制和显示传感器覆盖图、传感器检测点、道路边界、道路线、对象轮廓、自车轨迹、点云以及他车轨迹等等。

举个简单的例子:

%% 创建视图
bep = birdsEyePlot('XLim',[0 90],'YLim',[-35 35]);
%% 显示复盖区域
caPlotter = coverageAreaPlotter(bep,'DisplayName','Radar coverage area');
mountPosition = [1 0];
range = 60;
orientation = 0;
fieldOfView = 35;
plotCoverageArea(caPlotter,mountPosition,range,orientation,fieldOfView);
%% 显示雷达点
radarPlotter = detectionPlotter(bep,'DisplayName','Radar detections');
plotDetection(radarPlotter,[30 -5; 50 -10; 40 7]);

运行结果:
在这里插入图片描述
另外,还提供了一个findPlotter函数可以查找对应的属性来绘制相应的图形。

2.2 birdsEyeView

birdsEyeView类主要构造产生一个一个根据相机内外参参数和视图范围的view,配合 transformImage 函数可以将相机拍摄的图片转换为俯视图。

相机拍摄的照片如下图所示:
在这里插入图片描述
代码如下:

I = imread('road.png');
figure
imshow(I)
title('Original Image')

而我们希望看到的图像如下:
在这里插入图片描述
这就需要经过birdsEyeView和transformImage 处理。代码如下:

%% Transform Road Image to Bird's-Eye-View Image
% 1. 创建monoCamera
focalLength = [309.4362 344.2161];
principalPoint = [318.9034 257.5352];
imageSize = [480 640];
camIntrinsics = cameraIntrinsics(focalLength,principalPoint,imageSize);
height = 2.1798;
pitch = 14;
sensor = monoCamera(camIntrinsics,height,'Pitch',pitch);

% 2. 创建birdsEyeView
distAhead = 30;
spaceToOneSide = 6;
bottomOffset = 3;
outView = [bottomOffset,distAhead,-spaceToOneSide,spaceToOneSide];
outImageSize = [NaN,250];
birdsEye = birdsEyeView(sensor,outView,outImageSize);

% 3. 通过birdsEyeView将图像I用函数transformImage转化为俯视图
BEV = transformImage(birdsEye,I);
figure
imshow(BEV)
title('Bird''s-Eye-View Image: vehicleToImage')

可以看出,分为三个步骤:

  • 创建monoCamera
  • 创建birdsEyeView
  • 通过birdsEyeView将图像I用函数transformImage转化为俯视图

创建monoCamera这步已经在博文《相机内参座标系及其在MATLAB 中的表示》中已经作过详解,简单来说就是设置好内外参数矩阵后构造单目相机对象。

创建birdsEyeView过程其实也比较简单,主要选定BirdView的范围,代码中是自车前方3米到30米距离,左右各6米;需要注意的是设置transformImage函数的输出图像时只要指定x、y方向一个像素长度,根据BirdView及其中也给的长度就可以反算出另一个的像素长度。

另外,实际还可以在转换后的图上增加关注的点,例如,插入实际座标系中车子正前方10m处的点:
在这里插入图片描述
代码如下:

%%
imagePoint = vehicleToImage(birdsEye,[10 0]);
annotatedBEV = insertMarker(BEV,imagePoint);
annotatedBEV = insertText(annotatedBEV,imagePoint + 5,'10 meters');

figure
imshow(annotatedBEV)
title('Bird''s-Eye-View Image: vehicleToImage')

或者,也可以指定像素座标系下的点,反算出实际距离,并在Birdview中显示,例如,指定像素座标系下的点为:(150, 300),将其转换到相机座标系并转换为BirdView,显示x=15.59,y=-1.18:
在这里插入图片描述
代码如下:

imagePoint2 = [150 300];
annotatedBEV = insertMarker(BEV,imagePoint2);

vehiclePoint = imageToVehicle(birdsEye,imagePoint2);
xAhead = vehiclePoint(1);
yAhead = vehiclePoint(2);
displayTextX = sprintf('x=%.2f meters',xAhead);
displayTextY = sprintf('y=%.2f meters',yAhead);
annotatedBEV = insertText(annotatedBEV,imagePoint2 + 5,displayTextX);
annotatedBEV = insertText(annotatedBEV,[imagePoint2(1)+5, imagePoint2(2)+25],displayTextY);

figure
imshow(annotatedBEV)
title('Bird''s-Eye-View Image: imageToVehicle')

另外,还需要注意的是,实际图像中并不是所有区域都是在一个平面中,因此选定范围的时候必须选择可见范围内代表道路范围内的图像,否则会生成的图像会有重叠现象。
例如,将

distAhead = 30;
spaceToOneSide = 6;
bottomOffset = 3;

改为

distAhead = 100;
spaceToOneSide = 15;
bottomOffset = 3;

得到的转换后的BirdView图像如下:
在这里插入图片描述

3 参考

MATLAB官网:《birdsEyePlot》
MATLAB官网:《birdsEyeView》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章