鳥瞰圖-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》

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