我的任务是这样的,我有一个ARPointCloud,里面有一堆3D点,我想从摄像机/屏幕的Angular ,基于2D帧来选择它们。我正在考虑将2D帧转换为3D平截头体,并检查3D平截头体框所在的点,不确定这是否是理想的方法,甚至不确定如何做到这一点。有人知道如何做到这一点或有一个更好的方法来实现这一点吗?
nxagd54h1#
给定ARKit框架W x H和camera intrinsics的大小,我们可以为视锥侧面创建平面。
例如,使用C++ / Eigen,我们可以构建四个平面(通过原点)如下:
std::vector<Eigen::Vector3d> _frustumPlanes; frustumPlanes.emplace_back(Eigen::Vector3d( fx, 0, cx - W)); frustumPlanes.emplace_back(Eigen::Vector3d(-fx, 0, -cx)); frustumPlanes.emplace_back(Eigen::Vector3d( 0, fy, cy - H)); frustumPlanes.emplace_back(Eigen::Vector3d( 0, -fy, -cy));
然后,我们可以通过检查3D点相对于 z〈0 半空间和平截头体的四条边的位置来裁剪3D点:
auto pointIsVisible = [&](const Eigen::Vector3d& P) -> bool { if (P.z() >= 0) return false; // behind camera for (auto&& N : frustumPlanes) { if (P.dot(N) < 0) return false; // outside frustum plane } return true; };
请注意,最好在3D中执行此剪切(投影前 *),因为相机后面或附近的点或远离平截头体的点可能具有不稳定的投影值 (u,v)。
1条答案
按热度按时间nxagd54h1#
给定ARKit框架W x H和camera intrinsics的大小,我们可以为视锥侧面创建平面。
例如,使用C++ / Eigen,我们可以构建四个平面(通过原点)如下:
然后,我们可以通过检查3D点相对于 z〈0 半空间和平截头体的四条边的位置来裁剪3D点:
请注意,最好在3D中执行此剪切(投影前 *),因为相机后面或附近的点或远离平截头体的点可能具有不稳定的投影值 (u,v)。