2016-12-21 23 views
-1

私は、openglの透視投影行列を正しく得るために苦労しています。 opencvを使って、私は完全にマーカーの上に立方体(赤いワイヤメッシュ)を重ねることができます。しかし、投稿(http://www.morethantechnical.com/2015/02/17/augmented-reality-on-libqglviewer-and-opencv-opengl-tips-wcode/)のopencv-opengl透視投影を次のように適用すると、マーカーに固体キューブがオーバーレイされますが、マーカーを回転すると、固体キューブはマーカーからゆっくりとシフトします(https://www.youtube.com/watch?v=m87qAZcN6c4&feature=youtu.be).The赤キューブWiremeshの)OpenCVのを使用して描かれた、それは完全にオーバーレイされる。OpenCVのOpenGL透視投影行列わずかな誤差

// perspective projection matrix************************* 
double fx = intrinsic_matrix.at<double>(0,0); 
double fy = intrinsic_matrix.at<double>(1,1); 
double cx = intrinsic_matrix.at<double>(0,2); 
double cy = intrinsic_matrix.at<double>(1,2); 
projection.at<double>(0,0) = fx/cx; 
projection.at<double>(1,1) = fy/cy; 
projection.at<double>(2,2) = -(far+near)/(far-near); 
projection.at<double>(2,3) = -2.0*far*near/(far-near); 
projection.at<double>(3,2) = -1.0; 

projection = projection.t(); 

// modelview matrix ********************************************** 
modelview.at<double>(0,0) = rotation.at<double>(0,0); 
modelview.at<double>(1,0) = rotation.at<double>(1,0); 
modelview.at<double>(2,0) = rotation.at<double>(2,0); 
modelview.at<double>(3,0) = 0; 

modelview.at<double>(0,1) = rotation.at<double>(0,1); 
modelview.at<double>(1,1) = rotation.at<double>(1,1); 
modelview.at<double>(2,1) = rotation.at<double>(2,1); 
modelview.at<double>(3,1) = 0; 

modelview.at<double>(0,2) = rotation.at<double>(0,2); 
modelview.at<double>(1,2) = rotation.at<double>(1,2); 
modelview.at<double>(2,2) = rotation.at<double>(2,2); 
modelview.at<double>(3,2) = 0; 

modelview.at<double>(0,3) = tvecs.at<double>(0); 
modelview.at<double>(1,3) = tvecs.at<double>(1); 
modelview.at<double>(2,3) = tvecs.at<double>(2); 
modelview.at<double>(3,3) = 1; 

// This matrix corresponds to the change of coordinate systems. 
static double changeCoordArray[4][4] = {{1, 0, 0, 0}, {0, -1, 0, 0}, {0, 0, -1, 0}, {0, 0, 0, 1}}; 
static Mat changeCoord(4, 4, CV_64FC1, changeCoordArray); 

modelview = changeCoord*modelview; 
modelview = modelview.t(); 

誰もが、私はこの問題を解決する手助けすることはできますか?ここに私のコードは)http://pastebin.com/2MkQvkdN(である。

+1

透視投影行列に問題はありますか?どちらの立方体も同様の視点で見えます。私は問題があなたのmodelview行列と座標系の変更にあると思う。 – Harish

答えて

0

私はこれの原因は、あなたがそれぞれを比較しているということだと思いますフレームを前のフレームと比較して、立体キューブがどこに移動するかを決定します。この場合、各フレームを最初のフレームと比較して、キューブの動き方これはこの数値的なドリフトを取り除くはずです。または、黒と白のマーカーを検出した場所に基づいて、個々のフレームごとにソリッドキューブを配置することもできます。

関連する問題