參考鏈接: https://wenku.baidu.com/view/606da2a1240c844769eaee7e.html?qq-pf-to=pcqq.group
https://blog.csdn.net/fireflychh/article/details/82352710
先驗知識:
(1)內方位元素:表示攝影中心與像片之間相關位置(姿態)的參數,共三個參數:
1)攝影中心s到像片的垂距;
2)像主點O在框標坐標系中的坐標(x0 , y0);
外方位元素:攝影中心在物方坐標系中的三維坐標和姿態(共6個參數);
(2)四個坐標系:
1)框標坐標系:二維像平面坐標系;
2)像空間坐標系:Z軸垂直於二維像平面,X、Y軸平行於框標坐標系的X、Y軸;
3)像空間輔助坐標系(像輔坐標系);
4)大地坐標系,也稱物方坐標系:該坐標系與上面的像輔坐標系X、Y、Z軸均平行,只是原點位置不同,上者的原點在攝影中心(相機中心),該坐標系的原點在物體中心;
示意圖如下:

如上圖:(Xtp , Ytp , Ztp)是物方坐標系,(X , Y , Z)是像輔坐標系,(x , y , z)是像空間坐標系,s是相機中心,a是物體A在像平面上的成像點;
1)(XA , YA , ZA):A點物方坐標;
2)(XS , YS , ZS):S點物方坐標;
3)(x , y , -f):a點像空坐標;
4)(X , Y , Z):a點像輔坐標;
另外,
,其中
為相機中心到物體中心的距離,f是相機的焦距;
現在我們先來證明共線方程:
在證明共線方程之前,我們需要縣引入旋轉矩陣(rotation matrix)這個概念,可以參考 https://blog.csdn.net/fireflychh/article/details/82352710
詳細解釋如下:

注意:對於上面的旋轉角度,我們規定:令右手大拇指指向旋轉軸的正向,則其他手指彎曲的方向為旋轉角度的正方向;
然后我們也順便引入translation vector的概念(即轉移向量),我們令:
1)To-c:物體中心在像空坐標系中的坐標;
2)Tc-o:攝影中心(相機中心)在物方坐標系中的坐標;
然后來證明共線方程:

下面引入一個比較實用的公式,可以實現從物方坐標系到二維像平面坐標系的轉換!如下:



還有幾點補充的:
(1)opencv中的兩個函數:
1)cv::projectPoints(object_points2, rotation_matrix, translate_T, intrinsic_matrix, distortion_coeffs, pts_proj);
2)solvePnP()
第一個函數是給定rotation_matrix和translate_T,可以計算出物方坐標投影到對應的像坐標,第二個函數是計算出rotation_matrix和translate_T,它們均為To-c , Ro-c;
(2)一些基本的圖像變換矩陣(平移、縮放、旋轉):

