カメラ座標系、ワールド座標系、ピクセル座標系変換、OPENGLDEFocal Length と Opengl の Fov 変換

目的: カメラの仕組み、レンダリング、およびカメラでキャプチャされた深度マップを理解する

最近、カメラパラメータとopenglレンダリング画像の間のパラメータ関係が研究されています。プロジェクト マトリックスは、カメラ座標系からピクセル座標系に移行する過程で遭遇します。

理論的なカメラ変換

カメラベースの学習理論の知識。通常、プロジェクトを構築するにはカメラ パラメーターを使用し、次の 2 つのプロセスを経る必要があります: カメラ
座標系 -> 画像座標系 -> ピクセル座標系頂点p ( xc , yc , zc ) p( x_c)
カメラ座標系p ( xcyczc)、画像( xi , yi ) 上の頂点 p に変換されます p(x_i,y_i)p ( x私はy私はその変換行列はM proj M_{proj}Mプロジェク_ _ _
以下にいくつかの手順を紹介します。

  1. カメラ座標系から画像座標系 M p 2 c M_{p2c}Mp2c _ _
    同じ場所でも、異なるカメラでは異なる写真が得られます。このプロセスは一般的にカメラのパラメーターに関連していることがわかります。カメラの一部のパラメータは通常、カメラのマニュアルに記載されています。また、インターネット上で対応する形式のドキュメントを見つけることもできます。また、一部のパラメータは設定ファイルにも含まれています (たとえば、スキャナ内のイメージ カメラのカメラ パラメータ)。これらのパラメータの機能を理解するには、カメラのイメージング (小さな穴のイメージング) の原理を理解する必要があります。
    ここに画像の説明を挿入
    画像内の座標系は(O'x, O'y) (O'x, O'y)です。( O ×、」' y)、カメラ座標系は( O cxc , O cyc , O czc ) (O_cx_c, O_cy_c , O_cz_c)( Ocバツccycczc)を理解しやすくするために、視覚的なビューを変換します。なぜなら(O ' x , O ' y ) (O'x, O'y)( O ×、」' y)( O cxc , O cyc , O czc ) (O_cx_c, O_cy_c , O_cz_c)( Ocバツccycczc)( O cxc , O cyc ) (O_cx_c, O_cy_c)( Ocバツccyc)平行。したがって、幾何対称性に従って、画像座標系は下図に示すように鏡映位置に移動します。ここで、 ∠ O c AB \angle{O_cAB}cA B は直角です。画像はあまり正確ではありません。

ここに画像の説明を挿入
なぜなら、相似な三角形 (1) :
△ ABO c 〜 △ o CO c \bigtriangleup ABO_c \sim \bigtriangleup oCO_cAB O _c○○ _ _c
次の式を取得します。
O co O c Z c = o CAB = O c CO c B ( 1 ) \frac{O_co}{O_cZ_c} = \frac{oC}{AB} = \frac{O_cC}{O_cB} \スペース \スペース \スペース (1)cZccああ=AB _oC _=cBcC   ( 1 )
別の式 (O c O_cc原点、記号を変更)
O co O c Z c = f Z c ( 2 ) \frac{O_co}{O_cZ_c} = \frac{f}{Z_c} \space \space \space (2)cZccああ=Zc   ( 2 )
o CAB = x X c ( 3 ) \frac{oC}{AB} = \frac{x}{X_c} \space \space \space (3)AB _oC _=バツc×   ( 3 )

なぜなら、相似な三角形 (2) :
△ ABO c 〜 △ o CO c \bigtriangleup ABO_c \sim \bigtriangleup oCO_cAB O _c○○ _ _c
次の式が得られます。
O c CO c B = C p BP ( 4 ) \frac{O_cC}{O_cB} = \frac{Cp}{BP} \space \space \space (4)cBcC=BP _CP _   ( 4 )
別の式 (O c O_cc原点、記号を変更)
C p BP = y Y c ( 5 ) \frac{Cp}{BP} = \frac{y}{Y_c} \space \space \space(5)BP _CP _=Ycはい   ( 5 )
なぜなら(1) (2) (3) (4) (5) (1)(2)(3)(4)(5)( 1 ) ( 2 ) ( 3 ) ( 4 ) ( 5 )式は次のようになります:
f Z c = x X c = y Y c \frac{f}{Z_c} = \frac{x}{X_c} = \frac { y}{Y_c}Zc=バツc×=Ycはい
さらに次の式に変換します。
x = f ∗ X c Z c ( 6 ) x=\frac{f*X_c}{Z_c} \space \space \space(6)バツ=Zcfバツc   ( 6 )
y = f ∗ Y c Z c ( 7 ) y=\frac{f*Y_c}{Z_c} \space \space \space(7)y=ZcfYc   ( 7 )
そのうち( 6 )、 ( 7 ) (6)、 (7)( 6 ) ( 7 )式は次のように行列の形式で記述されます。
[ xyz ] = [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ X c Y c Z c 1 ] \begin{bmatrix} x\\ y \\ z \end{bmatrix} = \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} X_c\\ Y_c \\ Z_c \\ 1 \end{bmatrix}バツyz=f000f0001000バツcYcZc1
最終的な行列方程式M p 2 c M_{p2c}Mp2c _ _デフォルト:
M p 2 c = [ f 0 0 0 0 f 0 0 0 0 1 0 ] M_{p2c}= \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0&0&1&0 \end{b行列}Mp2c _ _=f000f0001000
短縮式は次のように取得できます。
[ xyz ] = M p 2 c [ X c Y c Z c 1 ] \begin{bmatrix} x\\ y \\ z \end{bmatrix} = M_{p2c}\begin{bmatrix } X_c \\ Y_c \\ Z_c \\ 1 \end{bmatrix}バツyz=Mp2c _ _バツcYcZc1
この時点で得られた[ xyz ] \begin{bmatrix} x\\ y \\ z \end{bmatrix}バツyz物理的な単位です。ピクセル単位ではないため、ピクセル単位に変換する必要があり、各ピクセルの特定の物理長が必要です。カメラのセンサーパラメータは必須です。カメラ座標からピクセル座標までを以下に説明します。

  1. 画像座標系をピクセル座標系に変換Mi 2 p M_{i2p}M2p
    カメラ座標系をピクセル座標系に変換する必要があります。これには 2 つの問題があります。
    1) 2 つの座標系の問題。画像座標系では、一般に原点は中心にあります。ただし、従来のピクセル表示座標系の原点は画像の左上隅であり、このベクトルを変換する必要があります。
    2) 単位変換の問題: 各ピクセルが何個の物理単位 (通常は mm) を持つかを知る必要があります。物理単位はミリメートルです。どちらの変換でも、 dx 、 dy d_x,d_yを知る必要があります。d×dはい各列と各行が何 mm であるかを示し、列の幅を表します1 ピクセル = dx mm 1 \space ピクセル = d_x \space mm1ピクセル_ _ _ _ =d× mm ; 線の幅1 ピクセル = dy mm 1 \ spaceピクセル = d_y \space mm1ピクセル_ _ _ _ =dはい mm、一般にdx = dy d_x=d_yd×=dはいしたがってxxx座標で表されるピクセルはxdx \frac{x}{dx}dx _×、対応するyyy座標で表されるピクセルはydy \frac{y}{dy}y _はい
    図に示す 2 つの座標系は次のとおりです。
    ここに画像の説明を挿入
    座標系を変換すると次の式が得られます。
    u = xdx + u 0 ( 8 ) u= \frac{x}{d_x}+u_0 \space \space \space (8)あなた=d××+あなた0   ( 8 )
    v = ydy + v 0 ( 9 ) v= \frac{y}{d_y}+v_0 \space \space \space (9)v=dはいはい+v0   ( 9 )
    そのうち( 8 )、 ( 9 ) (8)、 (9)( 8 ) ( 9 )この式は次のように行列の形式で記述されます。
    [ uv 1 ] = [ 1 dx 0 u 0 1 dy 0 v 0 0 0 1 ] [ uv 1 ] \begin{bmatrix} u\\ v \ \1 \end{ bmatrix}= \begin{bmatrix} \frac{1}{d_x}&0&u_0 \\ \frac{1}{d_y}&0&v_0 \\0&0&1 \end{bmatrix}\begin{bmatrix} u\\ v \\1 \end {bmatrix}あなたv1=d×1dはい10000あなた0v01あなたv1
    得られた行列式は次のとおりです。
    Mi 2 p = [ 1 dx 0 u 0 1 dy 0 v 0 0 0 1 ] M_{i2p}= \begin{bmatrix} \frac{1}{d_x}&0&u_0 \\ \frac{ 1 {d_y}&0&v_0 \\0&0&1 \end{bmatrix}M2p=d×1dはい10000あなた0v01

上記 2 つの変換をまとめると、次のようになります。
M proj = [ 1 dx 0 u 0 1 dy 0 v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] M_{proj}= \begin{bmatrix} \ frac{1}{d_x}&0&u_0 \\ \frac{1}{d_y}&0&v_0 \\0&0&1 \end{bmatrix} \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \ \ 0 & 0 & 1 & 0 \end{bmatrix}Mプロジェク_ _ _=d×1dはい10000あなた0v01f000f0001000
最後に、数式射影行列が得られます。
M proj = [ fdx 0 u 0 0 0 fdyv 0 0 0 0 1 0 ] = [ fx 0 u 0 0 0 fxv 0 0 0 0 1 0 ] M_{proj}= \begin{bmatrix } \frac{f}{d_x}& 0 & u_0 & 0 \\ 0 & \frac{f}{d_y} & v_0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} = \begin{bmatrix } f_x & 0 & u_0 & 0 \\ 0 & f_x & v_0 & 0 \\ 0 & 0 & 1 & 0 \\end{bmatrix}Mプロジェク_ _ _=d×000dはい0あなた0v01000=f×000f×0あなた0v01000
公式で関係を理解すると、fx = fdx f_x=\frac{f}{d_x}となります。f×=d×、焦点距離が何ピクセルであるかを示します(これはピクセル単位です)、同様にfy = fdy f_y=\frac{f}{d_y}fはい=dはいまた、ピクセル数も示します。一般に、dx = dy d_x=d_y となります。d×=dはい、焦点距離は 1、上図のfff

要約は次のとおりです:
M proj = [ fx 0 u 0 0 0 fxv 0 0 0 0 1 0 ] M_{proj}= \begin{bmatrix} f_x & 0 & u_0 & 0 \\ 0 & f_x & v_0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix}Mプロジェク_ _ _=f×000f×0あなた0v01000

OpenGL 座標レンダリング理論

カメラベースの OPENGL 理論的知識。通常、カメラ パラメーターを使用して、より多くの fov、アスペクト比、近距離、遠距離を必要とするプロジェクトを構築します。その中で、特定のレンダリングには 4 つのパラメーターがあり、空間に必要なパラメーターを正確にレンダリングでき、理解しやすく、正規化操作と簡単なレンダリング計算のためのスペースを削減できることがわかりました。詳細については、カメラ設定に関する Baidu learnopengl を参照してください。上記4つのパラメータについて設定します。2 種類のプロジェクトがあり、以下にその原理を紹介します。
ここに画像の説明を挿入
fov、アスペクト比、近距離、遠距離に変換しない場合は、マトリックスを直接投影し、glFrustum を通じて完成させることができます。ただし、opengl レンダリングの学習では、通常 gluPerspective が使用され、使用されるパラメーターは fov、アスペクト比、near、far です。シェーダーにプロジェクト マトリックスを直接設定して、レンダリングされたプロジェクト マトリックスを取得できます。また、gluPerspective を模倣してプロジェクト マトリックスを生成すると同時に、上記 4 つに変換することもでき、opengl の gluPerspective を使用してプロジェクト マトリックスを生成することができます。どちらの方法でも問題なく動作します。
1) カメラのパラメータは fov、アスペクト比、近距離、遠距離の 4 つのパラメータに変換されます。
まず、これら 4 つのパラメータを理解してください。
1) 視野 (FOV)、アスペクト比 アスペクト
比は、最終的に表示される画像の x/y 比です。
FOV: 開いた視野の角度を示します。以下の図を参照してください。
2) 近傍および遠方は、遠方および近方の接平面と原点の間の距離を表します。図の 2 つの平行な平面を参照してください。
ここに画像の説明を挿入
上の図の関係がわかります。
ここに画像の説明を挿入
画像と一致する画像をレンダリングする必要がある場合、画像は img として表現され、画像を通じてアスペクト比と FOV を設定します。
定義によれば、ratio は最終的に表示される画像の x/y 比であり、
計算式は次のとおりです:
アスペクト = img .colsimg . rows アスペクト=\frac{img.cols}{img.rows}側面_ _ _ _ _=います_ _ _いますコルス_ _ _
上の式に当てはめると、top は y 軸の半分、つまりピクセル座標系のピクセル幅に対応します。つまり、
top = ピクセル幅 2.0 トップ = \frac{ピクセル幅}{2.0} となります。トップ_ _=0ピクセル_ _ _ _ _ _ _ _
このうち、near は焦点距離 (ピクセル座標系) に相当し、ピクセル座標系で表されます。ユニットが統一されています。
後で次の式に変換されます:
FOV = 2.0 ∗ atanf ( ピクセル幅 2.0 ∗ 焦点 L 長さ ) ∗ π 180.0 FOV=2.0*atanf({\frac{pixelwidth}{2.0*focalLength}})*\frac{\pi}{ 180.0 }FOV _ _=0a t a n f (0焦点_ _ _ _ _ _ _ _ピクセル_ _ _ _ _ _ _ _)1 8 0 0p
近距離と遠距離の設定距離は、できるだけ近くても遠くても構いません。
そのマトリックスは次のとおりです。
ここに画像の説明を挿入
設定後、レンダリングされた画像はカメラでキャプチャされた画像と一致します。

導出プロセスに参加した後。

おすすめ

転載: blog.csdn.net/weixin_43851636/article/details/125082129
おすすめ