bmcv_image_lkpyramid
LK金字塔光流算法。完整的使用步骤包括创建、执行、销毁三步。该算法前半部分使用TPU,而后半部分为串行运算需要使用CPU,因此对于PCIe模式,建议使能CPU进行加速,具体步骤参考第5章节。
创建
由于该算法的内部实现需要一些缓存空间,为了避免重复申请释放空间,将一些准备工作封装在该创建接口中,只需要在启动前调用一次便可以多次调用execute接口(创建函数参数不变的情况下),接口形式如下:
bm_status_t bmcv_image_lkpyramid_create_plan( bm_handle_t handle, void*& plan, int width, int height, int winW = 21, int winH = 21, int maxLevel = 3);
输入参数说明:
bm_handle_t handle
输入参数。bm_handle 句柄
void*& plan
输出参数。执行阶段所需要的句柄。
int width
输入参数。待处理图像的宽度。
int height
输入参数,待处理图像的高度。
int winW
输入参数,算法处理窗口的宽度,默认值为21。
int winH
输入参数,算法处理窗口的高度,默认值为21。
int maxLevel
输入参数,金字塔处理的高度,默认值为3, 目前支持的最大值为5。该参数值越大,算法执行时间越长,建议根据实际效果选择可接受的最小值。
返回值说明:
BM_SUCCESS: 成功
其他:失败
执行
使用上述接口创建后的plan就可以开始真正的执行阶段了,接口格式如下:
typedef struct { float x; float y; } bmcv_point2f_t; typedef struct { int type; // 1: maxCount 2: eps 3: both int max_count; double epsilon; } bmcv_term_criteria_t; bm_status_t bmcv_image_lkpyramid_execute( bm_handle_t handle, void* plan, bm_image prevImg, bm_image nextImg, int ptsNum, bmcv_point2f_t* prevPts, bmcv_point2f_t* nextPts, bool* status, bmcv_term_criteria_t criteria = {3, 30, 0.01});
输入参数说明:
bm_handle_t handle
输入参数。bm_handle 句柄
const void *plan
输入参数。创建阶段所得到的句柄。
bm_image prevImg
输入参数。前一幅图像的 bm_image,bm_image 需要外部调用 bmcv_image_create 创建。image 内存可以使用 bm_image_alloc_dev_mem 或者 bm_image_copy_host_to_device 来开辟新的内存,或者使用 bmcv_image_attach 来 attach 已有的内存。
bm_image nextImg
输入参数。后一幅图像的 bm_image,bm_image 需要外部调用 bmcv_image_create 创建。image 内存可以使用 bm_image_alloc_dev_mem 或者 bm_image_copy_host_to_device 来开辟新的内存,或者使用 bmcv_image_attach 来 attach 已有的内存。
int ptsNum
输入参数。需要追踪点的数量。
bmcv_point2f_t* prevPts
输入参数。需要追踪点在前一幅图中的坐标指针,其指向的长度为ptsNum。
bmcv_point2f_t* nextPts
输出参数。计算得到的追踪点在后一张图像中坐标指针,其指向的长度为ptsNum。
bool* status
输出参数。nextPts中的各个追踪点是否有效,其指向的长度为ptsNum,与nextPts中的坐标一一对应,如果有效则为true,否则为false(表示没有在后一张图像中找到对应的跟踪点,可能超出图像范围)。
bmcv_term_criteria_t criteria
输入参数。迭代结束标准,type表示以哪个参数作为结束判断条件:若为1则以迭代次数max_count为结束判断参数,若为2则以误差epsilon为结束判断参数,若为3则两者均需满足。该参数会影响执行时间,建议根据实际效果选择最优的停止迭代标准。
返回值说明:
BM_SUCCESS: 成功
其他:失败
销毁
当执行完成后需要销毁所创建的句柄。该接口必须和创建接口bmcv_image_lkpyramid_create_plan成对使用。
void bmcv_image_lkpyramid_destroy_plan(bm_handle_t handle, void *plan);
格式支持:
该接口目前支持以下 image_format:
num |
image_format |
---|---|
1 |
FORMAT_GRAY |
目前支持以下 data_type:
num |
data_type |
---|---|
1 |
DATA_TYPE_EXT_1N_BYTE |
示例代码
bm_handle_t handle; bm_status_t ret = bm_dev_request(&handle, 0); if (ret != BM_SUCCESS) { printf("Create bm handle failed. ret = %d\n", ret); return -1; } ret = bmcv_open_cpu_process(handle); if (ret != BM_SUCCESS) { printf("BMCV enable CPU failed. ret = %d\n", ret); bm_dev_free(handle); return -1; } bm_image_format_ext fmt = FORMAT_GRAY; bm_image prevImg; bm_image nextImg; bm_image_create(handle, height, width, fmt, DATA_TYPE_EXT_1N_BYTE, &prevImg); bm_image_create(handle, height, width, fmt, DATA_TYPE_EXT_1N_BYTE, &nextImg); bm_image_alloc_dev_mem(prevImg); bm_image_alloc_dev_mem(nextImg); bm_image_copy_host_to_device(prevImg, (void **)(&prevPtr)); bm_image_copy_host_to_device(nextImg, (void **)(&nextPtr)); void *plan = nullptr; bmcv_image_lkpyramid_create_plan( handle, plan, width, height, kw, kh, maxLevel); bmcv_image_lkpyramid_execute( handle, plan, prevImg, nextImg, ptsNum, prevPts, nextPts, status, criteria); bmcv_image_lkpyramid_destroy_plan(handle, plan); bm_image_destroy(prevImg); bm_image_destroy(nextImg); ret = bmcv_close_cpu_process(handle); if (ret != BM_SUCCESS) { printf("BMCV disable CPU failed. ret = %d\n", ret); bm_dev_free(handle); return -1; } bm_dev_free(handle);