计算转换以在透视视图中获取边界框

时间:2018-04-21 10:38:11

标签: opengl 3d point-cloud-library perspectivecamera

此问题并非完全取决于point cloud library。相反,它是一个计算机图形问题。

鉴于包含球的场景的透视图,我们需要获得该球的边界框。请参阅下面的示例图 -

sample figure showing perspective view

如果投射黄色球,则可以通过两个对角点s1s2定义边界矩形。这些点的3D坐标由以下程序定义 -

  1. PCLVisualizer
  2. 中可视化点云
  3. 使用专门针对此视图的两个对角点定义2D边界框,并使用registerPointPickingCallback()回调函数获取点的3D坐标
  4. 通过比较对角线
  5. 来定义最小和最大xy坐标
  6. 根据实验设置
  7. 定义最小和最大z坐标

    根据以上程序,我发现s1s2的3D坐标如下所示。

    Point s1: (0.774406, 0.295306, 2.703) 
    Point s2: ( 1.37865, 0.845276, 2.834) 
    

    通过比较s1s2,定义了一个框并使用了addCube,但它不起作用。请参阅下面以不同摄像机角度拍摄的输出的两个屏幕截图 -

    output of box filter

    以下是代码段 -

    double x_min = 0.774406, x_max = 1.37865;
    double y_min = 0.295306, y_max = 0.845276;
    double z_min = 0.2,      z_max = 3.0;
    
    pcl::visualization::PCLVisualizer viewer("Cloud Viewer");
    viewer.setCameraParameters(camera);
    viewer.addCube(x_min, x_max, y_min, y_max, z_min, z_max, 1, 0, 0, "bounding_box"); 
    

    幸运的是,addCube函数有另一个定义,它提供了一种应用平移和旋转的方法。

    我的问题是,使用这两个点,即s1s2以及camera,如何定义转换,以便边界框包含球。

    以下是下载所有必需文件的链接,以便运行项目 -

    1. bounding_box.cpp:CPP文件
    2. scene.pcd:上述CPP代码中使用的捕获的PCD文件
    3. camera.cam:上述CPP代码中使用的相机文件
    4. 依赖关系:PCL 1.8

0 个答案:

没有答案