我有一副水平对准的立体摄像机,它们是使用图像的全部尺寸进行校准的。
我正在通过调用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.stereoCalibrate
和cv2.stereoRectify
的输出
但是,为了提高处理速度,在处理图像之前,将对其进行裁剪(并可能进行装仓),然后再进行校正。这意味着校正过程无法使用图像的全部大小。
在纠正完成之前,需要进行哪些更改才能使代码用于裁剪(和合并)图像?
答案 0 :(得分:0)
如果您要裁剪和调整(缩放)原始的img1
和img2
并在校准后使用,则需要更改camera_matrix_1
和camera_matrix_2
。裁切会更改主点,比例会更改焦距。但是rectified1
和rectified2
的结果(输出)将不会更改其大小:w, h
。如果要缩小输出图像,则需要更改P1
和P2
。
z 0 sx
0 z sy * camera_matrix -> camera_matrix'
0 0 1
分别是z
-比例因子,s
-裁剪图像中心的偏移。 camera_matrix
和P
的缩放和移位可能不同。
不要忘记使用带有新参数的map1
重新创建map2
,initUndistortRectifyMap
...。