簡體   English   中英

Emgu(OpenCV for C#) - 使用cvStereoRectify構建視差圖

[英]Emgu (OpenCV for C#) - building a disparity map using cvStereoRectify

我一直在使用用於OpenCV的偉大的Emgu C#包裝器來收集家用立體聲裝備的圖像。 兩個網絡攝像頭用螺栓固定在一塊35厘米的木頭上,希望能讓我在10-20米范圍內制作深度圖。 我將它們設置為盡可能平行(三角測試大約89.3度)。

我正在嘗試從這些中制作視差圖,盡管該過程作為代碼起作用,但結果非常隨機。 我的意思是每當我嘗試運行立體聲整流時,我會得到非常不同的結果,而且圖像經常如此嚴重扭曲,屏幕上幾乎看不到任何東西。

據我了解,這樣做的方法如下:


1)打印棋盤圖案(例如6個8個內角) - 粘在平坦的東西上。

2)從相機1拍攝一組約10張照片,在全景但不同的位置拿着棋盤。

3)使用CameraCalibration.FindChessboardCorners查找內角(6乘8)

4)使用img.FindCornerSubPix()將這些角位置細化到子像素級別

5)使用CameraCalibration.CalibrateCamera()計算內在的攝像頭細節,並將其保存為XML文件

6)對相機2重復上述步驟。

7)現在您有內部攝像機失真信息,您可以拍攝立體照片對,並使用CameraCalibration.StereoCalibrate()和先前計算的內在數據來計算外部信息(攝像機1和2之間的偏移和旋轉)。

8)使用CvInvoke.cvStereoRectify()和CvInvoke.cvInitUndistortRectifyMap()然后使用CvInvoke.cvRemap()來構建一個輸出圖像,該圖像應該在Y中排成一行,這樣您就可以運行其中一個立體對應測試。

我發現你需要使用Emgu 2.1 ver 806來使cvStereoRectify工作而不會出現訪問沖突錯誤。


我想我的問題是:

A)我的流程是否正確? 我一直在做相機固有校准作為一個單獨的過程,因為相機相距35厘米,因為它們在辦公室中並且兩者都移動很多而不容易從棋盤上取下棋盤...因為它很快離開了其中一個相機視圖。 我認為由於值是固有的,因此它們與相機有關,因此應轉移到立體聲程序OK。 這個對嗎?

看起來內部值在cvStereoRectify過程中會發生變化,並且變得非常不同。

例如。 cvStereoRectify后,第一階段的失真值= 0.22,-1.2,0.01,-0.01,2.6,值變為= 10,-489,-0.03,-0.09,13208

我不是專家,但第一套看起來更像是我從其他人的評論中看到的,第二套似乎很明顯!

B)有沒有辦法阻止在cvStereoRectify期間更新內在+失真值?

C)這似乎是正確的內在價值(937,0,290,0,932,249,0,0,1)?

非常感謝任何提示...我已經堅持了一段時間了......而且我真的不確定這個過程的哪個部分會引發錯誤。 任何提示或建議都將非常受歡迎......

我在幾年內沒有使用過EMGU,但是我用它來校准相機和Kinect。

我發現如果矩形是完全水平的,那么矩形角的排序可能會有些混亂 - 我從來沒有真正理解為什么,這似乎對我有用。 嘗試設置電路板,使矩形處於45度的卷(即從正面看,你會看到更多的鑽石形狀,如果這有任何意義)。

我的基本理解是,這應該使兩個攝像機都能輕松確保它們選擇與第一個角相同的角來開始計數。

我不能保證這會解決你的問題 - 可能只是因為我的代碼中存在嚴重錯誤,這就是為什么當棋盤平坦時它無法產生常規結果的原因。 再說一遍,它不會花費你很長時間來測試,可能只是工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM