我试图了解如何仅对图像的子集应用ViewRef
函数。
相机校准是通过cv2.undistort
完成的,似乎工作正常。然而,我发现不成比例非常慢,在1080x1920图像上平均大约9 fps。出于项目的目的,我只对图像的固定子集感兴趣,通常类似于cv2.findChessboardCorner
。
解决这个问题的好方法是什么?仅当需要100像素的条纹时,对整个图像不起眼似乎是浪费的。
答案 0 :(得分:1)
来自docs:
该函数只是cv :: initUndistortRectifyMap(具有单位R)和cv :: remap(带双线性插值)的组合。有关正在执行的转换的详细信息,请参阅前一个函数。
因此,通过在循环中调用undistort,你会反复重新计算非失真映射 - 没有缓存,并且它们的计算很昂贵,因为它涉及求解每个像素的多项式方程。 IIUC你的校准是固定的,所以你应该只使用initUndistortRectifyMap()计算它们一次,然后将映射传递给主循环中的remap()。
"裁剪"你描述的是可行的,但它可能需要一些工作和很少的实验,因为OpenCV使用的非失真地图与未失真的图像1:1对应,并存储像素(矢量)偏移。这意味着您需要裁剪出与您关注的图像的矩形相对应的贴图部分,然后编辑它们的值,这些值是从未失真图像到失真图像的x和y偏移。具体来说,您需要向它们应用2D平移的反转,它将您关注的矩形带到图像画布的左上角。然后你应该能够调用remap()作为目标图像传递一个空图像,该图像是未失真的裁剪矩形的大小。
总而言之,我首先尝试第一个推荐(不要调用undistort,将地图生成与重新映射分开),如果真的无法跟上,请尝试第二步帧率。