0

次の手順で、Android のカメラ インテントから取得した bmp 画像を処理しようとしています。

  1. bmpインテントから画像を取得する
  2. OpenCV処理のためにbmp画像をオブジェクトに変換します(問題はここから始まります)Mat
  3. Mat必要な OpenCV 処理を実行します (オブジェクトobjをobjとしてネイティブ処理に送信.getNativeObjAddr()するか、Java でローカルに実行します)。
  4. Matオブジェクトを元に変換するbmp

問題は確かに目新しいものではありません。私は無数の同様の質問をオンラインで見つけましたが、どれも状況を解決していないようです.

結果(問題)

目的は、(上記の 4 つの手順を経た) 処理済みの画像をImageViewオブジェクトに表示することです。ただし、実行後、ImageView は変更されず、logcat は呼び出し元の行に到達すると次の警告を出力します。Utils.bitmapToMat()

 W/System.err(3872): java.lang.IllegalArgumentException: mat == null

コード

onActivityResultメソッドで使用するコードの概要を以下に示します(resultant_bmpはカメラ インテントから取得した bmp です。単独で正常に表示されます)。
filePathのファイル パス、名前と拡張子が含まれていresultant_bmpます。

if開始条件に続く最初の 3 行はhereからのもので、前述の質問ではその使用がうまく機能しているようです。

Bitmap resultant_bmp /*image from camera*/,   
       bmp /*image after opencv processing*/;
Mat rgb_img, gray_img;      

if (OpenCVLoader.initDebug()) { 

     BitmapFactory.Options options = new BitmapFactory.Options();
     options.inPreferredConfig = Config.RGB_565;
     resultant_bmp= BitmapFactory.decodeFile(filePath, options);

     /****************** Problem starts HERE ******************
     Last point reachable before Logcat states:
       W/System.err(4460):java.lang.IllegalArgumentException: mat == null   

     After this point, the program doesn't crash, but expected results 
       in the imageView (last line of code) do not result.
     **********************************************************/  

     Utils.bitmapToMat(resultant_bmp, rgb_img);                                 
     Imgproc.cvtColor(rgb_img, gray_img, Imgproc.COLOR_RGBA2GRAY); 

     /*Do opencv processing (on gray_img) here*/

     Utils.matToBitmap(gray_img, bmp);

     imageView.setImageBitmap(bmp);

}

これまでの試みと研究

  • ここで同様の問題を見つけ、コマンドラインで adb を使用して、推奨どおりにファイルlibopencv_java.soをデバイスにプッシュしようとしたところ、エラーが発生しました。system/lib

failed to copy 'libopencv_java.so' to 'system/lib/libopencv_java.so': Read-only file system

  • この質問は、現在の質問と同じ問題ドメインを考慮しています。上記のコードは、そこで提案されたものと同様のパターンに従いますが、それでも機能しません。

  • この回答 (およびこの前述の回答)に基づいて、次の行をコードに追加しました。

System.loadLibrary("opencv_java");
System.loadLibrary("libopencv_java");

  • プロジェクト プロパティに OpenCV ライブラリを追加しました。ここでさらに説明されているように、NDK ルート パスがどこにあるかを示す NDKROOT 変数と同様です。

  • OpenCV の別の作業サンプルで必要な画像処理 (上記のステップ 3) を試したので、問題は間違いなくステップ 2 (上記) にあります。bmpからMatオブジェクトへの変換。

これには簡単な解決策があるはずですが、見つけられないようです。可能であれば、助けていただければ幸いです。

お時間をいただきありがとうございます。

4

1 に答える 1

0

mat 変数を初期化しましたか? 提供されたコードでそれを見つけることができませんでした。

マットに変換する前にこれを追加してください。

Mat rgb_img = new Mat();
于 2013-01-29T10:41:25.750 に答える