我遵循http://opencv.willowgarage.com/wiki/Posit教程在OpenCV中练习POSIT算法

我的目标是估计3D对象的姿势,尤其是解决未知的深度问题。在本教程中,它的立方体边为10mm。

部分代码:

std::vector<CvPoint2D32f> projectedPoints;
...
CvMat poseMatrix = cvMat( 4, 4, CV_32F, pose );  // pose moves object coord. to camera coord.
for ( size_t  p=0; p<modelPoints.size(); p++ )
{
    float modelPoint[] =  { modelPoints[p].x, modelPoints[p].y, modelPoints[p].z, 1.0f };
    CvMat modelPointMatrix = cvMat( 4, 1, CV_32F, modelPoint );
    float point3D[4];
    CvMat point3DMatrix = cvMat( 4, 1, CV_32F, point3D )
    //Transform the points from model space coordinates to camera space
    //The pose must be transposed because is in OpenGL format
    cvGEMM( &poseMatrix, &modelPointMatrix, 1.0, NULL, 0.0, &point3DMatrix, CV_GEMM_A_T );
    //Project the transformed 3D points
    CvPoint2D32f point2D = cvPoint2D32f( 0.0, 0.0 );
    if ( point3D[2] != 0 )
    {
            point2D.x = cvmGet( intrinsics, 0, 0 ) * point3D[0] / point3D[2]; // this is fx * X/Z
            point2D.y = cvmGet( intrinsics, 1, 1 ) * point3D[1] / point3D[2]; // this is fy * Y/Z
    }
    projectedPoints.push_back( point2D );
}

根据等式,Z是已知的。 POSIT如何解决未知深度?或在本教程中解决?

任何想法,请!

最佳答案

cvPOSIT估计摄像机和模型的坐标系之间的平移(X,Y,Z)和旋转 vector 。您发布的代码使用位姿矩阵计算模型点的投影。在本教程中,该函数与模型的实际姿势(在实际场景中未知)和POSIT估算的姿势一起使用,以便比较两个投影。
cvGEMS仅以一个矩阵乘法执行点变换(R * p + T)。请注意,模型点p具有4个坐标(x,y,z,1)。

07-27 19:06