2

我正在研究 3D 姿势估计系统。我使用 OpenCVs 函数 cvPosit 来计算旋转矩阵和平移向量。

我还需要旋转矩阵的角度,但似乎没有算法起作用。

函数 cv::RQDecomp3x3() 是主题“在 opencv 中:如何从 POSIT 旋转矩阵中获取 yaw、roll、pitch”的答案无法工作,因为该函数需要投影矩阵的 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 Tutorial 和一个自己的 Blender 示例,因此我可以渲染图像以检索图像点并知道确切的角度。Blender 中对象的 Z 轴旋转了 10 度 - 由于 Blender 和 OpenCV 之间的轴发生变化,我检查了所有 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 的旋转矩阵不适用于该算法。

我感谢任何支持。

4

0 回答 0