Xvisio SDK 深度
Xvisio 功能介绍和快速启动
Xvisio SDK 文档主页

SGBM 深度


1. 概述

Xvisio SeerSense™ DS80 系列模组产品可以支持 SGBM 深度算法也是被动双目视觉深度算法,其他产品可以参考对应的数据手册来确认是否支持。

2. 特性

2.1 分辨率

支持两种分辨率:

  • VGA:640*480
  • 720P:1280*720
    720P 分辨率的深度图像质量会高于 VGA 分辨率的图像质量,图像质量差异可以参考产品数据手册或询问 Xvisio FAE 人员。

分辨率类型定义:

enum class Resolution {
        SGBM_640x480   = 0,  ///< SGBM 480p
        SGBM_1280x720  = 1,  ///< SGBM 720p
    };

设置 API 示例:

device->sgbmCamera()->setSgbmResolution(xv::SgbmCamera::Resolution::SGBM_640x480);
2.2 配置

Xvisio SDK 提供了一些参数配置接口,配置结构定义:

/**
 * @brief SGBM CONFIG STRUCT
*/
struct sgbm_config
    {
        int32_t enable_dewarp;
        float dewarp_zoom_factor;
        int32_t enable_disparity;
        int32_t enable_depth;
        int32_t enable_point_cloud;
        float baseline;
        float fov;
        uint8_t disparity_confidence_threshold;
        float homography[9];
        int32_t enable_gamma;
        float gamma_value;
        int32_t enable_gaussian;
        uint8_t mode;//standard 0 /Default:LRcheck 1 /Extended 2 /Subpixel 3
        uint16_t max_distance;//mm
        uint16_t min_distance;//mm
    };

说明:

  1. “enable_dewarp” ,是否使能畸变纠正功能,默认使能, Xvisio 正式发布的产品都需要使能;值:0 关闭,1使能。
  2. “dewarp_zoom_factor”,畸变纠正因子,默认 1.0 ,Xvisio SeerSense™ DS80 系列模组产品设置为1.0 ,其他产品请参考数据手册或询问 Xvisio FAE 人员。
  3. “enable_disparity”,是否使能视差图像输出,默认关闭,工作态都关闭;值:0 关闭,1使能。
  4. “enable_depth”,是否使能深度图像输出,默认打开,工作态都打开;值:0 关闭,1使能。
  5. “enable_point_cloud”,是否使能点云数据输出,默认关闭,根据应用选择使能或关闭,如果打开点云的计算在 Xvisio 设备端 或者也可以选择关闭并调用SDK 的 API 做深度点云的转换;值:0 关闭,1使能。
  6. “baseline”,双目相机的基线,默认 0.08 ,Xvisio SeerSense™ DS80 系列模组产品设置为0.08 ,其他产品请参考数据手册或询问 Xvisio FAE 人员。
  7. “fov”,双目相机图像应用到 SGBM 算法中的有效 fov,这里并不是相机真实 fov,默认 96 ,Xvisio SeerSense™ DS80 系列模组产品设置为 96 ,其他产品请参考数据手册或询问 Xvisio FAE 人员。
  8. “disparity_confidence_threshold”,视差信任度阀值,默认 255,工作态推荐255。
  9. “homography”,单应转换矩阵,默认{1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0},工作台推荐使用默认值。
  10. “enable_gamma”,是否使能 gamma 处理,默认使能,工作态都使能;值:0 关闭,1使能。
  11. “gamma_value”,gamma 系数,默认 2.2 ,工作态推荐2.2。
  12. “enable_gaussian”,是否使能高斯滤波器,默认关闭,工作态都关闭;值:0 关闭,1使能。
  13. “mode”,算法模式,默认为0 ,工作态推荐0。值:0:lrcheck 1:standard 2:extended 3:subpixel 。
  14. “max_distance”,最大距离阀值,单位毫米,默认8000 ,工作态推荐8000。
  15. “min_distance”,最小距离阀值,单位毫米,默认100 ,工作态推荐100。

设置 API 示例:

xv::sgbm_config global_config = {...};
device->sgbmCamera()->start(global_config);

或者可以直接传递空字符串使用默认配置:

device->sgbmCamera()->start("");
2.3 帧率和数据带宽

SGBM 深度不可以设置帧率,和分辨率对应固定帧率,查看表格:

数据类型 分辨率 帧率(fps) USB 带宽(最大)
深度数据 VGA 60 281.25Mbps
深度数据 720P 30 421.875Mbps
点云数据 VGA 60 843.75Mbps
点云数据 720P 30 1265.25Mbps

注意:点云数据既可以使能设备的点云数据输出后通过 USB 输出,也可以调用SDK 的 API 做深度点云的转换。

2.4 曝光时间

SGBM 的图像源是双目鱼眼相机,实际上是和 SLAM 共用的图像源,所以曝光策略也会存在互相影响,当前设备内默认使能的是自动曝光策略,默认最大曝光时间为3ms。
SGBM 和 SLAM 同时工作或者只有 SGBM 时,最大曝光时间会切换为8ms ,当只有SLAM工作时会保持最大曝光时间为3ms。
另外Xvisio SDK 提供了最大曝光时间的设置接口,设置 API 示例:

/*
 * @brief Exposure setting.
 * @param[in] aecMode 0:auto exposure 1:manual exposure
 * @param[in] exposureGain Only valid in manual exposure mode, [0,255]
 * @param[in] exposureTimeMs Only valid in manual exposure mode, in milliseconds
bool setExposure( int aecMode = 0,  int exposureGain = 0,  float exposureTime = 0.0 )
*/
//Examples:
device->fisheyeCameras()->setExposure(0);   //auto exposure
//Or:
device->fisheyeCameras()->setExposure(1,20,5);    //manual exposure

3 深度数据和点云数据

可以通过注册回调获取到 SGBM 深度数据和点云数据,数据格式都是16位深度数据,单位毫米。

3.1 DepthImage定义
/**
 * @brief SGBM data.
 * @note Length, width and depth are in millimeters.
 */
struct SgbmImage {
    enum class Type { Disparity = 0, Depth, PointCloud};
    const Type type;
    explicit SgbmImage(Type t) : type(t) {}
    std::size_t width = 0; //!< width of the image (in pixel)
    std::size_t height = 0; //!< height of the image (in pixel)
    std::shared_ptr<const std::uint8_t> data = nullptr; //! data of SGBM
    unsigned int dataSize = 0;
    double hostTimestamp = std::numeric_limits<double>::infinity(); //!< host timestamp of the physical measurement (in second based on the `std::chrono::steady_clock`).
    std::int64_t edgeTimestampUs = (std::numeric_limits<std::int64_t>::min)(); //!< timestamp of the physical measurement (in microsecond based on edge clock).
    /**
     * @brief Convert to a #xv::RgbImage
     */
    RgbImage toRgb() const;
};

说明:

  1. “type”值为 “Depth” 或 “PointCloud” 。
  2. “width” 和 “height” 和 SGBM 分辨率对应。
  3. “data” 的类型需要通过"type"来确定:
    当"type"为“Depth”时“data”是深度数据单位毫米,每个像素16位的位宽,使用时根据应用场景进行对应的转换;
    当"type"为“PointCloud”时“data”是点云数据,每一个像素有3个 无符号16位类型组成,代表 x , y ,z 轴向的深度数据,单位毫米;
  4. “data size” 等同于 “width” * “height” * 位宽。其中位宽是16位既为2;
  5. “hostTimestamp” 经过 SDK 的时间戳同步转换为主机端相同基准的时间戳,单位秒,精度可达到微秒。
  6. “edgeTimestampUs” ,Xvisio 设备端采样时间戳,单位微秒。
  7. “toRgb()” 暂无效,保留。设备端采样时间戳,单位微秒。
3.2 获取 SgbmImage

使用注册回调方式获取 SgbmImage,接口调用流程如下所示:

  1. 配置 sgbm config.
  2. 注册sgbmCamera的callback;
  3. 调用start()并传入 sgbm config,启动 SGBM streaming;
  4. 触发回调,在回调里做数据处理;
  5. 反注册回调后调用 stop(),停止 SGBM Streaming。
    具体code参考demo-api.cpp(case 67,68),demo-api

4 点云数据转换

Xvisio SDK 提供了 API 可以把深度数据转换为点云数据格式。

4.1 PointCloud定义
/**
 * @brief A point cloud of 3D points.
 */
struct PointCloud {
    double hostTimestamp = std::numeric_limits<double>::infinity(); //!< host timestamp of ? (in second based on the `std::chrono::steady_clock`).
    std::int64_t edgeTimestampUs = (std::numeric_limits<std::int64_t>::min)(); //!< timestamp of ? (in microsecond based on edge clock).
    std::vector<Vector3f> points;
};

说明:

  1. “hostTimestamp” 经过 SDK 的时间戳同步转换为主机端相同基准的时间戳,单位秒,精度可达到微秒。
  2. “edgeTimestampUs” ,Xvisio 设备端采样时间戳,单位微秒。
  3. “points”,点云数据,每一个像素有3个 float 类型组成,代表 x , y ,z 轴向的深度数据,单位毫米。
4.2 转换 PointCloud

转换 PointCloud 必须要先获取 SgbmImage,然后再调用接口做转换,流程如下:

  1. 注册sgbmCamera的callback;
  2. 调用start(),启动 SGBM streaming;
  3. 触发回调,在回调里做点云转换处里,使用的 API:
    device->tofCamera()->depthImageToPointCloud(sgbm_image)
  4. 反注册回调后调用 stop(),停止 SGBM Streaming。
    具体code参考demo-api.cpp(case 67,68),demo-api

5 代码

  • 定义 Xvisio Device
    std::shared_ptr<xv::Device> device = nullptr;
  • 读取 device_list,超时 10 秒(推荐值,也可以缩短)
    auto device_list = xv::getDevices(10., "");
  • 判断获取的 devices 是否为空,为空则失败
    if (device_list.empty())`
    {
            LOG(LOG_Function,"initDevice faiiled:Timeout for device detection.");
            return false;
    }
    
    
  • 获取 device (这里只针对单设备,多设备请参考相应文档描述)
    device = device_list.begin()->second;
  • 设置 “分辨率”,如果不设置默认 VGA 分辨:
    device->sgbmCamera()->setSgbmResolution(xv::SgbmCamera::Resolution::SGBM_640x480);
    
  • 初始化 SGBM Config
    struct xv::sgbm_config global_config = {
        1 ,//enable_dewarp
        1.0, //dewarp_zoom_factor
        0, //enable_disparity
        1, //enable_depth
        0, //enable_point_cloud
        0.08, //baseline
        96, //fov
        255, //disparity_confidence_threshold
        {1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0}, //homography
        1, //enable_gamma
        2.2, //gamma_value
        0, //enable_gaussian
        0, //mode
        8000, //max_distance
        100, //min_distance
    };
    
    
  • 注册回调,回调定义里获取深度数据或者点云数据
    int sgbmId = -1;
    sgbmId = device->sgbmCamera()->registerCallback([&](xv::SgbmImage const & sgbmDepthImage){
            if(sgbmDepthImage.type == xv::SgbmImage::Type::Depth)
            {
                //Operation on sgbmDepthImage
                //...
    
                //point cloud process
                auto points = device->sgbmCamera()->depthImageToPointCloud(sgbmDepthImage)->points;
            
                for (auto iter = points.begin(); iter != points.end();iter++)
                {
                     auto point = *iter;
                     printf(buff, "x=%f ,y=%f ,z=%f\n", point[0], point[1], point[2]);
                        //...
                }
            }
            else if(sgbmDepthImage.type == SgbmImage::Type::PointCloud )//The enable_point_cloud item in sgbm_config must be enabled to enable PointCloud reporting.
            {
                //Operation on sgbm PointCloud
                //...
            }
        });
    
    
  • SGBM 启动
    //start tof,If you use the default config can call: device->sgbmCamera()->start("");
    device->sgbmCamera()->start(global_config);
    
  • SGBM 停止
    此处用到的 sgbmId 是注册callback时赋值。
    device->sgbmCamera()->unregisterCallback(sgbmId);
    device->sgbmCamera()->stop();
    

6 注意事项

  1. 当sgbm_config配置enable_point_cloud 为1时会使能设备端上报点云数据,这样会增大 USB 带宽,可参考2.4 帧率和数据带宽。如果使用 API "depthImageToPointCloud"进行点云转换,那么会增加主机 CPU 的负载,需要用户根据使用场景来选择合适的方法。

Xvisio SDK 深度
Xvisio 功能介绍和快速启动
Xvisio SDK 文档主页

SGBM 深度

  1. 特性

3 深度数据和点云数据

4 点云数据转换