HarmonyOS 鸿蒙Next中如何获取yuv格式为nv_21的相机数据

HarmonyOS 鸿蒙Next中如何获取yuv格式为nv_21的相机数据

目前获取相机数据时,需要设置为ImageFormat.JPEG,这里获取到的数据格式是yuv_420还是其它格式? 另外有没有办法获取nv_21格式的数据。 目前这里获取数据后,在算法库使用时,以yuv_420格式数据处理的,发现部分场景对比安卓精度下降明显。最好和安卓统一。

3 回复

这个imgComponent.byteBuffe是JPEG格式,相机生产的相机流格式是由应用触发的profile决定的,previewProfiles 传入YUV的话byteBuffer就是NV21,YUV数据的格式是固定NV21;

当您设置为ImageFormat.JPEG,这个imgComponent.byteBuffe就是JPEG格式,如果设置为YUV_420_SP,这个imgComponent.byteBuffe就是NV21的,可以采用下述demo进行格式转换:

nextImage.getComponent(image.ComponentType.JPEG, async (err, imgComponent: image.Component) => {
  if (err || imgComponent === undefined) {
    return;
  }
  console.log("=========================================")
  if (imgComponent.byteBuffer as ArrayBuffer) {

    let sourceOptions : image.SourceOptions= {
      sourceDensity: 120,
      sourcePixelFormat: 8, // NV21
      sourceSize: {
        height: 480,
        width: 640
      }
    }
    let imageResource = image.createImageSource(imgComponent.byteBuffer, sourceOptions);
    this.imgUrl = await imageResource.createPixelMap();
    await imageResource.release();
  } else {
    return;
  }
  nextImage.release()
})

更多关于HarmonyOS 鸿蒙Next中如何获取yuv格式为nv_21的相机数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,获取YUV格式为NV21的相机数据可以通过使用CameraKitImageReceiver来实现。首先,创建一个CameraKit实例并配置相机参数,设置输出格式为ImageFormat.YUV_420_888。然后,通过ImageReceiver获取相机帧数据,并将其转换为NV21格式。

具体步骤如下:

  1. 初始化CameraKit并配置相机参数。
  2. 创建ImageReceiver并设置监听器。
  3. 在监听器中获取Image对象,并调用getPlanes()方法获取YUV数据。
  4. 将YUV数据转换为NV21格式。

以下是一个简单的代码示例:

import camera from '@ohos.multimedia.camera';
import image from '@ohos.multimedia.image';

// 初始化CameraKit
let cameraKit = camera.getCameraKit(context);

// 配置相机参数
let cameraConfig = {
    previewFormat: image.ImageFormat.YUV_420_888
};

// 创建ImageReceiver
let imageReceiver = cameraKit.createImageReceiver(640, 480, image.ImageFormat.YUV_420_888, 1);

// 设置监听器
imageReceiver.on('imageAvailable', (err, image) => {
    if (err) {
        console.error('Failed to get image');
        return;
    }
    let planes = image.getPlanes();
    let yBuffer = planes[0].buffer;
    let uBuffer = planes[1].buffer;
    let vBuffer = planes[2].buffer;

    // 将YUV数据转换为NV21格式
    let nv21Data = convertYUV420ToNV21(yBuffer, uBuffer, vBuffer);
    console.log('NV21 Data:', nv21Data);
});

// 开始预览
cameraKit.startPreview(cameraConfig);

function convertYUV420ToNV21(yBuffer, uBuffer, vBuffer) {
    // 转换逻辑
    // ...
    return nv21Data;
}

通过上述步骤,你可以在HarmonyOS鸿蒙Next中获取并转换NV21格式的相机数据。

在HarmonyOS鸿蒙Next中,获取YUV格式为NV21的相机数据可以通过以下步骤实现:

  1. 配置相机参数:在CameraConfig中设置相机输出格式为ImageFormat.YUV_420_888
  2. 创建ImageReader:使用ImageReader.newInstance()创建ImageReader对象,并指定格式为ImageFormat.YUV_420_888
  3. 获取Image对象:通过ImageReader.acquireLatestImage()获取最新的Image对象。
  4. 转换数据格式:从Image对象中获取Plane数据,并将其转换为NV21格式。NV21格式的YUV数据中,Y分量连续存储,U和V分量交错存储。

以下是一个简单的代码示例:

ImageReader imageReader = ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, 2);
Image image = imageReader.acquireLatestImage();
ByteBuffer yBuffer = image.getPlanes()[0].getBuffer();
ByteBuffer uvBuffer = image.getPlanes()[1].getBuffer();
// 将YUV_420_888转换为NV21
byte[] nv21 = convertYUV420888ToNV21(yBuffer, uvBuffer, width, height);

通过以上步骤,即可获取NV21格式的相机数据。

回到顶部