2

2 つのカメラで OpenCV 2.3.1 を使用して 2 つのオブジェクト間の距離を特定しようとしていますが、オブジェクトの objectPoints (OCV 2.3.1、MSVC++、Windows 7) を計算できません。これは、視差が計算される前に画像ポイントが修正されていないためだと思います。

I. 私が最初にすること

ステップ 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 からの画像の 1 つのオブジェクトのイメージ ポイントの歪みを修正して修正しようとしています (このプロセスを 2 回行います。1 回目はクレイ ハトがランチャーに乗っているとき、もう 1 回はクレイ ハトの前のフレームです)。崩壊する)

方法: initUndistortRectifyMap を使用してから Remap を使用する必要はないと思いますが、代わりに undistortPoints を使用することができます。undistortPoints は、関心のある点を歪ませずに修正すると思います。

III. 次にやること

私の信念が正しくない場合は、これを無視してかまいません。

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); 

undistortPoint の入力配列と出力配列 (launcherC1、launcherC1Undistorted、...、clayPigeonC2、clayPigeonC2Undistorted) は、Point2f オブジェクトのベクトルです。

IV. 信念と現実の不一致

すべての undistortPoints 関数が実行された後、

  1. launcherC1Undisorted.y は launcherC2Undistorted.y と等しくありません
  2. clayPigeonC1Undistorted.yはclayPigeonC2Undistorted.yと等しくない。

それらは最大 30% 異なります。

V. 質問

  1. Q1 undistortPoints はポイントの歪みを直すだけでなく、ポイントも修正しますか?
  2. Q1.1_はい。整流後に y の値は等しいはずですか?
  3. Q1.1.1_yes 含まれているコードから、私が間違っていることを教えてくれますか?
  4. Q1_no undistortPoints でポイントが修正されない場合、どうすれば修正できますか?
4

1 に答える 1