如何在OpenCV中校正裁剪的立体图像?

时间:2018-12-10 08:28:59

标签: python opencv image-processing computer-vision camera-calibration

我有一副水平对准的立体摄像机,它们是使用图像的全部尺寸进行校准的。

我正在通过调用cv2.initUndistortRectifyMap来获取每个摄像机的地图,然后进行cv2.remap进行校正

使用全尺寸图片时,外观如下:

map1, map2 = cv2.initUndistortRectifyMap(camera_matrix_1, dist_coeffs_1, R1, P1, (w, h), cv2.CV_16SC2)
map3, map4 = cv2.initUndistortRectifyMap(camera_matrix_2, dist_coeffs_2, R2, P2, (w, h), cv2.CV_16SC2)
rectified1 = cv2.remap(img1, map1, map2, cv2.INTER_LINEAR)
rectified2 = cv2.remap(img2, map3, map4, cv2.INTER_LINEAR)

cv2.initUndistortRectifyMap的参数是cv2.stereoCalibratecv2.stereoRectify的输出

但是,为了提高处理速度,在处理图像之前,将对其进行裁剪(并可能进行装仓),然后再进行校正。这意味着校正过程无法使用图像的全部大小。

在纠正完成之前,需要进行哪些更改才能使代码用于裁剪(和合并)图像?

1 个答案:

答案 0 :(得分:0)

如果您要裁剪和调整(缩放)原始的img1img2并在校准后使用,则需要更改camera_matrix_1camera_matrix_2。裁切会更改主点,比例会更改焦距。但是rectified1rectified2的结果(输出)将不会更改其大小:w, h。如果要缩小输出图像,则需要更改P1P2

z 0 sx
0 z sy * camera_matrix  ->  camera_matrix'
0 0 1 

分别是z-比例因子,s-裁剪图像中心的偏移。 camera_matrixP的缩放和移位可能不同。 不要忘记使用带有新参数的map1重新创建map2initUndistortRectifyMap...。