2013-05-31 187 views
5

我是新的Open Cv,我想轉換兩個圖像src和dst圖像。我使用cv::estimateRigidTransform()來計算轉換矩陣,然後使用cv::warpAffine()將dst轉換爲src。當我比較新的變換圖像和src圖像時,它幾乎是相同的(變換),但是當我得到新變換圖像和src圖像的abs差異時,有很多不同。我應該怎麼做,因爲我的dst圖像也有一些旋轉和平移因子。這裏是我的代碼Opencv轉換圖像

cv::Mat transformMat = cv::estimateRigidTransform(src, dst, true); 
cv::Mat output; 
cv::Size dsize = leftImageMat.size(); //This specifies the output image size--change needed 
cv::warpAffine(src, output, transformMat, dsize); 

Src的圖片

enter image description here

目的地形象

enter image description here

輸出圖像

enter image description here

絕對差值圖像

enter image description here

感謝

+0

首先,你想達到什麼目的? 當然,在進行一些常規變換時,abs-diff將不爲零。由於像素插值,即使1度的旋轉變化也會引起較大的變化。 – jnovacho

+0

你好,jnovacho,我想糾正圖像使用opencv – Mudasar

+0

我仍然沒有看到問題。你的代碼對我來說似乎很好。你能否提供一些截圖 - 源和目的圖像以及輸出圖像。 – jnovacho

回答

4

您對此過程存在一些誤解。

方法cv :: estimateRigidTransform以輸入兩組對應點爲輸入。然後求解一組方程以找到變換矩陣。變換的輸出將src點與dst點(精確匹配不可能 - 例如浮點座標)精確匹配或緊密匹配。

如果您對兩幅圖像應用estimatedRigidTransform,OpenCV會首先使用某種內部方法(請參閱opencv docs)查找匹配的點對。

cv :: warpAffine然後根據給定的變換矩陣將src圖像轉換爲dst。但任何(幾乎任何)轉型都是虧損經營。該算法必須估計一些數據,因爲它們不可用。這個過程稱爲插值,使用已知信息計算未知值。關於圖像縮放的一些信息可以在wiki找到。相同的規則適用於其他轉換 - 旋轉,傾斜,透視......顯然這不適用於翻譯。

鑑於您的測試圖像,我猜測OpenCV將燈罩作爲參考。從不同的角度來看,燈罩變化最好。 OpenCV默認使用線性插值進行變形,因爲它是最快的方法。但你可以設置更多的進步方法以獲得更好的結果 - 再次諮詢opencv docs

結論: 你得到的結果是非常好的,如果你牢記,這是自動化過程的結果。如果你想得到更好的結果,你必須找到另一種方法來選擇相應的點。或者使用更好的插值方法。無論哪種方式,在變換之後,diff不會是0.它實際上不可能實現,因爲位圖是像素的離散網格,所以總會存在一些需要估計的差距。

+0

好的謝謝:)的解釋 – Mudasar

+0

你好jnovacho,你可以告訴我如何設置旋轉中心在應用經紗仿射之前,實際上它是從左上角旋轉,而在立體圖像大多數時間旋轉來自中心。謝謝 – Mudasar

+1

嗨, 有一個問題。所有的轉換都是關於原點[0,0]。所以這裏的訣竅是將所需的中心翻譯成原點,旋轉並翻譯回去。有關矩陣轉換的一些信息在這裏http://www.willamette.edu/~gorr/classes/GeneralGraphics/Transforms/transforms2d.htm 但我不認爲這可以在OpenCV中工作,因爲你會丟失數據負座標。另外我不認爲你真的需要這個。這些功能在內部處理這個問題,它將圖像轉換成相應的點匹配。 – jnovacho