You need to enable JavaScript to run this app.
导航
SLAM算法
最近更新时间:2025.03.17 14:04:59首次发布时间:2025.03.17 14:04:59
我的收藏
有用
有用
无用
无用
简介

水平面跟踪算法(比如桌面、地面),用于有水平面场景的空间定位,适合普通的AR放置类,以及和其他CV算法结合。
V4.4.0新增算法

技术规格

需要手机带有陀螺仪。
在相机前后移动、左右移动两种不同场景下,slam算法的识别速度也会有所不同,相机前后移动时空间场景范围小,构建速度相对更快;相机左右移动时相机旋转对应的3维空间场景相对较大,3维空间构建速度也就相对变慢。

C接口说明

详细接口说明查看头文件:bef_effect_ai_slam.h

1.初始化相机参数

BEF_SDK_API bef_effect_result_t
bef_ai_slam_init_camera_info(bef_ai_slam_camera_info* info);

参数说明

参数名参数类型参数说明
infobef_ai_slam_camera_info*初始化相机信息

返回值
成功返回BEF_RESULT_SUC,否则返回对应的错误码。

2.初始化SLAM算法

BEF_SDK_API bef_effect_result_t
bef_effect_ai_slam_create(bef_ai_slam_handle *handle,
    const char* deviceName,
    const char* modelPath,
    bef_ai_slam_camera_info* camera, 
    bef_ai_slam_imu_info imu,
    bef_ai_slam_version version);

参数说明

参数名参数类型参数说明
handlebef_ai_slam_handleSLAM算法句柄
modelPathconst char*SLAM算法模型文件路径
deviceNameconst char*设备名
camerabef_ai_slam_camera_info初始化后的相机参数
imubef_ai_slam_imu_infoIMU属性设置
versionbef_ai_slam_versionSLAM版本

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码

3.鉴权

// 离线
BEF_SDK_API bef_effect_result_t
bef_effect_ai_slam_check_license(
    bef_ai_slam_handle handle,
    const char* licensePath);
// 在线
BEF_SDK_API bef_effect_result_t
bef_effect_ai_slam_check_online_license(
    bef_ai_slam_handle handle, 
    const char *licensePath);

参数说明

参数名参数类型参数说明
handlebef_ai_slam_handleSLAM算法句柄
licensePathconst char*许可路径

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码

4.传感器线程输入传感器信息

// iOS
BEF_SDK_API bef_effect_result_t
bef_effect_ai_slam_set_imuinfo(bef_ai_slam_handle handle, 
    const bef_ai_slam_imu_data* imuData);
// 安卓
BEF_SDK_API bef_effect_result_t
bef_effect_ai_slam_set_detail_imuinfo(bef_ai_slam_handle handle, bef_ai_slam_imu_data_type type,
    double x, double y, double z,
    double timeStamp);
BEF_SDK_API bef_effect_result_t
bef_effect_ai_slam_set_rotation_vector(bef_ai_slam_handle handle,
    const double rb[9], double timeStamp);

参数说明

参数名参数类型参数说明
handlebef_ai_slam_handleSLAM算法句柄
databef_ai_slam_imu_data*IMU数据
typebef_ai_slam_imu_data_type*IMU数据类型
xdoublex
ydoubley
zdoublez
timeStampdouble传感器数据的时间戳
rbdouble*旋转矩阵

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码

5.获取相机内参

BEF_SDK_API bef_effect_result_t
bef_effect_ai_slam_get_intrinsic(bef_ai_slam_handle, 
    int width, int height, 
    bef_ai_slam_camera_intrinsic* intrinsic);

参数说明

参数名参数类型参数说明
handlebef_ai_slam_handleSLAM算法句柄
widthint图像缓存的宽度
heightint图像缓存的高度
intrinsicbef_ai_slam_camera_intrinsic*相机内参

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码
备注
利用相机内参构建渲染时相机的Projection矩阵(仅需执行一次)。
透视矩阵参数说明:
相机内参:xy方向上焦距(fx, fy); xy方向上光心位置(cx, cy);
图像宽高(w, h);透视矩阵的远近平面深度(zF, zN);
Image

6.SLAM算法处理获取相机位姿

BEF_SDK_API bef_effect_result_t
bef_effect_ai_slam_detect(bef_ai_slam_handle handle,
    const unsigned char* image, 
    int width, int height, 
    int channels,int imageStride, 
    double timeStamp , bef_ai_slam_click_flag flag,
    bef_ai_slam_pose* pose);

参数说明

参数名参数类型参数说明
handlebef_ai_slam_handleSLAM算法句柄
imageconst unsigned char*图像缓存数据
widthint图像缓存的宽度
heightint图像缓存的高度
channelsint图像通道数
imageStrideint图像缓存步长
timeStampdouble相机捕获图像时间戳
flagbef_ai_slam_click_flag点击事件标识
posebef_ai_slam_pose*返回相机位姿

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码
备注
由相机位姿中的旋转矩阵和平移矩阵构建渲染时的相机View矩阵,渲染时需要对该矩阵求逆。
Image

7.SLAM算法处理获取平面位姿

BEF_SDK_API bef_effect_result_t
bef_effect_ai_slam_get_plane_pose(
    bef_ai_slam_handle handle,  
    bef_ai_slam_pose cameraPose,
    int forceFacing, 
    bef_ai_slam_click_flag flag,
    bef_ai_slam_pose* retPose);

参数说明

参数名参数类型参数说明
handlebef_ai_slam_handleSLAM算法句柄
cameraPosebef_ai_slam_pose相机位姿
forceFacingint平面是否朝向相机
flagbef_ai_slam_click_flag点击事件标识
retPosebef_ai_slam_pose*返回平面位姿

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码
备注
当有点击事件,且plane在tracking状态时,可以获取平面位姿。放置物体时,物体对象与平面的空间位姿一致,可利用获得的retPose构建渲染对象的Model矩阵。
Image

8.释放SLAM算法句柄

BEF_SDK_API bef_effect_result_t
bef_effect_ai_slam_destory(bef_ai_slam_handle);

参数说明

参数名参数类型参数说明
handlebef_ai_slam_handleSLAM算法句柄

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码

Java 接口说明

接口说明
详细接口说明查看文件:com.bytedance.labcv.effectsdk.BefSlamInfo.java

1.初始化相机参数

/**
 * @brief init camera info
 * @param camera 相机相关信息,具体参考{@link BefSlamInfo.SlamCameraInfo}
 */
public void initCameraInfo(BefSlamInfo.SlamCameraInfo camera);

参数说明

参数名参数类型参数说明
cameraSlamCameraInfo初始化相机信息,具体参考{@link BefSlamInfo.SlamCameraInfo}

返回值
成功返回BEF_RESULT_SUC,否则返回对应的错误码。

2.初始化SLAM算法

/**
 * @brief 初始化slam句柄
 * @param modelPath slam模型路径
 * @param deviceName 设备名称,可通过Build.MODEL获取
 * @param imuInfo 传感器信息
 * @param cameraInfo 相机相关信息,具体参考{@link BefSlamInfo.SlamCameraInfo}
 * @param version slam算法版本,具体参考{@link BytedEffectConstants.SlamVersion}
 * @return 成功返回BEF_RESULT_SUC,其他返回值参考{@link BytedEffectConstants}
 */
public int init(String modelPath, String deviceName, BefSlamInfo.SlamImuInfo imuInfo,
                BefSlamInfo.SlamCameraInfo cameraInfo, BytedEffectConstants.SlamVersion version);

参数说明

参数名参数类型参数说明
modelPathStringSLAM算法模型文件路径
deviceNameString设备名称,可通过Build.MODEL获取
imuInfoSlamImuInfo传感器信息
cameraInfoSlamCameraInfo相机相关信息
versionSlamVersionSLAM版本

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码

3.鉴权

/**
 * @brief 检查授权文件
 * @param context android context 应用上下文
 * @param licensePath 授权文件绝对路径
 * @param onlineLicense 是否在线授权
 * @return 成功返回BEF_RESULT_SUC,其他返回值参考{@link BytedEffectConstants}
 */
public int checklicense(Context context, String licensePath, boolean onlineLicense);

参数说明

参数名参数类型参数说明
contextContext应用上下文
licensePathString授权许可绝对路径
onlineLicenseboolean是否在线授权

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码

4.传感器线程输入传感器信息

/**
 * @brief 设置详细测imu传感器数据
 * @param type imu传感器类型,具体参考{@link BytedEffectConstants.SlamImuDataType}
 * @param data 对应类型imu传感器数据,具体参考{@link BefSlamInfo.SlamImuData}
 * @return 成功返回BEF_RESULT_SUC,其他返回值参考{@link BytedEffectConstants}
 */
public int setImuData(BytedEffectConstants.SlamImuDataType type, BefSlamInfo.SlamImuData data);

参数说明

参数名参数类型参数说明
typeSlamImuDataTypimu传感器类型,具体参考{@link BytedEffectConstants.SlamImuDataType}
dataSlamImuData对应类型imu传感器数据,具体参考{@link BefSlamInfo.SlamImuData}

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码

5.获取相机内参

/**
 * @brief 获取slam算法使用的相机内参
 * @param deviceName 设备名称,可通过Build.MODEL获取
 * @param paramPath 设备相机内参文件的绝对路径
 * @param width 输入image buffer对应width
 * @param height 输入image buffer对应height
 * @return 相机内参信息,根据内参信息可构建projection投影矩阵,返回值参考{@link BefSlamInfo.SlamCameraIntrinsic}
 */
public BefSlamInfo.SlamCameraIntrinsic getCameraIntrinsic(String deviceName, String paramPath, int width, int height);

参数说明

参数名参数类型参数说明
deviceNameString设备名称,可通过Build.MODEL获取
paramPathString设备相机内参文件的绝对路径
widthint输入image buffer对应width
heightint输入image buffer对应height

返回值
成功返回相机内参信息,根据内参信息可构建projection投影矩阵,返回值参考{@link BefSlamInfo.SlamCameraIntrinsic}, 失败返回相应错误码
备注
利用相机内参构建渲染时相机的Projection矩阵(仅需执行一次)。
透视矩阵参数说明:
相机内参:xy方向上焦距(fx, fy); xy方向上光心位置(cx, cy);
图像宽高(w, h);透视矩阵的远近平面深度(zF, zN);
Image

6.SLAM算法处理获取相机位姿

图像缓存为bytebuffer类型:

/**
 * @brief 获取相机位姿
 * @param buffer 图像缓存数据
 * @param image_width 图像缓存的宽度
 * @param image_height 图像缓存的高度
 * @param image_stride 图像缓存步长
 * @param image_channlels 图像通道数
 * @param orientation 设备方向,具体参考{@link BytedEffectConstants.SlamDeviceOrientation}
 * @param flag 点击事件标识,具体参考{@link BefSlamInfo.SlamClickFlag}
 * @return 返回算法获取的相机位姿,返回值参考{@link BefSlamInfo.SlamCameraIntrinsic}
 */
public BefSlamInfo.SlamPose slamDetect(ByteBuffer buffer, int image_width,
                      int image_height,
                      int image_stride,
                      int image_channlels,
                      BytedEffectConstants.SlamDeviceOrientation orientation,
                      double time_stamp,
                      BefSlamInfo.SlamClickFlag flag);

参数说明

参数名参数类型参数说明
bufferByteBuffer图像缓存数据
image_widthint图像缓存的宽度
image_heightint图像缓存的高度
image_strideint图像缓存步长
image_channelsint图像通道数
orientationlamDeviceOrientation设备方向,具体参考{@link BytedEffectConstants.SlamDeviceOrientation}
timeStampdouble相机捕获图像时间戳
flagSlamClickFlag点击事件标识,具体参考{@link BefSlamInfo.SlamClickFlag}

返回值
成功返回算法获取的相机位姿,返回值参考{@link BefSlamInfo.SlamCameraIntrinsic} ,失败返回相应错误码
图像缓存为byte[]类型:

/**
 * @brief 获取相机位姿
 * @param buffer 图像缓存数据, 数据类型byte[]
 * @param image_width 图像缓存的宽度
 * @param image_height 图像缓存的高度
 * @param image_stride 图像缓存步长
 * @param image_channlels 图像通道数
 * @param orientation 设备方向,具体参考{@link BytedEffectConstants.SlamDeviceOrientation}
 * @param flag 点击事件标识,具体参考{@link BefSlamInfo.SlamClickFlag}
 * @return 返回算法获取的相机位姿,返回值参考{@link BefSlamInfo.SlamCameraIntrinsic}
 */
public BefSlamInfo.SlamPose slamDetect(byte[] buffer, int image_width,
                        int image_height,
                        int image_stride,
                        int image_channlels,
                        BytedEffectConstants.SlamDeviceOrientation orientation,
                        double time_stamp,
                        BefSlamInfo.SlamClickFlag flag);

参数说明

参数名参数类型参数说明
bufferbyte[]图像缓存数据
image_widthint图像缓存的宽度
image_heightint图像缓存的高度
image_strideint图像缓存步长
image_channelsint图像通道数
orientationlamDeviceOrientation设备方向,具体参考{@link BytedEffectConstants.SlamDeviceOrientation}
timeStampdouble相机捕获图像时间戳
flagSlamClickFlag点击事件标识,具体参考{@link BefSlamInfo.SlamClickFlag}

返回值
成功返回算法获取的相机位姿,返回值参考{@link BefSlamInfo.SlamCameraIntrinsic} ,失败返回相应错误码
备注
由相机位姿中的旋转矩阵和平移矩阵构建渲染时的相机View矩阵,渲染时需要对该矩阵求逆。
Image

7.SLAM算法处理获取平面位姿

/**
 * @brief 获取平面位姿
 * @param camera_pose 相机位姿
 * @param force_facing 平面是否朝向相机
 * @param flag 点击事件标识,具体参考{@link BefSlamInfo.SlamClickFlag}
 * @return 返回平面位姿信息,返回值参考{@link BefSlamInfo.SlamPose}
 */
public BefSlamInfo.SlamPose getPlanePose(BefSlamInfo.SlamPose camera_pose, int force_facing, BefSlamInfo.SlamClickFlag flag );

参数说明

参数名参数类型参数说明
cameraPoseSlamPose相机位姿
forceFacingint平面是否朝向相机
flagSlamClickFlag点击事件标识

返回值
成功返回平面位姿信息,返回值参考{@link BefSlamInfo.SlamPose}, 失败返回相应错误码
备注
当有点击事件,且plane在tracking状态时,可以获取平面位姿。放置物体时,物体对象与平面的空间位姿一致,可利用获得的retPose构建渲染对象的Model矩阵。
Image

8.释放SLAM算法句柄

/**
 * @brief destory slam handle
 */
public void destory();

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码

FAQ

1.如果出现任何异常,请查看是否有以下类型日志

答:建议首先查看以下tag输出Error类型的日志:
bef_effect_ai 和SMASH_E_LOG 以及 EffectSDK

错误码

错误码请参考错误码表