首页 > 解决方案 > 使用 OpenCV 将 3D 点投影到不失真的 ROI

问题描述

假设我有一台已使用完整相机帧校准的相机,以获得相机矩阵和失真系数。另外,假设我在该相机的框架中表达了一个 3D 世界点。

我知道我可以使用cv::projectPoints()with rvec=tvec=(0,0,0)、相机矩阵和失真系数将点投影到(完整)失真帧。我也知道,如果我从相机接收到 ROI(这是完整失真帧的裁剪部分),我可以简单地通过从(x,y)结果中减去 ROI 左上角的坐标来调整 ROI cv::projectPoints()。最后,我知道如果我使用cv::projectPoints()with rvec=tvec=(0,0,0)、相机矩阵和零失真系数,我可以将点投影到完整的未失真帧(如果我错了,请纠正我,但我认为这需要您使用相同的相机矩阵cv::undistort()并且不要使用newCameraMatrix)。

我如何处理我想投影到我收到的 ROI 的未失真版本的情况(即我得到一个(失真的)ROI,然后使用此处cv::undistort()描述的方法使用它以说明它是一个 ROI 的事实,然后我想将 3D 点投影到生成的图像上)?

如果有更好的方法来解决这一切,我也愿意接受建议。我的目标是,我希望能够将 3D 点投影到失真和未失真的帧,无论是否存在 ROI,其中 ROI 始终最初由来自相机的馈送定义,因此始终在失真帧中定义(即 4不同的情况:失真的全帧、失真的 ROI、未失真的全帧、失真 ROI 的未失真版本)。

标签: c++opencvcomputer-visioncamera-calibration

解决方案


推荐阅读