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 を float データ型として使用する必要があることです。ただし、バイト配列の形式です。フレームデータがどのように保存されているか知りたかったのです。これはバイトの 2 次元配列ですか? カメラは 8 ビットの画像を返し、これを 640x480 バイトとして保存しますか? その場合、C はこのバイト データ型をどのような形式で解釈しますか? 単純に float に変換できますか? 私はネイティブでこれを持っています -

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

ピクセル バッファーから float データ型を取得することはできません。データはバイト単位で、Cではcharデータ型です。

jbyte *nativeData = (env)->GetByteArrayElements(NV21FrameData,NULL);

これと同じです: char *nativeData = (char *)((env)->GetByteArrayElements(NV21FrameData, NULL));

データは 1 次元配列として格納されるため、幅、高さ、および x と y の計算によって各ピクセルを取得します。

また、サンプルのプレビュー カメラ フレームが YUV420sp であることに注意してください。これは、データをビットマップに設定する前に、データを YUV から RGB に変換する必要があることを意味します。

于 2013-05-31T09:43:12.337 に答える