在JNI中操作android相机帧数据

时间:2013-05-31 05:33:22

标签: android android-ndk android-camera

我正在尝试使用NDK进行一些图像处理。我不使用opencv。

我对Android很新,所以我是在逐步完成这项工作。我开始写一个简单的应用程序,让我从相机捕获视频并将其显示在屏幕上。我完成了这件事。

然后我尝试以原生方式操纵相机数据。但是,onPreviewFrame使用字节数组来捕获帧信息。这是我的代码 -

public void onPreviewFrame(byte[] arg0, Camera arg1) 
{
  if (imageFormat == ImageFormat.NV21)
  {
    if ( !bProcessing )
    {
      FrameData = arg0;
      mHandler.post(callnative);
    }
  }
}

而callnative runnable就是这样 -

private Runnable callnative = new Runnable() 
{
  public void run() 
  {    
    bProcessing = true;
    String returnNative = callTorch(MainActivity.assetManager, PreviewSizeWidth,           PreviewSizeHeight, FrameData, pixels);
    bitmap.setPixels(pixels, 0, PreviewSizeWidth, 0, 0, PreviewSizeWidth, PreviewSizeHeight);
    MycameraClass.setImageBitmap(bitmap);
    bProcessing = false;
  }
};

问题是,我需要在native中使用FrameData作为float数据类型。但是,它采用bytearray的形式。我想知道帧数据是如何存储的。这是一个2维的字节数组吗?那么相机会返回一个8位图像并将其存储为640x480字节?如果是这样,C以什么形式解释这个字节数据类型?我可以简单地将其转换为浮动吗?我有这个本地 -

jbyte *nativeData;
nativeData = (env)->GetByteArrayElements(NV21FrameData,NULL);      
__android_log_print(ANDROID_LOG_INFO, "Nativeprint", "nativedata is: %d",(int)nativeData[0]);

然而,这打印-22让我相信我正在尝试打印指针。我不知道为什么会这样。

我将不胜感激。

1 个答案:

答案 0 :(得分:0)

您将无法从像素缓冲区获取任何浮点数据类型。数据为字节 C 中的数据为 char 数据类型。

所以这个:       jbyte * nativeData =(env) - > GetByteArrayElements(NV21FrameData,NULL);

与此相同:       char * nativeData =(char *)((env) - > GetByteArrayElements(NV21FrameData,NULL));

数据存储为1维数组,因此您将检索按宽度,高度和x和y计算运算的每个像素。

还要记住样本中的预览相机帧在YUV420sp中,这意味着您需要先将数据从YUV转换为RGB,然后才能在位图中进行设置。