bmcv_calc_hist

直方图

接口形式:

bm_status_t bmcv_calc_hist(
        bm_handle_t handle,
        bm_device_mem_t input,
        bm_device_mem_t output,
        int C,
        int H,
        int W,
        const int *channels,
        int dims,
        const int *histSizes,
        const float *ranges,
        int inputDtype);

参数说明:

  • bm_handle_t handle

输入参数。 bm_handle 句柄。

  • bm_device_mem_t input

输入参数。该device memory空间存储了输入数据,类型可以是float32或者uint8,由参数inputDtype决定。其大小为C*H*W*sizeof(Dtype)。

  • bm_device_mem_t output

输出参数。该device memory空间存储了输出结果,类型为float,其大小为histSizes[0]*histSizes[1]*……*histSizes[n]*sizeof(float)。

  • int C

输入参数。输入数据的通道数量。

  • int H

输入参数。输入数据每个通道的高度。

  • int W

输入参数。输入数据每个通道的宽度。

  • const int *channels

输入参数。需要计算直方图的channel列表,其长度为dims,每个元素的值必须小于C。

  • int dims

输入参数。输出的直方图维度,要求不大于3。

  • const int *histSizes

输入参数。对应每个channel统计直方图的份数,其长度为dims。

  • const float *ranges

输入参数。每个通道参与统计的范围,其长度为2*dims。

  • int inputDtype

输入参数。输入数据的类型:0表示float,1表示uint8。

返回值说明:

  • BM_SUCCESS: 成功

  • 其他:失败

代码示例:

int H = 1024;
int W = 1024;
int C = 3;
int dim = 3;
int channels[3] = {0, 1, 2};
int histSizes[] = {15000, 32, 32};
float ranges[] = {0, 1000000, 0, 256, 0, 256};
int totalHists = 1;
for (int i = 0; i < dim; ++i)
    totalHists *= histSizes[i];
bm_handle_t handle = nullptr;
bm_status_t ret = bm_dev_request(&handle, 0);
float *inputHost = new float[C * H * W];
float *outputHost = new float[totalHists];
for (int i = 0; i < C; ++i)
    for (int j = 0; j < H * W; ++j)
        inputHost[i * H * W + j] = static_cast<float>(rand() % 1000000);
if (ret != BM_SUCCESS) {
    printf("bm_dev_request failed. ret = %d\n", ret);
    exit(-1);
}
bm_device_mem_t input, output;
ret = bm_malloc_device_byte(handle, &input, C * H * W * 4);
if (ret != BM_SUCCESS) {
    printf("bm_malloc_device_byte failed. ret = %d\n", ret);
    exit(-1);
}
ret = bm_memcpy_s2d(handle, input, inputHost);
if (ret != BM_SUCCESS) {
    printf("bm_memcpy_s2d failed. ret = %d\n", ret);
    exit(-1);
}
ret = bm_malloc_device_byte(handle, &output, totalHists * 4);
if (ret != BM_SUCCESS) {
    printf("bm_malloc_device_byte failed. ret = %d\n", ret);
    exit(-1);
}
ret = bmcv_calc_hist(handle,
                     input,
                     output,
                     C,
                     H,
                     W,
                     channels,
                     dim,
                     histSizes,
                     ranges,
                     0);
if (ret != BM_SUCCESS) {
    printf("bmcv_calc_hist failed. ret = %d\n", ret);
    exit(-1);
}
ret = bm_memcpy_d2s(handle, outputHost, output);
if (ret != BM_SUCCESS) {
    printf("bm_memcpy_d2s failed. ret = %d\n", ret);
    exit(-1);
}
bm_free_device(handle, input);
bm_free_device(handle, output);
bm_dev_free(handle);
delete [] inputHost;
delete [] outputHost;

带权重的直方图

接口形式:

bm_status_t bmcv_calc_hist_with_weight(
        bm_handle_t handle,
        bm_device_mem_t input,
        bm_device_mem_t output,
        const float *weight,
        int C,
        int H,
        int W,
        const int *channels,
        int dims,
        const int *histSizes,
        const float *ranges,
        int inputDtype);

参数说明:

  • bm_handle_t handle

输入参数。 bm_handle 句柄。

  • bm_device_mem_t input

输入参数。该device memory空间存储了输入数据,其大小为C*H*W*sizeof(Dtype)。

  • bm_device_mem_t output

输出参数。该device memory空间存储了输出结果,类型为float,其大小为histSizes[0]*histSizes[1]*……*histSizes[n]*sizeof(float)。

  • const float *weight

输入参数。channel内部每个元素在统计直方图时的权重,其大小为H*W*sizeof(float),如果所有值全为1则与普通直方图功能相同。

  • int C

输入参数。输入数据的通道数量。

  • int H

输入参数。输入数据每个通道的高度。

  • int W

输入参数。输入数据每个通道的宽度。

  • const int *channels

输入参数。需要计算直方图的channel列表,其长度为dims,每个元素的值必须小于C。

  • int dims

输入参数。输出的直方图维度,要求不大于3。

  • const int *histSizes

输入参数。对应每个channel统计直方图的份数,其长度为dims。

  • const float *ranges

输入参数。每个通道参与统计的范围,其长度为2*dims。

  • int inputDtype

输入参数。输入数据的类型:0表示float,1表示uint8。

返回值说明:

  • BM_SUCCESS: 成功

  • 其他:失败