作者:禪與計算機程序設(shè)計藝術(shù)
近年來,隨著激光雷達、相機等傳感器的廣泛應用,三維重建技術(shù)逐漸成為熱門研究方向。三維重建技術(shù)可以從多種角度幫助我們理解世界,并進行精準定位、建筑物三維模型化、環(huán)境規(guī)劃、自然現(xiàn)象研究以及各種各樣的應用。 但由于三維重建技術(shù)的復雜性和多樣性,很難給出一個通用的、可行的、完整的解決方案。因此,本文將簡要介紹一下如何利用激光雷達、相機進行三維重建技術(shù)的基本流程,然后結(jié)合具體的代碼實例對這一流程進行具體地闡述。
首先,激光雷達與相機分別由哪些參數(shù)決定了三維重建結(jié)果?其次,如何通過互補信息增強三維重建結(jié)果的精確度?最后,如果沒有有效的校正或處理,三維重建結(jié)果會受到什么影響?本文將分別對以上三個問題進行回答。
2.基本概念術(shù)語說明
2.1激光雷達與相機參數(shù)
激光雷達包括兩種類型,為偶極子陣列(Active Radar)與超聲波陣列(Ultrasound)。其采集到的信號具有不同的特性,激光雷達采用矩形脈沖傳輸系統(tǒng)(Radar Antenna Pattern),超聲波陣列則采用方形波束(Square Wave Beam)。激光雷達與相機參數(shù)如下圖所示:
參數(shù)名稱 | 描述 |
---|---|
激光頻率 | 激光頻率是指激光能量的變化速度。通常按照毫米波、紅外線波、可見光波、INFRA-Red波以及可調(diào)焦段波等標準定義。 |
探測距離 | 激光雷達探測距離越遠,性能越高,但是信號不易被其他物體接收;相機也需要相同的距離才能捕捉到相同的圖像。 |
視場角 | 表示相機能夠拍攝的垂直范圍。例如,普通鏡頭的視場角約為60°,超廣角鏡頭的視場角可以達到90°。 |
分辨率 | 表示成像設(shè)備能顯示的最小單位。通常在攝影中,分辨率通常用英寸作為單位,如照相機的ISO100、ISO200、F1.8等表示不同分辨率下的曝光時間、白平衡等參數(shù)。 |
抗輻射 | 指激光雷達或者相機產(chǎn)生的輻射對被檢測目標造成的抵抗能力。常見的輻射包括紅外輻射、可見光輻射、微弱外界輻射等。 |
曝光時間 | 是指一張圖片被成像設(shè)備持續(xù)曝光的時間。一般情況下,高光學圖像由于聚焦時間長,會存在噪聲,因而分辨率越高,則可控曝光時間就越短,所以一般認為“優(yōu)先保證分辨率”。 |
快門速度 | 是指相機設(shè)備按下快門按鈕時拍攝圖像的速度,單位為秒/100英寸。通常來說,電動相機的快門速度為20秒/100英寸,靜止相機的快門速度為1/30秒/秒。 |
幅度 | 表示激光雷達或相機的最大可測量距離。對于激光雷達,其長度通常為幾毫米至幾厘米,寬度為幾毫米至幾厘米;對于相機,其所能捕捉到的最短光線長度為幾毫米至幾厘米。 |
角度 | 用于描述激光雷達或相機的掃描方向。對于激光雷達,掃描角度是指激光束在水平面上掃過的角度,通常是180度。對于相機,掃視方向一般是固定的。 |
全景角度 | 由于激光雷達或相機的視野范圍是球形或橢圓形,因此無法形成一個全局的立體效果,只能看到局部區(qū)域。全景角度就是為了得到更加細致的全局環(huán)境信息。 |
2.2三維重建相關(guān)術(shù)語
2.2.1相機坐標系
三維重建過程中,激光雷達和相機都采用三維坐標系,即以某點為原點建立局部坐標系,該局部坐標系的X軸、Y軸、Z軸分別代表該點處在圖像坐標系的什么位置,以此類推,局部坐標系到世界坐標系的轉(zhuǎn)換矩陣為R(Rotation),T(Translation)。
2.2.2激光雷達坐標系
激光雷達在三維重建過程中扮演角色,它也需要由一個坐標系來進行描述。激光雷達坐標系采用笛卡爾坐標系,它的X軸朝向前方,Y軸朝向右方,Z軸朝向上方,所有的物體都是以這個坐標系為參考的。
2.2.3相機投影矩陣
激光雷達和相機在三維重建過程中,經(jīng)歷了圖像和激光數(shù)據(jù)兩個過程。首先,激光雷達在某個時刻觀察到一組激光束,然后將這些激光束投射到相機面前形成一副圖像。之后,相機將圖像轉(zhuǎn)化為像素,并根據(jù)相機內(nèi)參計算出每一像素對應的激光束的深度值。
但在投影的過程中,由于激光束經(jīng)過障礙物、環(huán)境等因素反射后可能與真實距離差距較遠,因此,將激光束投射到像素上時,有可能會出現(xiàn)像素到激光束的映射關(guān)系。這時,就需要用到投影矩陣P,它是一個投影關(guān)系矩陣,用來將激光數(shù)據(jù)投影到像素上。
2.2.4視差映射
對于相機視野很小或者不可導導致的失焦現(xiàn)象,可以通過視差映射技術(shù)進行修復。視差映射是在原始圖像與修正后的圖像之間建立一對一映射關(guān)系的過程。當把原始圖像上某一點的像素值映射到修正后的圖像上時,映射值可以使得兩者之間的特征點匹配程度更好。
2.2.5配準問題
因為激光雷達和相機存在漂移和旋轉(zhuǎn)等偏移情況,所以三維重建過程中還需考慮配準問題。配準問題主要是指激光雷達坐標系到相機坐標系的轉(zhuǎn)換。
目前,常見的三維重建配準方法有幾何重配準法、變換重配準法、優(yōu)化重配準法。幾何重配準法主要采用閉環(huán)控制法,先估計激光雷達與相機初始位置的誤差,然后通過閉環(huán)控制法確定激光雷達與相機的正確位置及姿態(tài)。變換重配準法也屬于閉環(huán)控制法,不同之處是不需要估計初始位置的誤差,直接根據(jù)已知的激光雷達與相機運動關(guān)系、攝像機內(nèi)參、環(huán)境光流等計算相機坐標系與激光雷達坐標系的轉(zhuǎn)換關(guān)系。優(yōu)化重配準法則是一種非閉環(huán)控制法,優(yōu)化重配準法通過找尋初始位置的最小二乘解,通過迭代的方式尋找最優(yōu)解,找到最佳的激光雷達與相機的配準關(guān)系。
3.核心算法原理和具體操作步驟以及數(shù)學公式講解
3.1計算相機投影矩陣P
為了完成三維重建的第一步——投影,需要計算出相機投影矩陣P。假設(shè)激光雷達的位置坐標為s=[x s]T,激光雷達到相機的距離為d,激光雷datera人坐標系的方向向量為r=[rx ry rz]^T,則相機投影矩陣P為:
P = K [R; -Rr^T]
其中,K為相機內(nèi)參矩陣,[Rx Ry Rz]為相機坐標系在激光雷達坐標系的旋轉(zhuǎn)矩陣,[-Rr^T]為相機坐標系到激光雷達坐標系的轉(zhuǎn)換矩陣,Rr=Rr^T。
3.2從圖像中提取特征點
為了計算出三維重建的第二步——特征提取,需要從圖像中提取特征點。圖像特征提取的方法有Harris、SIFT等。這里,我們以Harris算法為例,來講解特征點的提取過程。
假設(shè)一副圖像大小為W*H,每個像素點的灰度值記作G,且每個像素點的坐標為uv=[u v]T。Harris算法的基本思路是通過計算像素梯度的二階導數(shù)來檢測角點。具體地,假設(shè)鄰域窗口為W×W,則其梯度I=[?Gx, ?Gy]=[I1 I2],圖像梯度的二階導數(shù)IxIy=[?^2Ix, ?^2Iy]=∑(?Ix)^2+(?Iy)^2。
用以下公式來計算每個像素的二階梯度幅值:
R=det((Ix)^2 (Iy)^2)-tr((Ix)(Iy))^2 / ((Ix)^2 + (Iy)^2)^2
然后,根據(jù)閾值確定每個角點的響應值,只保留響應值高于閾值的特征點,將它們納入最終的特征點集合。
3.3計算深度
假設(shè)已知若干個特征點,每個特征點有一個深度值D。那么,已知每個點的深度值,就可以得到整個圖像的三維點云。
如果已知相機投影矩陣P、圖像內(nèi)參矩陣K、相機坐標系到激光雷達坐標系的轉(zhuǎn)換矩陣R、激光雷達到相機的距離d和圖像中所有角點的位置,則可以使用深度映射法來計算每個像素的深度值。具體地,假設(shè)一副圖像的大小為W*H,每個像素的坐標為uv,則其投影坐標為p=[px py]T,則可以得到:
depth = p' * P'/d
其中,P'為投影矩陣P的逆矩陣,p'=[px']/[(px+π)^2+(py+π)^2]^{1/2}=[px' py']T。
3.4獲取三維點云
假設(shè)已知每個點的深度值,即可構(gòu)造出三維點云。
不過,因為實際環(huán)境中的真實物體往往不是完美的平面形狀,所以,三維點云通常是包含著許多不規(guī)則的結(jié)構(gòu)。為了解決這一問題,通常采用像素級的法向量法或激光法來進行修復。
3.5基于視差的三維點云修復
因為激光雷達的視野范圍較小,所以可能導致相機在某些場景下失焦或被遮擋。在這種情況下,可以通過視差映射技術(shù)恢復缺失的區(qū)域。
假設(shè)一副圖像的大小為W*H,設(shè)定兩個點的圖像坐標分別為uv1=(u1 v1)T和uv2=(u2 v2)T,則可以在uv1和uv2之間建立一對一的映射關(guān)系,即可以用兩點之間的數(shù)據(jù)作為差值。
假設(shè)兩點的位置誤差和視差誤差的相關(guān)系數(shù)為ρ,則可以通過估計出每個像素的差值:
Δθ = ρ * Δz / d
然后,通過差值差積分擬合出缺失區(qū)域的深度。文章來源:http://www.zghlxwxcb.cn/news/detail-842272.html
4.具體代碼實例和解釋說明
4.1代碼示例
這里給出使用Matlab語言進行三維重建的具體代碼示例,該示例使用一個Matlab開源項目baka-cv實現(xiàn)了基于激光雷達與相機的三維重建。該項目中提供了常見的激光雷達和相機的內(nèi)參、標定、標定誤差的評價等功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-842272.html
% 導入樣例圖像
img = imread('example.jpg');
% 加載激光雷達的內(nèi)參矩陣、激光到相機的距離d
K = [...]; % (3,3)
d =...;
% 計算相機投影矩陣P
[cx cy fx fy] = size(img);
u0 = cx/(fx+fy)/2; % 假設(shè)相機坐標系原點重合圖像中心
v0 = cy/(fx+fy)/2; % 假設(shè)相機坐標系原點重合圖像中心
[R, T] = lookat([0, 0, d], 'xz', [u0, v0]); % 以圖像中心為焦點
P = K * [R; -R'*T'];
% 計算圖像點云
points = getPointCloudFromImage(img, P, K, d, 'threshold', 1e-4);
% 可視化三維點云
view(points(:, :), 'xzy')
% 三維重建結(jié)果精度評價
errors = evaluateCalibrationErrors(K, d, points);
disp(['RANSAC Reprojection Error:', num2str(mean(errors))])
到了這里,關(guān)于計算機視覺中的三維重建:基于激光雷達與相機的方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!