HarmonyOS鸿蒙Next中C++侧opencv的Mat如何转PixelMap返回给ArkTS?

HarmonyOS鸿蒙Next中C++侧opencv的Mat如何转PixelMap返回给ArkTS?

4 回复

已解决,但是有疑问,为何API文档写的是:当前只支持输入流为BGRA格式的流。

cke_649.png

为什么我传入RGBA的mat,也写了pixelFormat=RGBA也可以成功?
而且随便改pixelFormat好像都可以,看起来是没有效果的?

cke_7856.png

cke_8291.png

更多关于HarmonyOS鸿蒙Next中C++侧opencv的Mat如何转PixelMap返回给ArkTS?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


传入RGBA数据时,不会报错,但输出图片颜色会不正确,请自行检查一下传入数据是否真的为RGBA;opts中的pixelFormat设置只影响输出图片的像素格式,和输入数据的格式无关。

在HarmonyOS Next中,通过C++将OpenCV的Mat转换为PixelMap需使用Native API。首先确保Mat格式为RGBA_8888,使用OH_PixelMap_Create初始化PixelMap对象。通过OH_PixelMap_GetImageInfo获取信息后,用OH_PixelMap_AccessPixels锁定内存,将Mat数据复制到PixelMap缓冲区。操作完成后调用OH_PixelMap_UnAccessPixels解锁。最后返回PixelMap对象给ArkTS层使用。

在HarmonyOS Next中,可以通过以下步骤将OpenCV的Mat转换为PixelMap并返回给ArkTS:

  1. 获取Mat数据信息

    • 获取Mat的宽、高、通道数和数据类型
    • 检查Mat格式是否支持(推荐使用RGB或RGBA格式)
  2. 创建InitializationOptions

    InitializationOptions opts;
    opts.size.width = mat.cols;
    opts.size.height = mat.rows;
    opts.pixelFormat = PixelFormat::RGBA_8888; // 根据Mat格式调整
    opts.alphaType = AlphaType::IMAGE_ALPHA_TYPE_OPAQUE;
    
  3. 创建PixelMap并写入数据

    std::unique_ptr<PixelMap> pixelMap = PixelMap::Create(opts);
    // 将Mat数据复制到PixelMap
    uint8_t* pixelData = pixelMap->GetPixels();
    memcpy(pixelData, mat.data, mat.total() * mat.elemSize());
    
  4. 返回给ArkTS: 通过NAPI将PixelMap包装为JS对象返回

注意事项:

  • 确保Mat数据布局与PixelFormat匹配
  • 处理颜色空间转换(如BGR转RGB)
  • 注意内存管理,避免数据拷贝造成性能问题

建议使用RGBA格式以获得最佳兼容性,如Mat为BGR格式需先转换为RGB。

回到顶部