web-dev-qa-db-ja.com

焦点とカメラの主中心を指定して、透視投影行列を作成する方法

私はOpenCVを使用してカメラの内因性および外因性パラメーターを取得することができたので、fx、fy、cx、およびcyがあります。また、画面/画像の幅と高さもあります。

しかし、これらのパラメータからOpenGL透視投影行列を作成するにはどうすればよいですか?

glFrustrumは、Zが近く、Zが遠く、画像の幅と高さを指定して、射影行列を作成する方法を示しています。しかし、このマトリックスに焦点とカメラの中心を含めるにはどうすればよいですか?

enter image description here

17
sub_o

以下のリンクを確認できます

カイルシメックの説明

私の説明

11
koshy george

これは、カメラ行列K=[fx, s, cx; 0, fy, cy; 0, 0, 1]と画像サイズ[W, H]を備えたコンピュータービジョンカメラと同等のOpenGL射影行列を取得するためのコードです。

glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity();            // Reset The Projection Matrix
GLdouble perspMatrix[16]={2*fx/W,0,0,0,2*s/W,2*fy/H,0,0,2*(cx/W)-1,2*(cy/H)-1,(zmax+zmin)/(zmax-zmin),1,0,0,2*zmax*zmin/(zmin-zmax),0};
glMultMatrixd(perspMatrix);

注意:zminzmaxは、近距離と遠距離のZクリッピング平面を表します。この定式化は、OpenGLワールド座標フレームが次のように選択されていることを前提としています。

enter image description here

OpenGLカメラは、正のZ軸に向かって、下向きのベクトルが同一直線上にあり、正のY軸に向かって、原点に配置されていると想定されます。

9
BConic

AldurDiscipleの回答に関連して、これは、ワールド座標フレームが逆z軸で選択された場合に使用する必要のある定式化です。

inverted z axe

glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity();            // Reset The Projection Matrix
GLdouble perspMatrix[16]={2*fx/w,0,0,0,0,2*fy/h,0,0,2*(cx/w)-1,2*(cy/h)-1,-(far+near)/(far-near),-1,0,0,-2*far*near/(far-near),0};
glMultMatrixd(perspMatrix);
3
Luca

Open GLは、近距離および遠距離と呼ばれる深さの制限がある透視投影に関連する錐台で動作します。ピラミッドが横になっていると想像してください。これは錐台です。別の例としては、錐台があります。距離に応じて幅と高さが伸びるビーム-これも錐台です。したがって、右、左、下、上が画像座標であり、近距離と遠距離が深度制限であり、近距離が 焦点面 。OpenGLはCxとCyを画像面の中央に配置するので、それらをスキップできます。錐台を指定する別のより自然な方法は、の視野角または視野に基づいています。ビュー(50〜60度が一般的);呼び出す関数は glPerspective() です。ここでは、まだ近くと遠くがありますが、サイズの代わりに角度を指定しますとアスペクト比。頑張ってください。

1
Vlad