水平面跟踪算法(比如桌面、地面),用于有水平面场景的空间定位,适合普通的AR放置类,以及和其他CV算法结合。
V4.4.0新增算法
需要手机带有陀螺仪。
在相机前后移动、左右移动两种不同场景下,slam算法的识别速度也会有所不同,相机前后移动时空间场景范围小,构建速度相对更快;相机左右移动时相机旋转对应的3维空间场景相对较大,3维空间构建速度也就相对变慢。
详细接口说明查看头文件:bef_effect_ai_slam.h
BEF_SDK_API bef_effect_result_t bef_ai_slam_init_camera_info(bef_ai_slam_camera_info* info);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
info | bef_ai_slam_camera_info* | 初始化相机信息 |
返回值
成功返回BEF_RESULT_SUC,否则返回对应的错误码。
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);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_ai_slam_handle | SLAM算法句柄 |
modelPath | const char* | SLAM算法模型文件路径 |
deviceName | const char* | 设备名 |
camera | bef_ai_slam_camera_info | 初始化后的相机参数 |
imu | bef_ai_slam_imu_info | IMU属性设置 |
version | bef_ai_slam_version | SLAM版本 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码
// 离线 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);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_ai_slam_handle | SLAM算法句柄 |
licensePath | const char* | 许可路径 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码
// 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);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_ai_slam_handle | SLAM算法句柄 |
data | bef_ai_slam_imu_data* | IMU数据 |
type | bef_ai_slam_imu_data_type* | IMU数据类型 |
x | double | x |
y | double | y |
z | double | z |
timeStamp | double | 传感器数据的时间戳 |
rb | double* | 旋转矩阵 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码
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);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_ai_slam_handle | SLAM算法句柄 |
width | int | 图像缓存的宽度 |
height | int | 图像缓存的高度 |
intrinsic | bef_ai_slam_camera_intrinsic* | 相机内参 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码
备注
利用相机内参构建渲染时相机的Projection矩阵(仅需执行一次)。
透视矩阵参数说明:
相机内参:xy方向上焦距(fx, fy); xy方向上光心位置(cx, cy);
图像宽高(w, h);透视矩阵的远近平面深度(zF, zN);
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);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_ai_slam_handle | SLAM算法句柄 |
image | const unsigned char* | 图像缓存数据 |
width | int | 图像缓存的宽度 |
height | int | 图像缓存的高度 |
channels | int | 图像通道数 |
imageStride | int | 图像缓存步长 |
timeStamp | double | 相机捕获图像时间戳 |
flag | bef_ai_slam_click_flag | 点击事件标识 |
pose | bef_ai_slam_pose* | 返回相机位姿 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码
备注
由相机位姿中的旋转矩阵和平移矩阵构建渲染时的相机View矩阵,渲染时需要对该矩阵求逆。
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);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_ai_slam_handle | SLAM算法句柄 |
cameraPose | bef_ai_slam_pose | 相机位姿 |
forceFacing | int | 平面是否朝向相机 |
flag | bef_ai_slam_click_flag | 点击事件标识 |
retPose | bef_ai_slam_pose* | 返回平面位姿 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码
备注
当有点击事件,且plane在tracking状态时,可以获取平面位姿。放置物体时,物体对象与平面的空间位姿一致,可利用获得的retPose构建渲染对象的Model矩阵。
BEF_SDK_API bef_effect_result_t bef_effect_ai_slam_destory(bef_ai_slam_handle);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_ai_slam_handle | SLAM算法句柄 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码
接口说明
详细接口说明查看文件:com.bytedance.labcv.effectsdk.BefSlamInfo.java
/** * @brief init camera info * @param camera 相机相关信息,具体参考{@link BefSlamInfo.SlamCameraInfo} */ public void initCameraInfo(BefSlamInfo.SlamCameraInfo camera);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
camera | SlamCameraInfo | 初始化相机信息,具体参考{@link BefSlamInfo.SlamCameraInfo} |
返回值
成功返回BEF_RESULT_SUC,否则返回对应的错误码。
/** * @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);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
modelPath | String | SLAM算法模型文件路径 |
deviceName | String | 设备名称,可通过Build.MODEL获取 |
imuInfo | SlamImuInfo | 传感器信息 |
cameraInfo | SlamCameraInfo | 相机相关信息 |
version | SlamVersion | SLAM版本 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码
/** * @brief 检查授权文件 * @param context android context 应用上下文 * @param licensePath 授权文件绝对路径 * @param onlineLicense 是否在线授权 * @return 成功返回BEF_RESULT_SUC,其他返回值参考{@link BytedEffectConstants} */ public int checklicense(Context context, String licensePath, boolean onlineLicense);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
context | Context | 应用上下文 |
licensePath | String | 授权许可绝对路径 |
onlineLicense | boolean | 是否在线授权 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码
/** * @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);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
type | SlamImuDataTyp | imu传感器类型,具体参考{@link BytedEffectConstants.SlamImuDataType} |
data | SlamImuData | 对应类型imu传感器数据,具体参考{@link BefSlamInfo.SlamImuData} |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码
/** * @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);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
deviceName | String | 设备名称,可通过Build.MODEL获取 |
paramPath | String | 设备相机内参文件的绝对路径 |
width | int | 输入image buffer对应width |
height | int | 输入image buffer对应height |
返回值
成功返回相机内参信息,根据内参信息可构建projection投影矩阵,返回值参考{@link BefSlamInfo.SlamCameraIntrinsic}, 失败返回相应错误码
备注
利用相机内参构建渲染时相机的Projection矩阵(仅需执行一次)。
透视矩阵参数说明:
相机内参:xy方向上焦距(fx, fy); xy方向上光心位置(cx, cy);
图像宽高(w, h);透视矩阵的远近平面深度(zF, zN);
图像缓存为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);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
buffer | ByteBuffer | 图像缓存数据 |
image_width | int | 图像缓存的宽度 |
image_height | int | 图像缓存的高度 |
image_stride | int | 图像缓存步长 |
image_channels | int | 图像通道数 |
orientation | lamDeviceOrientation | 设备方向,具体参考{@link BytedEffectConstants.SlamDeviceOrientation} |
timeStamp | double | 相机捕获图像时间戳 |
flag | SlamClickFlag | 点击事件标识,具体参考{@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);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
buffer | byte[] | 图像缓存数据 |
image_width | int | 图像缓存的宽度 |
image_height | int | 图像缓存的高度 |
image_stride | int | 图像缓存步长 |
image_channels | int | 图像通道数 |
orientation | lamDeviceOrientation | 设备方向,具体参考{@link BytedEffectConstants.SlamDeviceOrientation} |
timeStamp | double | 相机捕获图像时间戳 |
flag | SlamClickFlag | 点击事件标识,具体参考{@link BefSlamInfo.SlamClickFlag} |
返回值
成功返回算法获取的相机位姿,返回值参考{@link BefSlamInfo.SlamCameraIntrinsic} ,失败返回相应错误码
备注
由相机位姿中的旋转矩阵和平移矩阵构建渲染时的相机View矩阵,渲染时需要对该矩阵求逆。
/** * @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 );
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
cameraPose | SlamPose | 相机位姿 |
forceFacing | int | 平面是否朝向相机 |
flag | SlamClickFlag | 点击事件标识 |
返回值
成功返回平面位姿信息,返回值参考{@link BefSlamInfo.SlamPose}, 失败返回相应错误码
备注
当有点击事件,且plane在tracking状态时,可以获取平面位姿。放置物体时,物体对象与平面的空间位姿一致,可利用获得的retPose构建渲染对象的Model矩阵。
/** * @brief destory slam handle */ public void destory();
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码
答:建议首先查看以下tag输出Error类型的日志:
bef_effect_ai 和SMASH_E_LOG 以及 EffectSDK
错误码请参考错误码表