你如何在OpenCV中修复裁剪的立体图像?

3
我有一对水平对齐的立体相机,使用图像的全尺寸进行了校准。
我通过调用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的输出。

为了提高处理速度,图像在进行矫正之前将被裁剪(并可能被缩小),这意味着矫正过程无法使用完整的图像。

为使代码能够与裁剪(和缩小)图像后进行矫正,请作出哪些更改?


被分组了?那不会影响任何事情。校正不会重新调整像素值。至于裁剪和校正,我认为会重新调整图像,所以你需要仔细研究数学来弥补这一点。我怀疑这可能涉及阅读Hartley和Zisserman的书籍,还有可能需要阅读OpenCV源代码。我建议通过填充白色来“取消裁剪”,然后在校正之后再次进行裁剪。 - undefined
1个回答

2
如果您想裁剪和调整(缩放)原始的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,缩放和偏移可能不同。

别忘了使用新参数重新创建 map1map2 等地图,使用 initUndistortRectifyMap 方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接