HarmonyOS鸿蒙Next中OH_NativeBuffer如何转cv::Mat呢?

HarmonyOS鸿蒙Next中OH_NativeBuffer如何转cv::Mat呢? 参考官方:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/native-camera-preview-imagereceiver

使用预览流二次助理时,需要将OH_NativeBuffer转换成cv::Mat 然后做人脸识别

3 回复

更多关于HarmonyOS鸿蒙Next中OH_NativeBuffer如何转cv::Mat呢?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,将OH_NativeBuffer转换为cv::Mat可通过以下步骤实现:

  1. 使用OH_NativeBuffer_GetNativeBufferConfig获取缓冲区配置信息,包括宽、高、格式等参数。

  2. 调用OH_NativeBuffer_Map将NativeBuffer映射到CPU可访问的内存空间,获取数据指针和步长。

  3. 根据获取的配置参数和数据指针,使用cv::Mat构造函数创建对应格式的Mat对象:

cv::Mat mat(height, width, CV_8UC4, mappedData, stride);
  1. 注意内存管理,使用完毕后需调用OH_NativeBuffer_Unmap解映射。

在HarmonyOS Next中,将OH_NativeBuffer转换为cv::Mat的关键步骤如下:

  1. 获取OH_NativeBuffer信息:

    • 使用OH_NativeBuffer_GetConfig()获取缓冲区配置
    • 通过OH_NativeBuffer_GetStride()获取步长
    • 使用OH_NativeBuffer_GetVirAddr()获取虚拟地址
  2. 数据格式转换:

    • OH_NativeBuffer通常提供NV21/YUV格式数据
    • 需要使用OpenCV的cvtColor()进行YUV到BGR转换
    • 注意颜色空间转换和内存对齐
  3. 创建cv::Mat:

    // 假设获取到宽高和虚拟地址
    int width = ...;
    int height = ...;
    void* virAddr = OH_NativeBuffer_GetVirAddr(nativeBuffer);
    
    // 创建YUV Mat
    cv::Mat yuvMat(height * 3/2, width, CV_8UC1, virAddr);
    
    // 转换为BGR
    cv::Mat bgrMat;
    cv::cvtColor(yuvMat, bgrMat, cv::COLOR_YUV2BGR_NV21);
    
  4. 注意事项:

    • 确保在访问缓冲区前调用OH_NativeBuffer_Lock()锁定
    • 处理完成后调用OH_NativeBuffer_Unlock()释放
    • 考虑图像方向和像素格式差异

这种方法可以直接在预览流中获取图像数据,转换为OpenCV格式进行人脸识别处理。

回到顶部