比特大陆bmnnsdk2视频图像解码和图像处理的开发原则

本文主要针对研发人员在使用比特大陆bmnnsdk2编写应用程序时,视频图像解码和图像处理部分的一些开发原则和注意事项。

1. 编程接触的内存类型(Host Memory和Device Memory)

熟悉比特大陆BM168x AI芯片的同学,都了解BM168x芯片有两种工作模式,对应不同的硬件产品。分别是 soc模式(SE5/SM5/SE3)和pcie模式(SC5/SC5+/SC3)。

无论是soc模式还是pcie模式,内存都有Host Memory和Device Memory两种。

a) soc模式时,Host Memory是芯片上主控Cortex A53的内存,Device Memory是划分给TPU/VPU 的设备内存。

b) pcie模式时,Host Memory是主机的内存,Device Memory是PCIE板卡的设备内存。

在整个程序的pipeline中,应尽量避免数据在Host Memory和Device Memory之间反复拷贝。

2. 视频图像解码和图像处理的开发注意事项

视频和图像的解码,BM168x芯片都是有专门的硬件单元(VPU)来实现,分别通过扩展opencv和ffmpeg的接口来便于研发人员使用。参考文档(documents/Multimedia_Guide_zh.pdf)。

这里需要特别注意,使用bmnnsdk2中的opencv解码,解码后的cv::Mat图像数据是在 Device Memory中,使用文档中没提到的API(resize\cvtColor\clone等)做图像处理操作,都是在Host Memory操作。正确的做法是图像处理操作全部在cv::Mat转成bm_image后(参考文档documents/BMCV_User_Guide.pdf),由bmcv来完成。

bmcv对图像的处理都是在Device Memory完成的,这就确保了解码、图像处理、推理,图像的内存空间都在Device Memory里,没有和Host Memory的拷贝,从而达到最优的效率。

3. bmcv不支持的图像处理

如果遇到bmcv不支持的图像处理操作,必须要由opencv来完成。那就需要将Device Memory的数据拷贝到Host Memory里来实现,参考下面的代码。

bm_image processed_img;
bm_image gray_img;
bm_image_create(bm_handle_, net_h_, net_w_,
                      FORMAT_BGR_PACKED,
                      DATA_TYPE_EXT_1N_BYTE, &processed_img, NULL);

bmcv_rect_t crop_rect = {face.left, face.top,
            face.right - face.left + 1, face.bot - face.top + 1};
bmcv_image_vpp_convert(bm_handle_, 1, input_img, &processed_img, &crop_rect);

cv::Mat cvImg(net_h_, net_w_, CV_8UC3, bgr_buf_);
cv::Mat cvGrayImg(net_h_, net_w_, CV_8UC1, gray_buf_);
bm_image_copy_device_to_host(processed_img, (void**)&bgr_buf_);
cv::cvtColor(cvImg, cvGrayImg, cv::COLOR_BGR2GRAY);
for (size_t i = 0; i < net_h_ * net_w_; i ++) {
	fp_gray_buf_[i] = static_cast<float>(gray_buf_[i]) / 255;
}
bm_image_copy_host_to_device(gray_img, (void**)&fp_gray_buf_);
bm_image_destroy(processed_img);

猜你喜欢

转载自blog.csdn.net/santanan/article/details/112371257
今日推荐