Camera 姿势估计:确定旋转和变形矩阵是否正确

Camera 姿势估计:确定旋转和变形矩阵是否正确,camera,rotational-matrices,pose-estimation,opencv-solvepnp,Camera,Rotational Matrices,Pose Estimation,Opencv Solvepnp,最近,我正努力解决单台相机的姿势估计问题。我在图像上有一些3D点和相应的2D点。然后使用solvePnP得到旋转和平移向量问题是,如何确定向量是否为正确的结果 现在我使用一种间接的方法来实现这一点: 我使用旋转矩阵、平移向量和某个点的世界3D坐标来获得该点在相机系统中的坐标。然后我要做的就是确定坐标是否合理。我想我知道相机系统的x、y和z轴的方向 ========How Camera and the point be placed in the world space=============

最近,我正努力解决单台相机的姿势估计问题。我在图像上有一些3D点和相应的2D点。然后使用solvePnP得到旋转和平移向量问题是,如何确定向量是否为正确的结果

现在我使用一种间接的方法来实现这一点:
我使用旋转矩阵、平移向量和某个点的世界3D坐标来获得该点在相机系统中的坐标。然后我要做的就是确定坐标是否合理。我想我知道相机系统的x、y和z轴的方向

========How Camera and the point be placed in the world space=============
   |
   |              
Camera--------------------------> Z axis
   |                |} Xw?
   |                P(Xw, Yw, Zw)
   |              
   v x-axis     
     
  • 摄影机中心是摄影机系统的原点吗
  • 现在考虑这个点的x分量。x是否等于相机和世界空间中相机x轴方向上的点的距离(然后可以通过将点放置在相机的哪一侧来确定标志)
下图在世界空间中,而所示的轴在摄影机系统中

========How Camera and the point be placed in the world space=============
   |
   |              
Camera--------------------------> Z axis
   |                |} Xw?
   |                P(Xw, Yw, Zw)
   |              
   v x-axis     
     

我的rvec和tvec结果似乎是对的和错的。对于一个指定的点,z值似乎是合理的,我的意思是,如果这个点在z方向上距离相机大约一米,那么z值大约是1。但是对于x和y,根据点的位置,我认为x和y应该是正的,但是它们是负的。此外,在原始图像中检测到的图案如下所示:

但使用相机系统中计算的点坐标和相机的固有参数,我得到了如下图像:


目标保持其模式。但它从右下角移动到左上角。我不明白为什么。

是的,相机中心是相机坐标系的原点,它似乎正好跟在后面

在摄像机姿态估计的情况下,该值似乎是合理的,可以命名为反投影误差。这是对结果旋转和平移将3D点映射到2D像素的效果的度量。不幸的是,solvePnP不返回残差度量。因此,我们必须计算它:

cv::solvePnP(worldPoints, pixelPoints, camIntrinsics, camDistortion, rVec, tVec);

// Use computed solution to project 3D pattern to image
cv::Mat projectedPattern;
cv::projectPoints(worldPoints, rVec, tVec, camIntrinsics, camDistortion, projectedPattern);

// Compute error of each 2D-3D correspondence.
std::vector<float> errors;
for( int i=0; i < corners.size(); ++i)
{
    float dx = pixelPoints.at(i).x - projectedPattern.at<float>(i, 0);
    float dy = pixelPoints.at(i).y - projectedPattern.at<float>(i, 1);
    // Euclidean distance between projected and real measured pixel
    float err = sqrt(dx*dx + dy*dy); 

    errors.push_back(err);
}

// Here, compute max or average of your "errors"
cv::solvePnP(世界点、像素点、camIntrinsics、Cam畸变、rVec、tVec);
//使用计算解决方案将三维图案投影到图像
cv::Mat projectedPattern;
cv::projectPoints(worldPoints、rVec、tVec、camIntrinsics、Cam畸变、projectedPattern);
//计算每个2D-3D对应的误差。
向量误差;
对于(int i=0;i
校准相机的平均反投影误差可能在0-2像素范围内。根据你的两张照片,这将是更多。在我看来,这似乎是一个缩放问题。如果我是对的,你自己计算投影。也许您可以尝试一次cv::projectPoints()并进行比较


当涉及到转换时,我学会了不跟随我的想象:)我对返回的rVec和tVec所做的第一件事通常是用它创建一个4x4刚性转换矩阵(我发布了一次代码)。这使得事情变得更加不直观,但它是紧凑和方便的。

是的,相机中心是相机坐标系的原点,它似乎正跟随着

在摄像机姿态估计的情况下,该值似乎是合理的,可以命名为反投影误差。这是对结果旋转和平移将3D点映射到2D像素的效果的度量。不幸的是,solvePnP不返回残差度量。因此,我们必须计算它:

cv::solvePnP(worldPoints, pixelPoints, camIntrinsics, camDistortion, rVec, tVec);

// Use computed solution to project 3D pattern to image
cv::Mat projectedPattern;
cv::projectPoints(worldPoints, rVec, tVec, camIntrinsics, camDistortion, projectedPattern);

// Compute error of each 2D-3D correspondence.
std::vector<float> errors;
for( int i=0; i < corners.size(); ++i)
{
    float dx = pixelPoints.at(i).x - projectedPattern.at<float>(i, 0);
    float dy = pixelPoints.at(i).y - projectedPattern.at<float>(i, 1);
    // Euclidean distance between projected and real measured pixel
    float err = sqrt(dx*dx + dy*dy); 

    errors.push_back(err);
}

// Here, compute max or average of your "errors"
cv::solvePnP(世界点、像素点、camIntrinsics、Cam畸变、rVec、tVec);
//使用计算解决方案将三维图案投影到图像
cv::Mat projectedPattern;
cv::projectPoints(worldPoints、rVec、tVec、camIntrinsics、Cam畸变、projectedPattern);
//计算每个2D-3D对应的误差。
向量误差;
对于(int i=0;i
校准相机的平均反投影误差可能在0-2像素范围内。根据你的两张照片,这将是更多。在我看来,这似乎是一个缩放问题。如果我是对的,你自己计算投影。也许您可以尝试一次cv::projectPoints()并进行比较


当涉及到转换时,我学会了不跟随我的想象:)我对返回的rVec和tVec所做的第一件事通常是用它创建一个4x4刚性转换矩阵(我发布了一次代码)。这使得事情变得更加不直观,但它却紧凑方便。

现在我知道答案了


  • 是的,摄影机中心是摄影机坐标系的原点

  • 假设摄像机系统中的坐标计算为(xc,yc,zc)。那么xc应该是摄像机和摄像机之间的距离 现实世界中x方向上的点

接下来,如何确定输出矩阵是否正确?
1.正如@eidelen所指出的,反投影误差是一种指示性度量。
2.根据点在世界坐标系中的坐标和矩阵计算点的坐标

那么,为什么我得到了一个错误的结果(模式仍然存在,但移动到了另一个不同的区域)