私は 3D ポーズ推定システムに取り組んでいます。OpenCV の関数 cvPosit を使用して、回転行列と並進ベクトルを計算しました。
回転行列の角度も必要ですが、アルゴリズムが機能していないようです。
関数 cv::RQDecomp3x3() は、トピック「opencv : POSIT 回転行列からヨー、ロール、ピッチを取得する方法」の回答でしたが、関数は射影行列の 3x3 行列を必要とするため、機能しません。
さらに、以下のリンクからアルゴリズムを使用しようとしましたが、何も機能しませんでした。
visionopen.com/cv/vosm/doc/html/recognitionalgs_8cpp_source.html
stackoverflow.com/questions/16266740/in-opencv-how-to-get-yaw-roll-pitch-from-posit-rotation-matrix
quad08pyro.groups.et.byu.net/vision.htm
stackoverflow.com/questions/13565625/opencv-c-posit-why-are-my-values-always-nan-with-small-focal-lenght
www.c-plusplus.de/forum/308773-full
最も一般的な Posit チュートリアルと独自の例を Blender で使用したので、画像をレンダリングして画像ポイントを取得し、正確な角度を知ることができました。Blender のオブジェクトの Z 軸が 10 度回転しました。Blender と OpenCV の間で Axis が変更されたため、3 つの軸すべてのすべての角度を確認しました。
double focalLength = 700.0;
CvPOSITObject* positObject;
std::vector<CvPoint3D32f> modelPoints;
modelPoints.push_back(cvPoint3D32f(0.0f, 0.0f, 0.0f));
modelPoints.push_back(cvPoint3D32f(CUBE_SIZE, 0.0f, 0.0f));
modelPoints.push_back(cvPoint3D32f(0.0f, CUBE_SIZE, 0.0f));
modelPoints.push_back(cvPoint3D32f(0.0f, 0.0f, CUBE_SIZE));
std::vector<CvPoint2D32f> imagePoints;
imagePoints.push_back( cvPoint2D32f( 157,372) );
imagePoints.push_back( cvPoint2D32f(423,386 ));
imagePoints.push_back( cvPoint2D32f( 157,108 ));
imagePoints.push_back( cvPoint2D32f(250,337));
// Moving the points to the image center as described in the tutorial
for (int i = 0; i < imagePoints.size();i++) {
imagePoints[i] = cvPoint2D32f(imagePoints[i].x -320, 240 - imagePoints[i].y);
}
CvVect32f translation_vector = new float[3];
CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER,iterations, 0.1f);
positObject = cvCreatePOSITObject( &modelPoints[0], static_cast<int>(modelPoints.size()));
CvMatr32f rotation_matrix = new float[9];
cvPOSIT( positObject, &imagePoints[0], focalLength, criteria, rotation_matrix, translation_vector );
algorithms to get angles...
私はすでにラジアンから度および時計回りに結果を計算しようとしましたが、OpenCV の cvPosit の回転行列を使用して既に悪い結果を得ています。また、間違ったフォーマットをチェックするためにマトリックスフォーマットを変更しました...
私は単純な回転行列を使用しました.x軸、y軸、z軸の回転のみを行い、いくつかのアルゴリズムが機能しました。cvPosit の回転行列は、そのアルゴリズムでは機能しませんでした。
サポートに感謝します。