0

我正在尝试使用 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;
  }
};

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

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

但是,这会打印 -22,这让我相信我正在尝试打印出一个指针。我不确定为什么会这样。

我将不胜感激这方面的任何帮助。

4

1 回答 1

1

您将无法从像素缓冲区中获取任何浮点数据类型。数据以bytes为单位,在C中是char数据类型。

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

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

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

另请记住,您的示例中的预览相机帧位于 YUV420sp 中,这意味着您需要将数据从 YUV 转换为 RGB,然后才能将其设置为位图。

于 2013-05-31T09:43:12.337 回答