PMVS論文隨筆(1)

博客園排版系統真的比較挫,能夠訪問個人github.io閱讀git

關於Unit的概念

在pmvs的源代碼中,有一個函數是getUnit ,其函數以下(在PMVS2的windows版本代碼,optim.cc文件,1184行):github

float Coptim::getUnit(const int index, const Vec4f& coord) const {
  const float fz = norm(coord - m_fm.m_pss.m_photos[index].m_center);
  const float ftmp = m_ipscales[index];
  if (ftmp == 0.0)
    return 1.0;

  return 2.0 * fz * (0x0001 << m_fm.m_level) / ftmp;
}

其中index是圖像編號,coord是三維射影空間下的座標。windows

這個函數在pmvs代碼中幾乎全部的和空間幾何計算相關的函數中均被調用,最開始看代碼時我並無特別注意,可是隨着代碼閱讀的深刻,發現若是不將該函數讀懂,就徹底沒法理解pmvs中全部的幾何計算函數到底是在作什麼,因而今天花時間特地鑽研了下,把該函數的含義表達清楚。app

先說結論:該函數是計算將圖片上的一個像素反投影到空間的一個指定的面片(patch)上獲得的正方形的大小(以世界座標系中的距離爲量度),這個面片知足以下條件——面片的中心位於coord, 面片的法線與相片的法線平行但方向相反(也就是論文中初始化patch時的法線計算方法)。函數

這個結論看起來很是複雜,簡單說就是若是我在空間的某個座標處想要畫一個正方形,使得該正方形投影到對應的與該正方形平行的相片上的大小剛好是1×1像素大小,那麼這個正方形的邊長在世界座標系中的表達到底是多少。這個函數就是來求解這個邊長的。spa

這樣的話這個函數做用其實就至關大了,他直接溝通了像素座標和空間座標的比例關係,能夠粗略的比較相片對於場景的縮放,簡化不少投影和反投影計算。而這個函數用到的計算方法其實也很是簡單。就是簡單的類似三角形關係,具體解釋以下code

小孔成像相機的幾何關係以下圖所示(摘自《 Multiple View Geometry in Computer Vision 》)orm

小孔成像相機的幾何關係

從該成像原理上咱們能夠看出,空間中一個長度爲\(D\) 的物體投影到圖像上長度\(l\)知足以下關係:
\[ \frac{D}{l} = \frac{Z_0}{f} \]
其中\(f\) 爲焦距,\(Z_0\) 爲物體到攝影中心的距離。
由上式能夠獲得:
\[ D = \frac{l}{f}Z_0 \]
這樣咱們已知\(l\) 爲1個像素長度,\(Z_0\) 能夠直接由coord到相片的攝影中心直接計算獲得。那麼只要咱們知道以像素爲單位的\(f\)的數值,就能夠直接獲得\(D\)。幸運的是,根據通常CCD相機內參數矩陣中各變量的定義:
\[ K=\begin{bmatrix} a_x & s & x_0 \\ 0 & a_y & y_0 \\ 0 & 0 & 1 \end{bmatrix} \]
其中\(a_x\)\(a_y\)分別是相機在x和y方向上的焦距,且以像素爲量綱。另一般狀況下,CCD相機在x和y方向上的比例所以近似相等,即\(a_x \approx a_y\),這樣咱們能夠用下式來近似計算\(f\)
\[ f = \frac{a_x + a_y}{2} \]
綜上可得:
\[ D=\frac{2}{a_x + a_y} Z_0 \]
這就是pmvs中getUnit的計算方法, 特別解釋下,代碼中m_ipscales[index]就是提早計算好的\(a_x+a_y\)的數值,而(0x0001 << m_fm.m_level)則是一個比例因子,可讓程序將圖像縮放到一半或者四分之一大小進行計算。blog

相關文章
相關標籤/搜索