opencv:不扭曲图像的一部分
opencv: undistort part of the image
我想了解如何仅在图像的子集上应用 cv2.undistort
函数。
相机校准是通过 cv2.findChessboardCorner
完成的,它似乎工作正常。然而,我发现不失真非常慢,在 1080x1920 图像上平均约为 9 fps。出于项目的目的,我只对图像的固定子集感兴趣,通常类似于 img[100:400]
.
解决这个问题的好方法是什么?仅在需要 100 像素的条纹时才对整个图像进行反失真似乎是一种浪费。
来自docs:
The function is simply a combination of cv::initUndistortRectifyMap (with unity R ) and cv::remap (with bilinear interpolation). See the former function for details of the transformation being performed.
因此,通过在循环中调用 undistort,您将一遍又一遍地重新计算 un-distortion 映射 - 没有缓存,并且它们的计算非常昂贵,因为它涉及为每个像素求解多项式方程。 IIUC 你的校准是固定的,所以你应该只使用 initUndistortRectifyMap() 计算一次它们,然后将映射传递给主循环中的 remap()。
您描述的 "cropping" 是可行的,但它可能需要一些工作和少量实验,因为 OpenCV 使用的无失真图与未失真图像 1:1 对应,并且存储像素(矢量)偏移量。这意味着您需要裁剪出与您关心的图像矩形相对应的贴图部分,然后编辑它们的值,即从未失真图像到失真图像的 x 和 y 偏移量。具体来说,您需要对它们应用二维平移的逆过程,将您关心的矩形带到图像的左上角 canvas。然后你应该能够调用 remap() 作为目标图像传递只是一个空图像,大小为未失真的裁剪矩形。
总而言之,我会先尝试第一个建议(不要调用undistort,将地图生成与重新映射分开),如果实在跟不上帧率,才尝试第二个步骤。
我想了解如何仅在图像的子集上应用 cv2.undistort
函数。
相机校准是通过 cv2.findChessboardCorner
完成的,它似乎工作正常。然而,我发现不失真非常慢,在 1080x1920 图像上平均约为 9 fps。出于项目的目的,我只对图像的固定子集感兴趣,通常类似于 img[100:400]
.
解决这个问题的好方法是什么?仅在需要 100 像素的条纹时才对整个图像进行反失真似乎是一种浪费。
来自docs:
The function is simply a combination of cv::initUndistortRectifyMap (with unity R ) and cv::remap (with bilinear interpolation). See the former function for details of the transformation being performed.
因此,通过在循环中调用 undistort,您将一遍又一遍地重新计算 un-distortion 映射 - 没有缓存,并且它们的计算非常昂贵,因为它涉及为每个像素求解多项式方程。 IIUC 你的校准是固定的,所以你应该只使用 initUndistortRectifyMap() 计算一次它们,然后将映射传递给主循环中的 remap()。
您描述的 "cropping" 是可行的,但它可能需要一些工作和少量实验,因为 OpenCV 使用的无失真图与未失真图像 1:1 对应,并且存储像素(矢量)偏移量。这意味着您需要裁剪出与您关心的图像矩形相对应的贴图部分,然后编辑它们的值,即从未失真图像到失真图像的 x 和 y 偏移量。具体来说,您需要对它们应用二维平移的逆过程,将您关心的矩形带到图像的左上角 canvas。然后你应该能够调用 remap() 作为目标图像传递只是一个空图像,大小为未失真的裁剪矩形。
总而言之,我会先尝试第一个建议(不要调用undistort,将地图生成与重新映射分开),如果实在跟不上帧率,才尝试第二个步骤。