bmcv_image_morph
可以实现对图像的基本形态学运算,包括膨胀(Dilation)和腐蚀(Erosion)。
用户可以分为以下两步使用该功能:
获取 Kernel 的 Device Memory
可以在初始化时使用以下接口获取存储 Kernel 的 Device Memory,当然用户也可以自定义 Kernel 直接忽略该步骤。
函数通过传入所需 Kernel 的大小和形状,返回对应的 Device Memory 给后面的形态学运算接口使用,用户应用程序的最后需要用户手动释放该空间。
接口形式:
typedef enum { BM_MORPH_RECT, BM_MORPH_CROSS, BM_MORPH_ELLIPSE } bmcv_morph_shape_t; bm_device_mem_t bmcv_get_structuring_element( bm_handle_t handle, bmcv_morph_shape_t shape, int kw, int kh );
参数说明:
bm_handle_t handle
输入参数。 bm_handle 句柄。
bmcv_morph_shape_t shape
输入参数。表示 Kernel 的形状,目前支持矩形、十字、椭圆。
int kw
输入参数。Kernel 的宽度。
int kh
输入参数。Kernel 的高度。
返回值说明:
返回 Kernel 对应的 Device Memory 空间。
形态学运算
目前支持腐蚀和膨胀操作,用户也可以通过这两个基本操作的组合实现以下功能:
开运算(Opening)
闭运算(Closing)
形态梯度(Morphological Gradient)
顶帽(Top Hat)
黑帽(Black Hat)
接口形式:
bm_status_t bmcv_image_erode( bm_handle_t handle, bm_image src, bm_image dst, int kw, int kh, bm_device_mem_t kmem ); bm_status_t bmcv_image_dilate( bm_handle_t handle, bm_image src, bm_image dst, int kw, int kh, bm_device_mem_t kmem );
参数说明:
bm_handle_t handle
输入参数。 bm_handle 句柄。
bm_image src
输入参数。需处理图像的 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 dst
输出参数。处理后图像的 bm_image,bm_image 需要外部调用 bmcv_image_create 创建。image 内存可以使用 bm_image_alloc_dev_mem 或者 bm_image_copy_host_to_device 来开辟新的内存,或者使用 bmcv_image_attach 来 attach 已有的内存,如用户不申请内部会自动申请。
int kw
输入参数。Kernel 的宽度。
int kh
输入参数。Kernel 的高度。
bm_device_mem_t kmem
输入参数。存储 Kernel 的 Device Memory 空间,可以通过接口bmcv_get_structuring_element获取,用户也可以自定义,其中值为1表示选中该像素,值为0表示忽略该像素。
返回值说明:
BM_SUCCESS: 成功
其他:失败
格式支持:
该接口目前支持以下 image_format:
num |
image_format |
---|---|
1 |
FORMAT_GRAY |
2 |
FORMAT_RGB_PLANAR |
3 |
FORMAT_BGR_PLANAR |
4 |
FORMAT_RGB_PACKED |
5 |
FORMAT_BGR_PACKED |
目前支持以下 data_type:
num |
data_type |
---|---|
1 |
DATA_TYPE_EXT_1N_BYTE |
代码示例:
int channel = 1; int width = 1920; int height = 1080; int kw = 3; int kh = 3; int dev_id = 0; bmcv_morph_shape_t shape = BM_MORPH_RECT; bm_handle_t handle; bm_status_t dev_ret = bm_dev_request(&handle, dev_id); bm_device_mem_t kmem = bmcv_get_structuring_element( handle, shape, kw, kh); std::shared_ptr<unsigned char> data_ptr( new unsigned char[channel * width * height], std::default_delete<unsigned char[]>()); for (int i = 0; i < channel * width * height; i++) { data_ptr.get()[i] = rand() % 255; } // calculate res bm_image src, dst; bm_image_create(handle, height, width, FORMAT_GRAY, DATA_TYPE_EXT_1N_BYTE, &src); bm_image_create(handle, height, width, FORMAT_GRAY, DATA_TYPE_EXT_1N_BYTE, &dst); bm_image_alloc_dev_mem(src); bm_image_alloc_dev_mem(dst); bm_image_copy_host_to_device(src, (void **)&(data_ptr.get())); if (BM_SUCCESS != bmcv_image_erode(handle, src, dst, kw, kh, kmem)) { std::cout << "bmcv erode error !!!" << std::endl; bm_image_destroy(src); bm_image_destroy(dst); bm_free_device(handle, kmem); bm_dev_free(handle); return; } bm_image_copy_device_to_host(dst, (void **)&(data_ptr.get())); bm_image_destroy(src); bm_image_destroy(dst); bm_free_device(handle, kmem); bm_dev_free(handle);