2012-01-27 82 views
9

我有一個網格,比如11 x 11個頂點。這個想法是,每個點(頂點)都保存了扭曲圖像中該像素的歸一化浮點位置。例如。如果我想拉伸左上邊緣,我寫在第一個頂點(-0.1,-0.1)。如何使用cv :: remap與前向網格,而不是反向網格,以扭曲圖像?

我有網格,但沒有圖像變形功能。 cv::remap的確如此......但按相反順序 - 網格「說」哪個像素鄰域映射到輸出上的規則網格。

在OpenCV中有沒有一種標準的方法來處理反向翹曲?我可以輕鬆轉換網格或使用其他功能嗎?我正在使用OpenCV和Boost,但是任何免費的庫/工具都可以爲我工作。 PS:我需要在Linux PC上運行這個程序。

+0

我解決了我的問題。這個問題非常緊急,所以我在辦公室裏捅了一圈,直到找到解決方案(專有的一個,唉)。 但是,我仍然非常困惑,爲什麼這樣一個問題(通過前向網格圖像變形)沒有以開放,自由和可訪問的方式解決。 – Vorac 2012-01-30 13:04:23

+0

您能否提供一些細節,您是如何解決問題的? – Marcin 2012-08-21 11:05:50

+0

@Marcin,不幸的是,EGL傢伙也許在一週內爲該設備寫了一個反向映射器(這就是我所說的'專有解決方案')。它仍令我困惑,爲什麼OpenCV中沒有包含這樣的功能。也許有一天有人會解決這個問題,並在這裏作爲回答發佈拉取請求的參考。也許我,嗯,或者你。 – Vorac 2013-07-03 14:56:41

回答

1

您需要計算反向變換的另一個映射。

但是,爲此,您需要轉換公式或矩陣。

步驟1:重新映射的圖像上選擇4個點。一個好主意是採取的角落,如果彎道不黑(未定義)

第2步:找到自己的位置在原始圖像中(看看地圖爲)

第3步:計算兩組點之間的單應性。 findHomoraphy()是關鍵。

步驟4: warpPerspective所述第二圖像。在內部,它計算網格,然後調用remap();

如果具有相同的如前面的變換,在輸出findHomography點,或INV反相輸入點()所得到的矩陣。

如果你想爲多次調用地圖(它比調用每個時間warpPerspective快),你必須從warpPerspective將代碼複製一個新的功能。

+0

嗨,你好,謝謝你的回答。我認爲這不是我正在尋找的東西,因爲它減少了自由度。我將解釋 - 網格是任意的,並且原始圖像中沒有約束直線被投影到結果中的直線上。 – Vorac 2012-01-30 13:03:20

+0

嗯,我的解決方案僅適用於由幾何關係描述的變換 - 3D變換。如果您的網格描述了魚眼鏡頭失真或類似情況,唯一的解決方案是編寫一個函數,該函數接受輸入網格,並將輸出網格創建爲反函數。 – Sam 2012-01-30 13:32:23

+0

是的,甚至更普遍 - 網格節點的位置是非常隨意的。在Opencv中發現了一種替代函數,但接受向前映射的warp在OpenGL中「很容易」實現 - 「僅」關於一週的工作。另一個提出的解決方案是編寫一個你提到的函數 - 在(非矩形)輸出網格上進行一些雙線性插值,以找到相應的輸入網格座標。 – Vorac 2012-01-31 14:33:18