2010/07/28

OpenCVとOpenGLの組み合わせ

Youtubeやニコニコ動画のAR系の動画には、OpenGLで戦車なり目玉なりを
描画しているものが多いので、私もOpenGLをちょっと触ってみることにしました。

OpenGL入門のサイトを色々と巡ってみましたが、OpenGLが複雑でよくわからず。


試行錯誤で何とかマーカーの傾きや位置を描画する物体に
反映させることができるようになりました。



さらにOpenGLを勉強して、マーカーのど真ん中に急須を表示出来るようにしたいです。

ではまた。

3 件のコメント:

  1. はじめまして。いつも楽しみに拝見しています。
    私もOpenCVとOpenGLを組み合わせてARのようなものを作っているのですが、OpenGLの座標系の設定がうまくできません。
    cvFindExtrinsicCameraParams2()から得たrotationとtranslationからglLoadMatrixd()で設定していると思うのですが、glLoadMatrixd()にはどのような行列を設定しているのでしょうか?
    教えていただければ幸いです。

    返信削除
  2. >rhythmistsさん
    返答が非常に遅れてしまいました。

    cvFindExtrinsicCameraParams2で得られるのは
    rotationベクトルとtranslationベクトルで、

    rotationが3x1のベクトルになっています。
    これを3x3の回転行列にするために、
    cvRodrigues2を使って3x3の行列に変換しました。

    そのあと、OpenGLの座標系の4x4行列を作って、
    なんとなく入れてみたら動いた、といった感じです。

    参考になるかはわかりませんが、
    そのあたりのコードを記載します。


    //※rotation、rotationにはcvFindExtrinsicCameraParams2で求めた
    //ベクトルが入っています。

    //配列に格納しなおす
    double _r1[3];
    _r1[0]=cvmGet(rotation,0,0);
    _r1[1]=cvmGet(rotation,0,1);
    _r1[2]=cvmGet(rotation,0,2);

    double trans[3];
    trans[0]=cvmGet(translation,0,0);
    trans[1]=cvmGet(translation,0,1);
    trans[2]=cvmGet(translation,0,2);

    //3x3の回転行列を確保
    double Homograph[9];

    CvMat r1 = cvMat(3,1,CV_64F,_r1);
    CvMat _Homograph = cvMat(3, 3, CV_64F, Homograph );

    //3x3に変換
    cvRodrigues2(&r1, &_H);

    //ここからはOpenGLのdisplay()関数の中に実装してます
    //OpenGLの4x4を初期化
    double glMatrix[16] =
    {
    1.0, 0.0, 0.0, 0.0,
    0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 1.0, 0.0,
    0.0, 0.0, 0.0, 1.0
    };

    //回転行列を入れる
    glMatrix[0] = Homograph[0];
    glMatrix[1] = Homograph[1];
    glMatrix[2] = Homograph[2];

    glMatrix[4] = Homograph[3];
    glMatrix[5] = Homograph[4];
    glMatrix[6] = Homograph[5];

    glMatrix[8] = Homograph[6];
    glMatrix[9] = Homograph[7];
    glMatrix[10]= Homographh[8];

    //移動ベクトルを入れる
    glMatrix[12]= trans[0];
    glMatrix[13] =trans[1];
    glMatrix[14] =trans[2];

    glMultMatrixd(glMatrix);
    //ここまで。。


    また、下記ページを参考させて作ってみました。

    マーカー検出と3次元座標推定
    http://kato.keiske.info/blog/2009/05/3.html
    被写体を回そうとするとなぜかカメラが回ってしまう の続き
    http://kato.keiske.info/blog/2009/05/post-101.html

    モデルビュー変換
    http://wisdom.sakura.ne.jp/system/opengl/gl11.html

    返信削除
  3. >lhaplus8888さん
    お返事ありがとうございます。OpenGLのオブジェクトを無事表示させることができました。コードまで載せていただき、ありがとうございます。
    これからも記事楽しみにしています!

    返信削除