圖像縮放之后相機內參變化
1. 問題描述
在對采集到的圖像進行3D坐標相關計算時,需要用到相機內參信息,但是在對圖像進行縮放之后相機內參如何變化呢?
在大多數書上只會給出結論(假設縮小一半):
\[f_x'= \frac{f_x}{2},f_y'=\frac{f_y}{2},c_x'=\frac{c_x}{2},c_y'=\frac{c_y}{2} \]
2. 數學推導
以下函數把3D空間點 \(P\) 投影到像素坐標系中: $$(x,y,z,1)\rightarrow(u,v,S)$$
\[\begin{pmatrix} a_x & 0 & u_0 \\ 0 & a_y & v_0 \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} R_{11} & R_{12} & R_{13} & T_x \\ R_{21} & R_{22} & R_{23} & T_y \\ R_{31} & R_{32} & R_{33} & T_z \\ \end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} \]
之后,$$(u,v,S)\rightarrow(u/S,v/S,1)$$得到非齊次的像素坐標.
可以簡寫為:
\[u= \frac{m_1 P}{m_3 P} \\ v = \frac{m_2 P}{m_3 P} \]
其中\(m_i\)為\(K[R|T]_{3\times4}\)構成的投影矩陣的第\(i\)行,在進行resize之后:
\[u'=\frac{u}{2} \\ v' = \frac{v}{2} \]
因此:
\[u' = (1/2) \frac {m_1 P} {m_3 P} \\ v' = (1/2) \frac {m_2 P} {m_3 P} \]
轉換回最初的投影方程:
\[\left( \begin{array}{ccc} 0.5 & 0 & 0 \\ 0 & 0.5 & 0 \\ 0 & 0 & 1 \end{array} \right) \left( \begin{array}{ccc} a_x & 0 & u_0 \\ 0 & a_y & v_0 \\ 0 & 0 & 1 \end{array} \right) \left( \begin{array}{ccc} R_{11} & R_{12} & R_{13} & T_x \\ R_{21} & R_{22} & R_{23} & T_y \\ R_{31} & R_{32} & R_{33} & T_z \\ \end{array} \right) \left( \begin{array}{ccc} x \\ y \\ z \\ 1 \end{array} \right) \]
與如下形式等價:
\[\left( \begin{array}{ccc} 0.5 a_x & 0 & 0.5 u_0 \\ 0 & 0.5 a_y & 0.5 v_0 \\ 0 & 0 & 1 \end{array} \right) \left( \begin{array}{ccc} R_{11} & R_{12} & R_{13} & T_x \\ R_{21} & R_{22} & R_{23} & T_y \\ R_{31} & R_{32} & R_{33} & T_z \\ \end{array} \right) \left( \begin{array}{ccc} x \\ y \\ z \\ 1 \end{array} \right) \]
如果使用的是Matlab類似的索引由1開始的,需要利用: \(u'=(u-1)/2+1,v'=(v-1)/2+1\)替換,並重新推導
3. 對於0.5pixel
問題的處理
同樣需要進行處理:
\[u'=(u-0.5)s+0.5\\ v'=(v-0.5)s+0.5 \]
於是可以得到(假設縮放為\(s\)):
\[\begin{pmatrix} sf_x & 0 & sc_x+0.5s-0.5 \\ 0 & sf_y & sc_y+0.5s-0.5 \\ 0 & 0 & 1 \end{pmatrix} \]
於是,對應的內參變化為:
\[\begin{aligned} f_x' &= s*f_x\\ f_y' &= s*f_y\\ c_x' &= s*c_x+0.5s-0.5\\ c_y' &= s*c_y +0.5s-0.5 \end{aligned} \]