1

次の OpenCV 関数を使用して、カメラのペアの出力の歪みを解消しようとしています。

cv::stereoCalibrate(object_points, image_points_left, image_points_right,cameraMatrixLeft, distCoeffsLeft, cameraMatrixRight, distCoeffsRight,cv::Size(sensor_width, sensor_height),R, T, E, F);

cv::stereoRectify(cameraMatrixLeft, distCoeffsLeft, cameraMatrixRight, distCoeffsRight, cv::Size(sensor_width, sensor_height), R, T, R1, R2, P1, P2, Q);

cv::undistortPoints(src_left, dst_left, cameraMatrixLeft, distCoeffsLeft, R1, P1);
cv::undistortPoints(src_right, dst_right, cameraMatrixRight, distCoeffsRight, R2, P2);

私が理解しているように、この関数cv::undistortPointsは行列R1R2P1およびP2ステレオ カメラの設定に従って出力を調整する必要があります。つまり、エピポーラ線を画像の y 軸に平行に設定し、画像をトリミングします。

これは正しいです?

ただし、src_leftおよびのポイントで実行されるマッピングsrc_rightは「傾斜」しています。つまり、歪みのない出力画像が傾斜し、画像の境界 (特に角の半分) に空白が残ります。この傾きは、回転行列に起因すると考えられR1R2z 軸を中心とした回転に対応しています。

ここに私の質問があります:

  • (修正された) 出力画像が画像空間全体を埋めないのはなぜですか?
4

1 に答える 1

2

修正および歪みの解消中に、ステレオ カメラの向きに応じて、画像を移動および/または回転させることができます。

明らかに、変換された画像の元の解像度をそのままにしておくと、境界の周りの情報が失われます。たとえば、平行移動はなく、画像の 1 つを時計回りに 45 度回転させ、同じ解像度を使用する必要があるとします。コーナーは「空白」になります。

一般的な解決策は、最大の「内接」長方形を見つけて、元の解像度に拡大することです。

initUndistortRectifyMapの代わりにそのために使用できますundistortPoints

このstereoRectify呼び出しの場合、 への呼び出しはinitUndistortRectifyMap次のようになります。

  • 左:initUndistortRectifyMap(cameraMatrixLeft, distCoeffsLeft, R1, P1, cv::Size(sensor_width, sensor_height), CV_32FC1, map_left_1, map_left_2);
  • 右:initUndistortRectifyMap(cameraMatrixRight, distCoeffsRight, R2, P2, cv::Size(sensor_width, sensor_height), CV_32FC1, map_right_1, map_right_2);

これにより、次の呼び出しのマップが取得されますremap

  • remap(left, left_rectified, map_left_1, map_left_2, INTER_LINEAR, BORDER_CONSTANT);
  • remap(right, right_rectified, map_right_1, map_right_2, INTER_LINEAR, BORDER_CONSTANT);
于 2014-11-11T09:09:36.910 に答える