3

一般的な LCD プロジェクターを使用して、画像を単純な 3D 形状に照らそうとしていますが、繰り返し可能な方法で行います。

必要なもの: 私の最も単純な例は、立方体をテーブルの上に置き、プロジェクターを三脚に取り付けて少し離れた場所に置き、2 つの間の距離/方向を測定することです (GOM photogammetry 製品、http://www.capture3d. com/products-TRITOP.html )、既存の obj (ポリゴン) モデルを開きます。このモデルは立方体とまったく同じ形状 (寸法的に非常に正確) ですが、「ファンシー」な色付けが施されています。次に、ポリゴン モデルを LCD プロジェクターに投影します。

私がやったこと:プロジェクターの固有/外部定数を決定するために1か月を費やしました-カメラペア、焦点距離、主点、歪み定数...そして私はそれらを持っていると思います. (http://code.google.com/p/procamcalib/)

obj ファイルを開くコードを見つけた/変更しました。

私は、プロジェクターのこれらの組み込み/外部定数をどうするかについて悩んでいます。

私はopengl / opencvを使用しています...

4

2 に答える 2

1

役立つリンク: http://urbanar.blogspot.it/2011/04/from-homography-to-opengl-modelview.html

および http://cvrr.ucsd.edu/publications/2008/MurphyChutorian_Trivedi_CVGPU08.pdf

まず、P マトリックスを k、R、t に分解します。ここで、k は固有のマトリックスであり、R、t は相対的にポーズの回転と平行移動です。次に、対応する OpenGL マトリックスを次のように生成できます (私の解決策は C++ にありますが、理解できます)。その背後にあるロジック):

Eigen::Matrix4d convertIntrinsicToOpenGLProjection(const Eigen::Matrix3d &K,double x0,double y0,double width,double height,double znear,double zfar)
{
    double depth = zfar - znear;
    double q =  -(zfar + znear) / depth;
    double qn = -2.0 * (zfar * znear) / depth;
    Eigen::Matrix4d proj;
    proj << 2*K(0,0)/width, -2*K(0,1)/width, (-2*K(0,2)+width+2*x0)/width, 0 ,
                           0,             -2*K(1,1)/height,(-2*K(1,2)+height+2*y0)/height, 0,
                         0,0,q,qn,
                         0,0,-1,0;
    return proj;
}

Affine3d convertExtrinsicToOpenGLModelView(const Matrix3d &R, const Vector3d &t)
{
    Affine3d MV;
    MV.linear().matrix() << R;
    MV.translation() << t;
    AngleAxis<double> adapter(M_PI,Eigen::Vector3d(1,0,0));
    MV = MV*adapter;
    return MV.inverse();
}
// Decompose P in k,R,t with any DLT direct linear transform procedure or Zhang method
Eigen::Matrix3d K; //intrinsic calibration matrix
    K <<     49.30423  ,   0.00000 ,  387.13187,
        0.00000  ,  26.81592 ,  295.07170,
        0.00000 ,    0.00000   , 1.00000 ;

    int projAreaWidth = 684; //related to the size of your screen
    int projAreaHeight = 608;
    double x0=0,y0=0;
    double zfar=0.1;
    double znear=2000;

Matrix4d P = convertIntrinsicToOpenGLProjection( K,  x0, y0,  width,  height, znear, zfar);
Affine3d MV = convertExtrinsicToOpenGLModelView(R, t);

glPushMatrix();
glLoadMatrixd(P.data());
glMultMatrixd(MV.data());

//draw your object

glPopMatrix();

これがあなたにとって意味があるかどうか教えてください。

于 2013-04-15T11:06:28.783 に答える
0

こちら で説明されているように、焦点距離からカメラの視野を計算できます。視野を取得したら、gluPerspective() (または自分で計算- セクション 9.085 を参照) を使用して透視行列を設定できます。プロジェクターとオブジェクトの場所に基づいて、モデルビュー マトリックスも変更する必要があることは明らかです。どのような歪みデータがあるかはわかりませんが、おそらくそれも考慮する必要があります。

于 2012-01-02T17:10:53.133 に答える