2013-07-31 57 views
0

我用魚眼攝像頭的工作,需要之前的任何進一步的計算中的扭轉變形, 在這個問題上發生這種情況Correcting fisheye distortion反向魚眼失真

src = cv.LoadImage(src) 
dst = cv.CreateImage(cv.GetSize(src), src.depth, src.nChannels) 
mapx = cv.CreateImage(cv.GetSize(src), cv.IPL_DEPTH_32F, 1) 
mapy = cv.CreateImage(cv.GetSize(src), cv.IPL_DEPTH_32F, 1) 
cv.InitUndistortMap(intrinsics, dist_coeffs, mapx, mapy) 
cv.Remap(src, dst, mapx, mapy, cv.CV_INTER_LINEAR + cv.CV_WARP_FILL_OUTLIERS, cv.ScalarAll(0)) 

這樣做的問題是,這重映射功能通過所有點並創建一個新的圖像。這在每一幀都很耗時。 我所尋找的方式是在魚眼圖片上進行點到點的平移以獲得正常的圖片座標。

我們所採用的方法是對輸入框架進行所有計算,並將結果座標轉換爲世界座標,因此我們不希望瀏覽圖片的所有點並創建一個新的圖片的。 (時間對我們來說非常重要)

在矩陣mapx和mapy中有一些點對點的翻譯,但很多點沒有完整的翻譯。 我試圖插入這個矩陣,但結果不是我正在尋找的。

任何幫助將非常讚賞,甚至比cv.Remap更具時間效率的其他方法。

感謝

+0

從問題中不清楚您是要保持圖像不失真還是僅僅是一組離散圖像位置(可能不是整數,即具有亞像素精度)。如果後者是預期的數量比圖像區域小得多?請澄清。 –

+0

@FrancescoCallari是的,你是對的我只是想要少量的點數,基本上我想拿起輪廓會找到他們的中心點,並且會希望這個把這個變成未扭曲的位置,然後鳥眼位置 – Khashayar

回答

3

我想你想要的是cv.UndistortPoints()。你已經在你的扭曲圖像中檢測到一些點要素distorted

假設,你應該能夠做這樣的事情:

cv.UndistortPoints(distorted, undistorted, intrinsics, dist_coeffs) 

這將允許您無需生成一個新的,失真的圖像與畸變的點工作爲每個幀。

+0

非常感謝,我看着它。所以基本上爲了找到相機矩陣和dist_coeffs我必須做棋盤戲法?我們正在做類似的事情,以便從輸入中獲得鳥瞰圖!這是同一個過程嗎? – Khashayar

+0

@Khashayar如何讓你的相機和失真參數取決於你。用棋盤校準是獲取它們的一種方法。既然你發佈了使用它們的代碼,我認爲你已經有了這些數據。 – Aurelius

+0

很整齊。謝謝你。 –