我有一個照相機垂直安裝在水箱中的水下,向下看。 水箱底部有一個扁平網格(距離相機約2m)。 我希望能夠在底部放置標記,並使用計算機視覺來了解他們真實生活中的確切位置。OpenCV - 使用水中的靜態圖像校準相機
所以,我需要從像素映射到毫米。 如果我沒有弄錯,cv :: calibrateCamera(...)會這樣做,但依賴於在相機前移動一個圖案。 我只有場景的靜態圖片,並且相機不會相對於網格移動。因此,我只有一個「單一」圖像來查找參數。 如何使用網格來做到這一點?
謝謝。
我有一個照相機垂直安裝在水箱中的水下,向下看。 水箱底部有一個扁平網格(距離相機約2m)。 我希望能夠在底部放置標記,並使用計算機視覺來了解他們真實生活中的確切位置。OpenCV - 使用水中的靜態圖像校準相機
所以,我需要從像素映射到毫米。 如果我沒有弄錯,cv :: calibrateCamera(...)會這樣做,但依賴於在相機前移動一個圖案。 我只有場景的靜態圖片,並且相機不會相對於網格移動。因此,我只有一個「單一」圖像來查找參數。 如何使用網格來做到這一點?
謝謝。
要校準相機,您需要多個棋盤圖像(或其他發現的其他圖案here)。你可以做什麼,是校準相機外的水或做一次校準序列。一旦你有了這些信息(焦距,鏡頭中心,失真等)。您可以使用solvePNP函數來估計單個電路板的方向。這一估算爲您提供了從相機到電路板的距離。
一個完全不同的選擇可能是找到相機使用什麼樣的鏡頭並手動填充數據。我沒有試過這個,所以我不確定這個效果如何。
有趣的問題! 「可愛」的部分是對水玻璃界面折射的內在參數的影響,即相比於空氣中的相同透鏡增加焦距(或者相反地,減小視場)。理論上,您可以在空氣中進行校準,然後校正折射率的差異,但是直接在水中校準可能會給您更準確的結果。
是否知道您的準確度要求?並且您是否已驗證您的鏡頭/傳感器組合是否足以滿足它們(具有足夠的餘量)?要回答您需要估計的問題(通過計算鏡頭和傳感器規格,或通過實驗使用分辨率圖表),您是否可以在圖像中解析出應用程序所需的最小距離。
從你的問題的措辭我認爲你只有在一架飛機上的測量感興趣。所以你只需要:(a)消除非線性(桶形或枕形)透鏡畸變,(b)估計感興趣的平面和圖像之間的距離。一旦你有了後者,你可以直接從未失真的圖像座標轉換爲世界的矩陣乘法。此外,如果(如我所想象的那樣)感興趣的平面與圖像平面大致平行,則不應有任何問題將整個視場保持在焦點上。
當然,爲了達到預期的效果,您應該確保在您的應用的測量公差範圍內罐底非常平坦。否則,你真的在處理3D問題,並需要相應地修改你的程序。
實際操作過程很大程度上取決於水箱的大小,但您沒有清楚地指出。如果它足夠小以至於製造類似棋盤的可移動校準目標是切實可行的,那麼通過一切手段去實現它。你可能想看看this other answer的建議。在下文中,我將討論更有趣的情況,其中你的坦克很大,例如游泳池的大小。
我會繼續在校準池中粘貼校準標記。我可能會選擇類似棋子的標記,如these,也許可以用塑料上的良好激光打印機自己用膠粘劑背襯印刷(假設您可以永久保留它們)。您應該計劃採用8x8或10x10格柵,儘可能多地覆蓋相機在其操作位置和姿勢下的視野範圍。爲了幫助很好地排列網格,您可以使用具有合適扇角的激光線投影儀或連接到旋轉支架上的激光指示器。請注意,不必將它們粘貼在精確的X-Y網格中(根據池的大小,這可能很複雜),只需知道它們相對於任意選擇的(但固定的)三個位置的位置是已知的。換句話說,您可以將它們大致貼在網格的底部,然後儘可能精確地測量三個極端角點的距離,從而構建基礎三角形,然後測量所有其他角落與三角形的頂點,最後用三角幾何重建它們的真實位置。這基本上是一個測量問題,根據您的準確性要求和預算,您可能需要註冊當地友好的專業測量員(及其工具),以便根據需要精確完成測量。
一旦你有了網格,你就可以填充池,獲取你的相機,聚焦並根據應用需要快速制止鏡頭。從現在開始,你可能再也不會碰到焦點和光圈,在誤校準的情況下 - 曝光只能由曝光時間控制,所以請確保有足夠的光線。禁用任何和所有自動對焦和自動光圈功能(如果有)。如果相機有非剛性鏡頭支架(例如DLSR),則需要使用某種機械裝備以確保鏡頭體對保持剛性。在可用照明和傳感器的情況下,儘可能靠近F-stop,以便獲得一定的景深。然後拍幾張照片(約10張),移動和旋轉攝像頭,距離飛機距離飛機預期的操作距離更近一點。您需要在某些圖像中「看到」一些重要透視圖,這些透視圖需要精確校準焦距。存儲圖像時避免使用JPG和任何其他有損壓縮格式 - 使用無損PNG或TIFF。
一旦你有圖像,你可以手動標記和識別圖像中的檢查器標記。對於像這樣的一次性項目,我不會自動識別,只需手動執行(例如在Matlab中,甚至在Photoshop或Gimp中)。爲了幫助識別標記,您可以在他們旁邊打印一個數字。獲得手動標記後,您可以自動將其細化爲亞像素精度,例如,使用cv :: findCornerSubpix。
你快完成了。將實際角落的「參考」測量位置以及所有圖像中觀察到的位置提供給您最喜歡的相機校準例程,例如, CV :: calibrateCamera。您可以使用相機的標稱焦距(轉換爲像素)進行初始估計,並附帶零點失真。如果一切順利,您將獲得相機固有的參數,您將保留這些參數,並且相機在所有圖像上都會出現,您將丟棄它們。
現在,您可以按照應用程序的需要,在最終設置中安裝攝像頭,然後再拍攝一張網格圖像。像以前一樣標記並優化角落位置。使用由校準返回的失真參數來取消其圖像位置。最後計算真實標記參考位置(以米爲單位)和它們的未失真位置之間的單應性,然後完成。
HTH
謝謝您提供非常全面的答案!我很抱歉沒有提供所有相關信息。該坦克是一個游泳池的大小,事實上這麼大,我不能校準,然後填充它..這將需要幾天。你是對的,測量結果只有2D(在平坦的底部)。我無法輕鬆回去重複,所以如果我能以某種方式使用現有圖像進行校準,那將會很棒。我的底部網格幾乎覆蓋了整個視野,並且知道網格大小,我應該以某種方式修正圖像? –
是的,這是沿線第二選項,我會感謝一些幫助。我知道參數,如到目標的距離,所有方塊的像素大小,傳感器尺寸等。焦距可手動調節,我不知道當時設置的是什麼,但我可以計算出來。我希望能夠通過提供一些已知距離爲毫米的點來校準相機。然後針對這個特定的靜態環境進行校準。 –
你可以「蠻力」焦距。嘗試幾個值,看看哪些似乎給出最好的結果。 – Nallath