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/
すべての答えをありがとう!