我有許多校準攝像機拍攝平面場景圖片。爲了簡單起見,我們假設有3臺攝像機。這些相機正在進行廣泛的運動,但大部分是平移加上一些輕微的旋轉。 Example positions of cameras將像素從一個圖像重新映射到另一個圖像
任務是完全縫合它們。我不瞭解3D座標,只是一組使用校準相機拍攝的圖像。
我的操作:
我檢測與SURF特徵/ SIFT在OpenCV中實現通過使用findHomography每對圖像(1-> 2之間得到初始的單應性,2-> 3,1-> 3)。從這些單應性我得到每臺攝像機姿勢的初始esitimation (similiar procedure to this)
然後,我嘗試使用束調整技術,以儘量減少每個匹配對的重投影誤差。雖然我可以稍後添加內部參數(焦點,主點等),但優化的參數是三個平移值和三個旋轉值(從Rodrigues的旋轉公式獲得)。
假設圖像#2將是參考幀(通過與其他兩幅圖像匹配的量最多),它的旋轉和平移矩陣分別是恆等矩陣和零矩陣。
我計算關鍵點的重新投影(可見在兩個圖像#2和圖像#1)從圖像#2(僞代碼)
[x1_; y1_; z1_] = K1*R1*inv(K2)*[x2; y2; 1] + K1*T1/Z2;
x1 = x1_/z1_;
y1 = y1_/z1_;
或
x1 = ((f1/f2)*r11*x2 + (f1/f2)*r12*y2 + f1*r13 + f1*tx/Z2)/((1/f2)*r31*x2 + (1/f2)*r32*y2 + r33 + tx/Z2)
y1 = ((f1/f2)*r21*x2 + (f1/f2)*r22*y2 + f1*r23 + f1*ty/Z2)/((1/f2)*r31*x2 + (1/f2)*r32*y2 + r33 + ty/Z2)
其中R__至圖像#1是R1矩陣的元素並且兩個本徵矩陣的形式是
[f 0 0]
[0 f 0]
[0 0 1]
我假定Z2 coo將參考幀的rdinate設置爲1.
下一階段是使用獲得的相機矩陣(K1,R1,T1,K3,R3,T3)將圖像#1和#3轉換爲圖像#2的公共座標系。
的問題是,我不知道Z1和Z3所需要的知識正確再投影到圖像#2的參考幀,因爲從圖像#1反轉重投影 - >#2是這樣的:
x2 = ((f2/f1)*R11*x1 + (f2/f1)*R12*y1 + f2*R13 - f0/Z1*(R11*tx + R12*ty + R13*tz))/((1/f1)*R31*x1 + (1/f1)*R32*y1 + R33 - 1/Z1*(R31*tx + R32*ty + R33*tz))
y2 = ((f2/f1)*R21*x1 + (f2/f1)*R22*y1 + f2*R23 - f0/Z1*(R21*tx + R22*ty + R23*tz))/((1/f1)*R31*x1 + (1/f1)*R32*y1 + R33 - 1/Z1*(R31*tx + R32*ty + R33*tz))
哪裏R__是inv(R1)矩陣的元素。
有沒有更好的方法來計算光束調整(2d-> 2d)的重投影誤差,然後將圖像變形爲常用座標系?我注意到OpenCV在它們的拼接模塊中有非常類似的框架,但它在假設純旋轉運動的情況下運行,這不是這裏的情況。
您是否想過3D三角測量?例如,您可以使用除一臺攝像機以外的所有攝像機對一個點進行三角測量,並將其重新投影到最後一個攝像機。 – cedrou 2013-03-18 14:19:26