在OpenCV中使用POSIT算法

时间:2012-03-05 03:17:27

标签: opencv

我正在按照教程http://opencv.willowgarage.com/wiki/Posit

在OpenCV中练习POSIT算法

我的目标是估计3D物体的姿势,特别是解决未知的深度问题。在本教程中,它的立方体边长为10毫米。

部分代码:

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如何解决未知深度?或者在本教程中解决了?

请知道!

1 个答案:

答案 0 :(得分:1)

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