0

Android プロジェクトでは、カメラ フレームをリアルタイムで分析する必要があります。ここで、「android.hardware.Camera.PreviewCallback」を使用してカメラ フレームを受け取ります。問題は、フレームを分析しようとすると、30 fps が必要なときに FPS が 30 fps から 15 fps に低下することです。私はすでに別のスレッドで分析部分を処理しようとしましたが、フレームのドロップは停止しましたが、分析はもはやリアルタイムではありません。

誰かがこの問題の解決策を持っていますか?

4

4 に答える 4

0

上記に加えて、画像解析がグレー値情報のみで機能する場合、RGB への初期変換は必要ありません。解像度が n × m ピクセルの場合、YUV データから最初の (n*m) バイトを取得できます。これは、古いカメラと Camera2 の両方に当てはまります。

于 2016-05-29T15:08:20.717 に答える
0

@oberflansch で言及されているように、問題を解決するには複数の方法があるかもしれません。

安価ではない YUV から RGB への変換を他の分析と一緒に行う必要がある場合は、RenderScript が解決策になる可能性があります。高速な YuvToRGB 変換組み込み関数があり、分析のパフォーマンスが大幅に向上する可能性があります。

カメラで RenderScript を使用する例を次に示します: https://github.com/googlesamples/android-HdrViewfinder

上記の例のように、YUV 空間で分析を行うこともできます。これにより、YUV から RGB への変換のコストを取り除くことができます。

ただし、RGB 空間で行う必要がある場合は、 ScriptIntrinsicYuvToRGB を簡単に使用できます。

    // Setup the Allocations and ScriptIntrinsicYuvToRGB.
    // Make sure you reuse them to avoid overhead.
    Type.Builder yuvTypeBuilder = new Type.Builder(rs, Element.YUV(rs));
    yuvTypeBuilder.setX(dimX).setY(dimX).setYuvFormat(ImageFormat.YUV_420_888);
    // USAGE_IO_INPUT is used with Camera API to get the image buffer
    // from camera stream without any copy. Detailed usage please
    // refer to the example.
    mInputAllocation = Allocation.createTyped(rs, yuvTypeBuilder.create(),
            Allocation.USAGE_IO_INPUT | Allocation.USAGE_SCRIPT);

    Type.Builder rgbTypeBuilder = new Type.Builder(rs, Element.RGBA_8888(rs));
    rgbTypeBuilder.setX(dimX).setY(dimY);
    // USAGE_IO_OUTPUT can be used with Surface API to display the
    // image to the surface without any copy.
    // You can remove it if you don't need to display the image.
    mOutputAllocation = Allocation.createTyped(rs, rgbTypeBuilder.create(),
            Allocation.USAGE_IO_OUTPUT | Allocation.USAGE_SCRIPT);

    ScriptIntrinsicYuvToRGB yuvToRgb = ScriptIntrinsicYuvToRGB.create(rs, Element.RGBA_8888(rs));

    .........

    // Each time on a new frame available, do the process.
    // Please refer to the example for details.
    mInputAllocation.ioReceive();
    // YUV to RGB conversion
    yuvToRgb.setInput(mInputAllocation);
    yuvToRgb.forEach(mOutputAllocation);

    // Do the analysis on the RGB data, using mOutputAllocation.
    ..........
于 2016-05-26T20:04:17.073 に答える
0

RGB 値と HSV 値を分析する必要があったため、@Settembrini が言及したソリューションを使用できませんでした。私の問題を解決するために、Android NDK を使用して C で関数を作成しました。C 関数は分析を処理し、結果を返します。低速のデバイスでも、必要な 30 FPS に到達します。おそらくほとんどの場合、@Miao Wang の解決策が有効です。

Android スタジオ ユーザーの場合:

  • SDK ツール ([ファイル] > [設定] > [外観と動作] > [システム設定] > [Android SDK] ([SDK ツール] タブ) から NDK をインストールします。
  • 「jni」というサブディレクトリを作成し、すべてのネイティブ ソースをここに配置します。
  • 「Android.mk」を作成して、ネイティブ ソースを NDK ビルド システムに記述します。
  • プロジェクトのディレクトリから "ndk-build" (NDK インストール ディレクトリ内) スクリプトを実行して、ネイティブ コードをビルドします。ビルド ツールは、アプリケーションに必要な削除された共有ライブラリを、アプリケーションのプロジェクト ディレクトリ内の適切な場所にコピーします。

アクティビティにネイティブ メソッドを統合します。

// loading native c module/lib
static {
    try {
        System.loadLibrary("rgbhsvc");
    } catch (UnsatisfiedLinkError ule) {
        Log.e(DEBUG_TAG, "WARNING: Could not load native library: " + ule.getMessage());
    }
}
//Create native void to calculate the RGB HSV
private native void YUVtoRBGHSV(double[] rgb_hsv, byte[] yuv, int width, int height);

データを処理する C 部分を作成します。

JNIEXPORT
void
JNICALL Java_nl_example_project_classes_Camera_YUVtoRBGHSV(JNIEnv * env, jobject obj, jdoubleArray rgb_hsv, jbyteArray yuv420sp, jint width, jint height)
{

// process data

(*env)->SetDoubleArrayRegion(env, rgb_hsv, 0, sz, ( jdouble * ) &rgbData[0] );

   //Release the array data
(*env)->ReleaseByteArrayElements(env, yuv420sp, yuv, JNI_ABORT);

}

Android NDK の優れた紹介: https://www.sitepoint.com/using-c-and-c-code-in-an-android-app-with-the-ndk/

すべての答えをありがとう!

于 2016-05-31T09:27:27.737 に答える