2

我试图通过使用带有两个摄像头的 OpenCV 2.3.1 来确定两个对象之间的距离,但无法计算对象的 objectPoints(OCV 2.3.1、MSVC++、Windows 7)。我认为这是因为图像点在计算视差之前没有被纠正。

一、我首先做什么

步骤 1. 自行校准每台相机

int numSquares = numCornersHor * numCornersVer;
Size board_sz = Size(numCornersHor, numCornersVer);

Mat cameraMatrix = Mat(3, 3, CV_32FC1);
Mat distCoeffs;

vector<Mat> rvecs, tvecs;

cameraMatrix.ptr<float>(0)[0] = 1;
cameraMatrix.ptr<float>(1)[1] = 1;

calibrateCamera(object_points, 
       image_points, 
       image.size(), 
       cameraMatrix, distCoeffs, 
       rvecs, tvecs);

步骤 2. 一起校准相机

int numCornersHor = 4;
int numCornersVer = 3;
const float squareSize = 1.75;

Size imageSize = Size(numCornersHor, numCornersVer);
int numSquares = numCornersHor * numCornersVer;

for(int i = 0; i < pairs; i++ )
{
for( int j = 0; j < imageSize.height; j++ )
{
    for( int k = 0; k < imageSize.width; k++ )
    {
                    objectPoints[i].push_back(Point3f(j*squareSize, k*squareSize, 0));
    }
}
}

Mat R, T, E, F;

rms = stereoCalibrate(  objectPoints, 
                          imagePoints[0],   imagePoints[1],
        cameraMatrix[0],    distCoeffs[0],
        cameraMatrix[1],    distCoeffs[1],
        imageSize, 
        R,  T,  E,  F,
        TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),
        CV_CALIB_FIX_ASPECT_RATIO +
        CV_CALIB_ZERO_TANGENT_DIST +
        CV_CALIB_SAME_FOCAL_LENGTH +
        CV_CALIB_RATIONAL_MODEL +
        CV_CALIB_FIX_K3 +   CV_CALIB_FIX_K4 +   CV_CALIB_FIX_K5
        );

步骤 3. 创建整改数据

  stereoRectify(
        cameraMatrix[0],    cameraMatrix[1], 
        distCoeffs[0],  distCoeffs[1],
                  imageSize, 
        R, T, 
        RC1, RC2,  //RC1: Rotation matrix Camera 1
        PC1, PC2, 
        Q,
            CALIB_ZERO_DISPARITY, 
        1,  
        imageSize);

二、我相信什么

目标:我正在尝试对来自相机 1 的图像和来自相机 2 的图像中一个物体的图像点进行不失真和校正(我执行此过程两次:一次是在粘土鸽子在发射器上时,一次是在粘土鸽子之前的一帧解体)

方法:我相信我不需要使用 initUndistortRectifyMap 然后 Remap 而是可以只使用 undistortPoints。我认为 undistortPoints 不扭曲兴趣点并纠正它们。

三、我要做的第二件事

如果我的信念不正确,您可以忽略这一点。

undistortPoints(launcherC1, launcherC1Undistorted, cameraMatrixC1, distCoeffsC1, R1, P1);   
undistortPoints(launcherC2, launcherC2Undistorted, cameraMatrixC2, distCoeffsC2, R2, P2);   

undistortPoints(clayPigeonC1, clayPigeonC1Undistorted, cameraMatrix1, distCoeffs1, R1, P1);
undistortPoints(clayPigeonC2, clayPigeonC2Undistorted, cameraMatrix2, distCoeffs2, R2, P2); 

undistortPoints 的输入和输出数组(launcherC1、launcherC1Undistorted、...clayPigeonC2、clayPigeonC2Undistorted)是 Point2f 对象的向量。

四。信仰与现实的差异

运行所有 undistortPoints 函数后,

  1. launcherC1Undistorted.y 不等于 launcherC2Undistorted.y
  2. ClayPigeonC1Undistorted.y 不等于 ClayPigeonC2Undistorted.y。

它们的差异高达 30%。

五、问题

  1. Q1 除了不扭曲它们之外, undistortPoints 是否还可以校正点?
  2. Q1.1_是的。修正后 y 的值是否应该相等?
  3. Q1.1.1_yes 你能从代码中看出我做错了什么,所以他们没有吗?
  4. Q1_no 如果 undistortPoints 没有纠正这些点,那么我该如何纠正它们?
4

1 回答 1

0
  1. undistortPoints无法校正点,因为您从未为其提供校正所需的参数 - 那是相机与其他相机的姿势关系。
  2. 当您以正确的方式进行校正时,stereoCalibrate+ initUndistortRectifyMap+ remap,然后是 - 对应点的 y 值将相同。
于 2015-10-23T15:01:50.123 回答