1

OpenCV を使用して、ステレオ システムの調整と調整を行っています。私は収束の目を持つステレオ カメラを持っています。実際には、これらの関数を次の順序で実行しています。

for(int j=0; j < ChessBoard.numSquares; j++)
    obj.push_back(Point3f((j/ChessBoard.numCornersHor)*ChessBoard.squareDim, (j%ChessBoard.numCornersHor)*ChessBoard.squareDim, 0.0f));
[...]

次に、取得したい画像の数についてこれをループします

found_L = findChessboardCorners(image_L, ChessBoard.board_sz, corners_L, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FILTER_QUADS + CALIB_CB_FAST_CHECK);
found_R= findChessboardCorners(image_R, ChessBoard.board_sz, corners_R, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FILTER_QUADS + CALIB_CB_FAST_CHECK);
found = found_L && found_R;
if(found)
  { 
    cornerSubPix(image_L, corners_L, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
    cornerSubPix(image_R, corners_R, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
    drawChessboardCorners(image_L, ChessBoard.board_sz, corners_L, found);
    drawChessboardCorners(image_R, ChessBoard.board_sz, corners_R, found);

    image_points[0].push_back(corners_L);
    image_points[1].push_back(corners_R);
    object_points.push_back(obj);
    printf("Right: coordinates stored\n");
    printf("Left: coordinates stored\n");
  }

このブロックの後、これを 2 つと呼びます。

cameraMatrix[0] = Mat::eye(3, 3, CV_64F);
cameraMatrix[1] = Mat::eye(3, 3, CV_64F);

calibrateCamera(object_points, image_points[0], imageSize, cameraMatrix[0], distCoeffs[0], rvecs_L, tvecs_L);

calibrateCamera(object_points, image_points[1], imageSize, cameraMatrix[1], distCoeffs[1], rvecs_R, tvecs_R);

その後:

rms = stereoCalibrate(object_points, image_points[0], image_points[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_FIX_INTRINSIC);

最後に:

stereoRectify(cameraMatrix[0], distCoeffs[0],
                  cameraMatrix[1], distCoeffs[1],
                  imageSize, R, T, R1, R2, P1, P2, Q,
                  CALIB_ZERO_DISPARITY, -1, imageSize, &roi1, &roi2 );

initUndistortRectifyMap(cameraMatrix[0], distCoeffs[0], R1, P1, imageSize, CV_16SC2, map11, map12);
initUndistortRectifyMap(cameraMatrix[1], distCoeffs[1], R2, P2, imageSize, CV_16SC2, map21, map22);
remap(imgL, imgL, map11, map12, INTER_LINEAR,BORDER_CONSTANT, Scalar());
remap(imgR, imgR, map21, map22, INTER_LINEAR,BORDER_CONSTANT, Scalar());

これは基本的に私が行っていることですが、画像に非常に大きな黒い領域があるため、結果は非常に悪いです. 以下に例を示します。

OpenCVから離れた

そして、これは私が取得しなければならない修正画像です。これは、カメラから直接修正されたものです。

カメラから左

ご覧のとおり、画像は右側で翻訳されてカットされているように見えます。右側は同じですが、左側で翻訳され、結果はほぼ同じです。

では、どうすれば最後の結果と同様のより良い結果を得ることができますか? 問題はどこだ?追加のデータとして、rms が約 0.4 とあまり良くないことに気付きました。再投影エラーは約 0.2 です。もう少し低くする必要があることはわかっていますが、パターン、照明、照明を変えて何度も試しました。など、キャリブレーション中ですが、私は常に同じ結果、または最悪の場合さえも取ります。

4

1 に答える 1