標(biāo)定實(shí)戰(zhàn):從procamcalib原理到高精度三維重建)
簡(jiǎn)介ProCamCalib 是一款面向計(jì)算機(jī)視覺(jué)研究者與開(kāi)發(fā)者、用于投影儀-相機(jī)系統(tǒng)幾何與顏色校準(zhǔn)的 Java 工具。它支持多相機(jī)與投影儀配置并可在零投影儀模式下對(duì)純相機(jī)陣列進(jìn)行標(biāo)定適用于科研實(shí)驗(yàn)、投影交互、三維重建等場(chǎng)景。壓縮包為 zip 格式共 24 個(gè)文件約 52KB主要包含 Java 源碼、可執(zhí)行 cmd 腳本、Maven 配置 pom.xml、說(shuō)明文檔 README/CHANGELOG以及用于界面展示的 png/gif 圖片和窗體布局 form 文件便于用戶(hù)直接閱讀或二次開(kāi)發(fā)。資源已提供 Linux、Mac OS X、Windows 的構(gòu)建版本只需預(yù)裝 Java 環(huán)境即可快速上手。目前已有 430 人學(xué)習(xí)下載適合具備 Java 基礎(chǔ)、希望參考完整標(biāo)定流程或擴(kuò)展多投影儀系統(tǒng)的中高級(jí)開(kāi)發(fā)者能夠從中獲得清晰的代碼結(jié)構(gòu)、跨平臺(tái)構(gòu)建腳本和投影儀-相機(jī)標(biāo)定的實(shí)現(xiàn)思路。 做投影儀-相機(jī)標(biāo)定這個(gè)方向的工程師應(yīng)該都被同一件事折磨過(guò)相機(jī)拍到的畫(huà)面明明很清楚投影儀投出來(lái)的圖案也正常但兩者一疊加就各種“對(duì)不上”三維重建出來(lái)的點(diǎn)云歪歪扭扭或者投影增強(qiáng)效果偏移得離譜。這個(gè)問(wèn)題的根源就是投影儀和相機(jī)之間的幾何關(guān)系沒(méi)有標(biāo)定好。我這些年從單目相機(jī)標(biāo)定一路做到結(jié)構(gòu)光系統(tǒng)踩了不少坑最后整理下來(lái)發(fā)現(xiàn)一套好用的procamcalib方案能幫你省掉至少一半的調(diào)試時(shí)間。今天這篇就圍繞“校準(zhǔn)相機(jī)和投影儀-相機(jī)系統(tǒng)的用戶(hù)友好方法”這個(gè)主題把整個(gè)標(biāo)定流程、核心原理、以及我在實(shí)際項(xiàng)目里反復(fù)踩過(guò)的坑一次性講清楚。不管你是做3D掃描、AR投影還是工業(yè)視覺(jué)檢測(cè)這篇文章都值得花五分鐘看完。1. 為什么投影儀-相機(jī)系統(tǒng)需要一套專(zhuān)門(mén)的標(biāo)定方法1.1 系統(tǒng)的最小配置與基本工作方式先把“投影儀-相機(jī)系統(tǒng)”拆開(kāi)看。它本質(zhì)上是一套由兩個(gè)成像單元組成的傳感器系統(tǒng)一臺(tái)普通工業(yè)相機(jī)負(fù)責(zé)拍攝一臺(tái)投影儀負(fù)責(zé)往場(chǎng)景里投射圖案。比較常見(jiàn)的結(jié)構(gòu)是相機(jī)和投影儀固定在一個(gè)剛性支架上兩者之間有固定的相對(duì)位置關(guān)系然后通過(guò)投影儀投出結(jié)構(gòu)光圖案相機(jī)捕捉被物體表面調(diào)制后的圖案用三角測(cè)量原理還原出物體的三維坐標(biāo)。這套結(jié)構(gòu)聽(tīng)起來(lái)和雙目相機(jī)很像但有個(gè)關(guān)鍵區(qū)別雙目相機(jī)是兩個(gè)“接收端”做視差匹配而投影儀-相機(jī)系統(tǒng)是“一個(gè)發(fā)射端、一個(gè)接收端”。投影儀雖然不是相機(jī)但在數(shù)學(xué)建模時(shí)完全可以把它當(dāng)成一臺(tái)“逆向工作的相機(jī)”來(lái)處理它內(nèi)部也有一個(gè)光學(xué)投影中心也有畸變也有焦距和主點(diǎn)。這就是procamcalib這類(lèi)工具的核心邏輯——把投影儀當(dāng)作一個(gè)虛擬相機(jī)然后去解算它和真實(shí)相機(jī)之間的外參。1.2 為什么不能靠“目測(cè)對(duì)齊”解決問(wèn)題我在早期項(xiàng)目里試過(guò)最笨的辦法投影一個(gè)十字網(wǎng)格人工微調(diào)投影儀的擺放讓網(wǎng)格和打印出來(lái)的參照物對(duì)齊。這個(gè)方法在小范圍、平面場(chǎng)景下勉強(qiáng)能用但一旦物體表面有深度變化稍微換個(gè)角度誤差立刻爆炸。原因很簡(jiǎn)單——人眼對(duì)齊只能保證某個(gè)特定距離下的二維重合無(wú)法補(bǔ)償兩個(gè)光學(xué)中心之間的視差也無(wú)法處理投影儀鏡頭畸變。真正的標(biāo)定要做的是三件事第一解出相機(jī)的內(nèi)參矩陣和畸變系數(shù)第二解出投影儀的虛擬內(nèi)參和畸變第三解出相機(jī)坐標(biāo)系到投影儀坐標(biāo)系的旋轉(zhuǎn)矩陣和平移向量。有了這三組參數(shù)系統(tǒng)才能在任何距離下對(duì)空間點(diǎn)做準(zhǔn)確的重投影和三角化。這正是procamcalib這類(lèi)工具存在的意義把這三步打包成一個(gè)盡量自動(dòng)化的流程讓使用者不用去手推一大堆矩陣。2. procamcalib的整體設(shè)計(jì)與核心技術(shù)思路2.1 把投影儀當(dāng)作“逆向相機(jī)”來(lái)標(biāo)定procamcalib的核心思想可以用一句話(huà)概括投影儀就是一臺(tái)倒著用的相機(jī)。相機(jī)的成像模型是“世界坐標(biāo) - 相機(jī)坐標(biāo) - 像素坐標(biāo)”投影儀剛好反過(guò)來(lái)——“像素坐標(biāo) - 投影儀坐標(biāo) - 世界坐標(biāo)”。既然數(shù)學(xué)模型是對(duì)偶的那相機(jī)標(biāo)定的那套經(jīng)典框架就都能搬過(guò)來(lái)用只需要解決一個(gè)變量相機(jī)可以從標(biāo)定板上直接讀取角點(diǎn)坐標(biāo)但投影儀沒(méi)有傳感器它“看到”的角點(diǎn)坐標(biāo)從哪里來(lái)答案是結(jié)構(gòu)光編碼。我們往投影儀里輸入已知的格雷碼或相移條紋圖案投影到標(biāo)定板上相機(jī)拍下這些圖案后解碼就能算出投影儀投射出來(lái)的每一個(gè)像素點(diǎn)在相機(jī)圖像里落在哪個(gè)位置。這個(gè)位置信息配合標(biāo)定板的已知尺寸就能反推出投影儀“觀測(cè)”到的標(biāo)定板角點(diǎn)坐標(biāo)。這也是我在實(shí)操中最推崇的標(biāo)定方式遠(yuǎn)比手工點(diǎn)擊投影點(diǎn)可靠重復(fù)精度能穩(wěn)定在亞像素級(jí)別。2.2 “用戶(hù)友好”體現(xiàn)在哪里我見(jiàn)過(guò)不少標(biāo)定工具功能很強(qiáng)大但光環(huán)境配置就能勸退一半用戶(hù)。procamcalib這類(lèi)方案在“用戶(hù)友好”上下了不少功夫主要體現(xiàn)在幾個(gè)地方。第一最少硬件假設(shè)普通的USB相機(jī)加一臺(tái)商用投影儀就能跑不挑品牌不需要同步觸發(fā)線只要相機(jī)幀率和投影儀刷新率能軟件對(duì)齊就行。第二標(biāo)定板寬容度高不強(qiáng)制要求高精度玻璃板普通打印的棋盤(pán)格貼在平面板上也能出不錯(cuò)的效果。第三操作流程盡量線性化從采集圖像到求解參數(shù)每一步都有明確提示不像某些開(kāi)源代碼需要自己拼裝十幾個(gè)腳本。當(dāng)然我也得說(shuō)句公道話(huà)用戶(hù)友好不等于“隨便弄弄就能精確”標(biāo)定質(zhì)量仍然取決于采集數(shù)據(jù)的質(zhì)量和操作者的基本認(rèn)知。后面我會(huì)詳細(xì)講哪些細(xì)節(jié)決定精度上限。3. 完整實(shí)操?gòu)牧汩_(kāi)始標(biāo)定一套投影儀-相機(jī)系統(tǒng)3.1 硬件準(zhǔn)備與基礎(chǔ)擺放要求先說(shuō)硬件。我建議相機(jī)選用帶手動(dòng)模式、可以固定曝光時(shí)間的工業(yè)相機(jī)如果手里只有普通消費(fèi)級(jí)相機(jī)記得把自動(dòng)增益、自動(dòng)白平衡全部關(guān)掉。投影儀沒(méi)有太多硬性要求商用DLP投影儀就夠了但要注意固定不要用手拿著整個(gè)采集過(guò)程中投影儀和相機(jī)的相對(duì)位置必須紋絲不動(dòng)。擺放距離上有個(gè)經(jīng)驗(yàn)值推薦投影儀和相機(jī)之間的距離基線建議控制在投影距離的十分之一左右太近會(huì)導(dǎo)致深度解析度下降太遠(yuǎn)則容易出現(xiàn)互相遮擋的問(wèn)題。實(shí)際項(xiàng)目里我習(xí)慣將兩者都對(duì)準(zhǔn)標(biāo)定板所在的中軸線附近讓投影畫(huà)面的中心和相機(jī)畫(huà)面的中心大致重合這樣采集的圖案利用率最高畸變也最均勻。3.2 標(biāo)定板尺寸與圖案選擇建議標(biāo)定板是整個(gè)標(biāo)定流程里的“尺子”它的尺寸直接決定了系統(tǒng)能標(biāo)定的深度范圍。我的經(jīng)驗(yàn)是棋盤(pán)格或其他標(biāo)記圖案的物理尺寸不要太小保證在投影儀投射的圖像里每個(gè)格子至少占到8到10個(gè)投影像素寬。否則解碼時(shí)容易出現(xiàn)格子間串?dāng)_。圖案類(lèi)型上我推薦圓點(diǎn)陣列原因有兩點(diǎn)。第一圓點(diǎn)中心檢測(cè)精度高圓心擬合甚至能做到1/20像素級(jí)別而棋盤(pán)格角點(diǎn)檢測(cè)通常受圖像模糊影響更大。第二圓點(diǎn)標(biāo)注有穩(wěn)定的排序算法不會(huì)出現(xiàn)棋盤(pán)格旋轉(zhuǎn)后“角落位置識(shí)別錯(cuò)亂”的問(wèn)題。如果手里只有棋盤(pán)格打印板問(wèn)題也不大但注意要讓每個(gè)角點(diǎn)附近盡量干凈別讓投影圖案和棋盤(pán)格紋理產(chǎn)生摩爾紋干涉。3.3 逐步梳理從采集到參數(shù)求解的完整流程我用procamcalib跑一次完整標(biāo)定的操作序列在這里記錄下來(lái)方便讀者對(duì)照著做。第一步放置標(biāo)定板。把標(biāo)定板擺進(jìn)相機(jī)和投影儀都能清晰覆蓋的公共視野區(qū)域姿態(tài)上要有明顯的傾斜角度不要正對(duì)相機(jī)這是為了在單次采集中同時(shí)獲得不同深度的信息。第二步投影純白圖案拍攝一張用于相機(jī)標(biāo)定分析的圖像同時(shí)可以在這里檢查曝光時(shí)間是否合適——圖像高光區(qū)域不能過(guò)曝暗部的棋盤(pán)紋理也要能分辨出來(lái)。第三步投影結(jié)構(gòu)光序列。這個(gè)環(huán)節(jié)通常需要幾十到上百幀的投影圖案procamcalib會(huì)根據(jù)程序設(shè)定自動(dòng)切換格雷碼和相移圖案相機(jī)同步逐幀拍攝。第四步變換標(biāo)定板姿態(tài)。至少采集10組以上不同位置的標(biāo)定板數(shù)據(jù)姿態(tài)變化要盡量覆蓋視野的各個(gè)區(qū)域不要只集中在畫(huà)面中央。第五步運(yùn)行標(biāo)定求解讀取重投影誤差報(bào)告決定是否需要增補(bǔ)數(shù)據(jù)。從操作上看真正出力的環(huán)節(jié)是第三步因?yàn)樗鼪Q定了投影儀虛擬相機(jī)內(nèi)參的質(zhì)量。手動(dòng)投點(diǎn)這種老辦法我不是沒(méi)用過(guò)但在復(fù)雜姿態(tài)下既容易點(diǎn)錯(cuò)又費(fèi)時(shí)間結(jié)構(gòu)光方案在這套流程里真的算得上省心又可靠。3.4 關(guān)鍵參數(shù)解讀什么是好的標(biāo)定結(jié)果標(biāo)定跑完后procamcalib等工具通常會(huì)輸出兩個(gè)重要指標(biāo)相機(jī)重投影誤差和投影儀虛擬相機(jī)重投影誤差單位一般是像素。這兩個(gè)數(shù)值越低說(shuō)明參數(shù)越貼近真實(shí)光學(xué)系統(tǒng)。我的判定經(jīng)驗(yàn)如下指標(biāo)優(yōu)秀可用需要重新標(biāo)定相機(jī)重投影誤差 0.1 px0.1 - 0.3 px 0.3 px投影儀重投影誤差 0.2 px0.2 - 0.5 px 0.5 px需要注意的是投影儀重投影誤差通常會(huì)比相機(jī)偏大這是因?yàn)橥队皟x的像素網(wǎng)格較大且鏡頭畸變?cè)谀承┥逃猛队皟x上非??鋸堖吔翘幍幕兩踔潦菕佄锞€級(jí)別的。還有一點(diǎn)值得留意很多用戶(hù)在標(biāo)定時(shí)只看總誤差忽略了誤差的空間分布。我見(jiàn)過(guò)一種情況總誤差只有0.15像素但誤差幾乎全部集中在畫(huà)面的右下角說(shuō)明那個(gè)區(qū)域的采集數(shù)據(jù)太少實(shí)際使用時(shí)那個(gè)區(qū)域的3D重建精度會(huì)很差。我的建議是看誤差分布圖然后針對(duì)誤差偏大的區(qū)域補(bǔ)拍相應(yīng)姿態(tài)的標(biāo)定板。4. 實(shí)操中的常見(jiàn)問(wèn)題與排查技巧4.1 問(wèn)題速查標(biāo)定失敗或精度不佳的原因我把自己實(shí)踐過(guò)、以及幫同行排查過(guò)的問(wèn)題整理成了一張速查表方便大家對(duì)照?,F(xiàn)象可能的原因排查方向標(biāo)定板角點(diǎn)檢測(cè)頻繁失敗曝光過(guò)度或標(biāo)定板反光降低曝光換啞光板面投影儀重投影誤差持續(xù)過(guò)大投影序列同步錯(cuò)位檢查相機(jī)是否真的拍到了每一幀完整條紋系統(tǒng)標(biāo)定完成后深度重建仍有明顯彎曲畸變系數(shù)沒(méi)有收斂標(biāo)定板姿態(tài)覆蓋不夠增加傾斜姿態(tài)避免只測(cè)平面相機(jī)出現(xiàn)部分過(guò)曝但整體偏暗動(dòng)態(tài)范圍不足考慮分區(qū)曝光或改用HDR模式采集移動(dòng)標(biāo)定板時(shí)邊緣出現(xiàn)拖影快門(mén)速度過(guò)低提高快門(mén)速度或使用更亮的投影儀前期標(biāo)定準(zhǔn)確隔天精度下降支架松動(dòng)或溫度變化導(dǎo)致光機(jī)變形檢查機(jī)械固定標(biāo)定后避免調(diào)節(jié)對(duì)焦環(huán)其中最常見(jiàn)的還是曝光和同步問(wèn)題。投影儀和相機(jī)的采集如果處于異步狀態(tài)在采集序列時(shí)很容易出現(xiàn)“條紋已經(jīng)切換了但相機(jī)拍到的是上一幀”的情況這種數(shù)據(jù)混入標(biāo)定序列會(huì)直接拉高誤差。很多新接觸這套系統(tǒng)的朋友會(huì)忽略這一點(diǎn)我建議用程序強(qiáng)制等待每次切換投影圖案后留足曝光時(shí)間再觸發(fā)相機(jī)采集寧可速度慢一點(diǎn)也不要拿一個(gè)不穩(wěn)定的數(shù)據(jù)集去跑標(biāo)定。4.2 兩個(gè)容易被忽略的細(xì)節(jié)坑第一個(gè)坑是鏡頭變焦環(huán)。某些工業(yè)鏡頭的變焦和調(diào)焦環(huán)在鎖緊后受熱或者震動(dòng)仍然可能出現(xiàn)微小位移。這種變化在普通圖片上肉眼完全看不出來(lái)但標(biāo)定參數(shù)對(duì)光學(xué)中心極其敏感哪怕只有0.1毫米的軸向位移都會(huì)帶來(lái)可感知的深度偏移。所以我在多年實(shí)踐中養(yǎng)成了一個(gè)習(xí)慣標(biāo)定完成后用膠帶把所有鏡頭調(diào)節(jié)環(huán)固定住并且每次標(biāo)定之前都先拍一張純白圖案和之前的對(duì)比一下亮度分布如果中心光斑位置出現(xiàn)明顯偏移說(shuō)明光路已經(jīng)變了這時(shí)候必須重新標(biāo)定。第二個(gè)坑是投影儀自動(dòng)梯形校正。很多商用投影儀默認(rèn)開(kāi)了梯形校正或者有自動(dòng)水平垂平功能出廠狀態(tài)下會(huì)自動(dòng)修正投影畫(huà)面形狀。但這個(gè)修正會(huì)影響投影矩陣的映射關(guān)系讓投影儀“虛擬相機(jī)”的內(nèi)參變得不穩(wěn)定。說(shuō)得直白一點(diǎn)同一臺(tái)投影儀如果兩次標(biāo)定之間系統(tǒng)偷偷自動(dòng)校正過(guò)那兩次標(biāo)定出來(lái)的內(nèi)參就有很大的可能對(duì)不上。解決辦法非常簡(jiǎn)單在投影儀設(shè)置里關(guān)閉一切自動(dòng)校正功能讓投影光路完全是原始光學(xué)狀態(tài)。這個(gè)細(xì)節(jié)我在多個(gè)項(xiàng)目里反復(fù)提起因?yàn)樗毁M(fèi)任何成本卻能避開(kāi)一個(gè)極隱蔽的變量。4.3 結(jié)構(gòu)光編解碼時(shí)的經(jīng)驗(yàn)補(bǔ)充既然procamcalib這種方法會(huì)用到格雷碼和相移條紋我在這個(gè)環(huán)節(jié)也補(bǔ)充一點(diǎn)經(jīng)驗(yàn)。格雷碼序列負(fù)責(zé)的是“分區(qū)域標(biāo)記”——把投影儀像素空間切分成一個(gè)個(gè)可區(qū)分的小塊相移條紋負(fù)責(zé)的是“亞像素定位”——在格雷碼劃分的每個(gè)小塊內(nèi)進(jìn)一步精確到小數(shù)級(jí)別的相位。兩者配合才能把投影儀虛擬像素坐標(biāo)解到亞像素精度。實(shí)際操作中相移條紋的步數(shù)建議選三步或四步相移步數(shù)太少會(huì)引入相位誤差太多則采集時(shí)間成倍增加性?xún)r(jià)比不高。另外相位解包裹后要格外檢查是否有“跳相位”現(xiàn)象——如果物體表面有高反光區(qū)域相機(jī)拍到的條紋對(duì)比度會(huì)顯著下降導(dǎo)致解碼出錯(cuò)。常見(jiàn)的應(yīng)對(duì)方式是采集多檔曝光然后融合或者鋪一層啞光涂層降低鏡面反射。在工業(yè)現(xiàn)場(chǎng)如果來(lái)不及做這些處理可以先把高反光區(qū)域用圖像掩碼排除標(biāo)定階段我們盡量選干凈的區(qū)域即可。5. 標(biāo)定完成之后這套系統(tǒng)的延伸應(yīng)用范圍參數(shù)標(biāo)定完成后投影儀和相機(jī)之間就有了精確的幾何關(guān)系這個(gè)坐標(biāo)系可以再利用到很多方向。我做過(guò)的實(shí)際項(xiàng)目里比較典型的包括基于單幀條紋的物體三維重建、投影映射中的精確對(duì)齊、以及機(jī)器人手眼標(biāo)定中的空間定位輔助。以三維重建為例標(biāo)定結(jié)果可以直接用于三角測(cè)量相機(jī)圖像上的某個(gè)點(diǎn)對(duì)應(yīng)投影儀某一像素的投影線這條投影線與相機(jī)光心發(fā)出的射線在空間中的交點(diǎn)就是物體表面的三維坐標(biāo)。整個(gè)過(guò)程本質(zhì)上是兩條空間直線的求交問(wèn)題寫(xiě)代碼實(shí)現(xiàn)并不難但精度上的瓶頸幾乎全部來(lái)自標(biāo)定參數(shù)的準(zhǔn)確性。這也解釋了為什么我一直強(qiáng)調(diào)重復(fù)標(biāo)定和誤差監(jiān)測(cè)——一個(gè)標(biāo)定完成后就長(zhǎng)期不校驗(yàn)的系統(tǒng)在實(shí)際工作環(huán)境中是不可靠的。另外有人問(wèn)過(guò)我這套方法能不能用于純相機(jī)系統(tǒng)或者純投影儀系統(tǒng)。答案是可以的。比如只有一臺(tái)相機(jī)外加一臺(tái)工業(yè)投影儀做結(jié)構(gòu)光檢測(cè)完全可以用procamcalib架構(gòu)標(biāo)定到“相機(jī)-投影儀剛體”的精度反過(guò)來(lái)如果用兩臺(tái)相機(jī)也完全可以退化成雙目立體視覺(jué)標(biāo)定來(lái)使用。底層數(shù)學(xué)框架相通靈活取用即可。最后再分享一點(diǎn)個(gè)人的操作習(xí)慣我每次做完一組標(biāo)定都會(huì)在相同場(chǎng)景下放一個(gè)已知尺寸的量塊或者標(biāo)準(zhǔn)球用標(biāo)定的參數(shù)重建一次并測(cè)量尺寸把實(shí)測(cè)值和真值之間的偏差記錄在案。這個(gè)額外步驟只要幾分鐘但它能在第一時(shí)間暴露標(biāo)定中的系統(tǒng)性問(wèn)題比如投影儀虛擬內(nèi)參有沒(méi)有收斂、外部參數(shù)有沒(méi)有出現(xiàn)局部最優(yōu)解。在正式項(xiàng)目里這個(gè)小習(xí)慣幫我避掉了至少三次返工。標(biāo)定這件事工具再好用最后也得靠實(shí)際驗(yàn)證說(shuō)話(huà)。本文還有配套的精品資源點(diǎn)擊獲取