22

私は現在、procamcalib と呼ばれる JavaCV ソフトウェアを使用し Kinect RGB カメラを原点とする Kinect-Projector セットアップを調整しています。このセットアップは、Kinect RGB カメラ (現時点では Kinect を通常のカメラとして大まかに使用しています) と 1 つのプロジェクターのみで構成されています。このキャリブレーション ソフトウェアは、Kinect ドライバーとしてLibFreenect (OpenKinect) を使用します。

ソフトウェアがそのプロセスを完了すると、カメラとプロジェクターの両方の組み込みパラメーターと外部パラメーターが得られます。これは、キャリブレーションを検証するためにOpenGLソフトウェアに投入され、いくつかの問題が発生する場所です。Projection と Modelview が正しく設定されると、Kinect で表示されているものと投影されているものを合わせることができるはずですが、これを実現するには、3 軸すべてを手動で変換する必要があり、この最後の部分は作成されていません。私には意味があります!これを整理するのを手伝ってくれませんか?Kinect データの取得に使用される SDK はOpenNI です(最新の 2.x バージョンではなく、1.5.x である必要があります)。

このエラーを再現するために私が何をしているのかを正確に説明します。校正パラメータは次のように使用されます。

射影行列は次のように設定されます ( http://sightations.wordpress.com/2010/08/03/simulating- calibrationd-cameras-in-opengl/ に基づく):

r = width/2.0f;         l = -width/2.0f;
t = height/2.0f;        b = -height/2.0f;

alpha = fx;      beta = fy;
xo    = cx;      yo   = cy;

X = kinectCalibration.c_near + kinectCalibration.c_far;
Y = kinectCalibration.c_near*kinectCalibration.c_far;

d = kinectCalibration.c_near - kinectCalibration.c_far;


float* glOrthoMatrix = (float*)malloc(16*sizeof(float));

glOrthoMatrix[0] = 2/(r-l); glOrthoMatrix[4] = 0.0f;        glOrthoMatrix[8] = 0.0f;        glOrthoMatrix[12] = (r+l)/(l-r);
glOrthoMatrix[1] = 0.0f;    glOrthoMatrix[5] = 2/(t-b);     glOrthoMatrix[9] = 0.0f;        glOrthoMatrix[13] = (t+b)/(b-t);
glOrthoMatrix[2] = 0.0f;    glOrthoMatrix[6] = 0.0f;        glOrthoMatrix[10] = 2/d;        glOrthoMatrix[14] = X/d;
glOrthoMatrix[3] = 0.0f;    glOrthoMatrix[7] = 0.0f;        glOrthoMatrix[11] = 0.0f;       glOrthoMatrix[15] = 1;
printM( glOrthoMatrix, 4, 4, true, "glOrthoMatrix" );


float* glCameraMatrix = (float*)malloc(16*sizeof(float));

glCameraMatrix[0] = alpha;  glCameraMatrix[4] = skew;   glCameraMatrix[8] = -xo;    glCameraMatrix[12] = 0.0f;
glCameraMatrix[1] = 0.0f;   glCameraMatrix[5] = beta;   glCameraMatrix[9] = -yo;    glCameraMatrix[13] = 0.0f;
glCameraMatrix[2] = 0.0f;   glCameraMatrix[6] = 0.0f;   glCameraMatrix[10] = X;     glCameraMatrix[14] = Y;
glCameraMatrix[3] = 0.0f;   glCameraMatrix[7] = 0.0f;   glCameraMatrix[11] = -1;    glCameraMatrix[15] = 0.0f;

float* glProjectionMatrix = algMult( glOrthoMatrix, glCameraMatrix );

また、Modelview マトリックスは次のように設定されます。

proj_loc = new Vec3f(   proj_RT[12], proj_RT[13], proj_RT[14] );    
proj_fwd = new Vec3f(   proj_RT[8],  proj_RT[9],  proj_RT[10] );
proj_up  = new Vec3f(   proj_RT[4],  proj_RT[5],  proj_RT[6]  );
proj_trg = new Vec3f(   proj_RT[12] + proj_RT[8], 
                        proj_RT[13] + proj_RT[9], 
                        proj_RT[14] + proj_RT[10] );

gluLookAt( proj_loc[0], proj_loc[1], proj_loc[2],
           proj_trg[0], proj_trg[1], proj_trg[2],
           proj_up[0],  proj_up[1],  proj_up[2] );

最後に、カメラが表示され、次のように移動します。

glPushMatrix();
glTranslatef(translateX, translateY, translateZ); 
drawRGBCamera();
glPopMatrix();

ここで、視覚的に一致するまでキーボードを使用して翻訳値を手動で調整します (Kinect-rgb カメラが見ているものをキャリブレーション ボードに投影しているので、投影されたパターンが印刷されたパターンと一致するまで、opengl カメラを手動で調整します)。

ここでの私の質問は、なぜこの手動調整を行わなければならないのですか? モデルビューとプロジェクションのセットアップで処理する必要があります。

また、キャリブレーションには OpenKinect、検証には OpenNI を使用しているため、そのようなドライバーを切り替えるときに問題がないかどうかも迷っていました。これは、RGBDemo と呼ばれる別の一般的なキャリブレーション ツールを調査しているときに思い浮かびました。そこでは、LibFreenect バックエンドを使用する場合、Kinect キャリブレーションが必要であると書かれています。

では、ドライバーで作成して別のドライバーで表示すると、キャリブレーションがうまくいかないのでしょうか?

これを OpenGL ではなく OpenCV で行うと、成功しやすくなると思う人はいますか?

JavaCVリファレンス: https://code.google.com/p/javacv/
Procamcalib「ショートペーパー」: http://www.ok.ctrl.titech.ac.jp/~saudet/research/procamcalib/
Procamcalibソースコード: https://code.google.com/p/javacv/source/browse?repo=procamcalib
RGBDemo キャリブレーション リファレンス: http://labs.manctl.com/rgbdemo/index.php/Documentation/Calibration

必要に応じて、さらに多くのものをアップロードできます。私を助けるために必要なものを教えてください :)

4

2 に答える 2

3

私はあなたがリンクした記事の著者であり、私がお手伝いできると思います.

問題は、モデルビュー マトリックスの設定方法にあります。gluLookAt() を呼び出すときに、proj_RT の 3 番目の列をカメラの位置として使用していますが、それはカメラの位置ではなく、カメラ座標での世界の原点の位置です。これを解決するのに役立つかもしれない新しいブログの記事を書きました。外部行列を解釈する 3 つの異なる (同等の) 方法について、それぞれの WebGL デモを使用して説明します。

http://ksimek.github.io/2012/08/22/extrinsic/

gluLookAt を使用する必要がある場合は、この記事でその方法を説明しますが、glLoadMatrix(proj_RT).

tl;dr: に置き換えgluLookAt()ますglLoadMatrix(proj_RT)

于 2013-05-26T17:13:02.087 に答える
0

Kinect キャリブレーションについては、最新の 0.7 リリースの RGBDemo http://labs.manctl.com/rgbdemoおよび対応するFreenect キャリブレーション ソースを参照してください。

v0.7.0 ChangeLogs から:

v0.6.1 以降の新機能:

  • マーカーを使用してオブジェクト モデルを取得する新しいデモ
  • rgbd-multikinect の簡易キャリブレーション モード
  • rgbd-multikinect でのグラブが大幅に高速化
  • ディスクへの保存時にタイムスタンプとカメラのシリアル番号を追加
  • PCL 1.4 との互換性 さまざまなバグ修正

従うべき非常に良い本は、Jason McKesson のLearning Modern 3D Graphics Programmingです。Kinect の ROS ページと Nicolas のKinect キャリブレーション ページも読むことができます。

于 2013-03-26T14:39:18.930 に答える