我正在按照教程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如何解决未知深度?或者在本教程中解决了?
请知道!
答案 0 :(得分:1)
cvPOSIT估算相机和模型坐标系之间的平移(X,Y,Z)和旋转矢量。您发布的代码使用姿势矩阵计算模型点的投影。在本教程中,该函数与模型的真实姿势(在实际场景中未知)和POSIT估计的姿势一起使用,以便比较两个投影。 cvGEMS仅在一次矩阵乘法中执行点变换(R * p + T)。注意,模型点p有4个坐标(x,y,z,1)。