6

AndroidとOpenCVの新機能。新しい本、実用的なコンピュータビジョンプロジェクトでOpenCVをマスターすることからコードを実装しようとしています。アプリは基本的に、OpenCVを使用してカメラプレビューで漫画化された画像をレンダリングします。画面をタッチすると、漫画化された画像を保存できます。

著者からのソースコードはここにあります

私はCartoonifierApp.javaファイルに小さな変更を加え(以下を参照)、OpenCV Managerアプリでcartoonifierライブラリを静的にロードできるようにしました(元のコードはUnsatisfiedLinkErrorをスローしました)。

私が直面している問題は、Galaxy Nexus(Android 4.1.1)にアプリをロードすると、空の黒い画面が表示されることです。私のLogCatは言う:

E / BufferQueue(4744):[unnamed-4744-0] setBufferCount:SurfaceTextureは破棄されました!E / Cartoonifier :: SurfaceView(4744):startPreview()が失敗しました

記憶の問題だと思います。比較的新しいラップトップ(Asus U46E)ではレンダリングが遅いですが、私のコンピューターではcppコードがそれ自体で正常に実行されるため、cppコードが機能することはわかっています。

これを修正する方法がわかりません。私が見つけた唯一の役立つアドバイスはここにありました。CatoonifierVewBase.javaのsetPreviewメソッドを置き換えると

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
     mCamera.setPreviewTexture( new SurfaceTexture(10) );
 else
     mCamera.setPreviewDisplay(null);

 mCamera.setPreviewDisplay(mHolder);

次に、カメラは通常のように動作し、画面に触れることで漫画化された画像を保存できます。カメラのプレビューで画像を継続的に漫画化したいので、これは必ずしも望ましい結果ではないことに注意してください。私が表面ビューに書き込んでいないので、カメラは機能しているだけです(少なくともそれは私の理解です)。前述のサイトの回答にはいくつかの回避策がありますが、彼が何について話しているのかわかりません。

ところで、私はすべてのサンプルOpenCV4Androidアプリを試しましたが、それらは問題なく動作します。また、OpenCVバージョン2.4.3を使用しています。APIレベルのターゲットは15です。

フルログキャット:

12-22 15:33:07.966:I / CartoonifierApp(5999):インスタンス化された新しいクラスcom.Cartoonifier.CartoonifierApp 12-22 15:33:07.966:I / CartoonifierApp(5999):呼び出されたonCreate 12-22 15:33:07.966 :I / CartoonifierApp(5999):OpenCVライブラリを読み込もうとしています12-22 15:33:07.982:I / Cartoonifier :: SurfaceView(5999):インスタンス化された新しいクラスcom.Cartoonifier.CartoonifierView 12-22 15:33:07.990:I / CartoonifierApp(5999):onResume 12-22 15:33:07.990:I / Cartoonifier :: SurfaceView(5999):openCamera 12-22 15:33:07.990:I / Cartoonifier :: SurfaceView(5999):releaseCamera 12-22 15:33:08.099:D / OpenCVManager / Helper(5999):サービス接続が作成されました12-22 15:33:08.099:D / OpenCVManager / Helper(5999):ライブラリパスを取得しようとしています12-22 15:33:08.138: D / OpenCVManager / Helper(5999):ライブラリリストを取得しようとしています12-22 15:33:08.169:D / OpenCVManager / Helper(5999):ライブラリリスト:"" 12-22 15:33:08.169:D / OpenCVManager / Helper(5999):ライブラリを最初にロードしようとしています12-22 15:33:08.169:D / OpenCVManager / Helper(5999):OpenCVライブラリを初期化しようとしています12- 22 15:33:08.169:D / OpenCVManager / Helper(5999):ライブラリ/data/data/org.opencv.engine/lib/libopencv_java.soを読み込もうとしています12-22 15:33:08.169:

D / dalvikvm(5999):lib /data/data/org.opencv.engine/lib/libopencv_java.so0x41936a4012-22をロードしようとしています

15:33:08.193:D / dalvikvm(5999):共有ライブラリを追加/data/data/org.opencv.engine/lib/libopencv_java.so 0x41936a40 12-22

15:33:08.193:D / OpenCVManager / Helper(5999):OpenCV libs initは大丈夫でした!

12-22 15:33:08.193:D / OpenCVManager / Helper(5999):ライブラリの最初のロード試行はOKです12-22 15:33:08.193:D / OpenCVManager / Helper(5999):初期化はステータス012-で終了しました22 15:33:08.193:D / OpenCVManager / Helper(5999):サービスからバインド解除12-22 15:33:08.200:D / OpenCVManager / Helper(5999):コールバックを使用して呼び出す12-22 15:33:08.200:I / CartoonifierApp(5999):OpenCVが正常に読み込まれました

12-22 15:33:08.200:D / dalvikvm(5999):lib/data/data/com.Cartoonifier/lib/libcartoonifier.soを読み込もうとしています0x41936a4012-22

15:33:08.200:D / dalvikvm(5999):共有ライブラリを追加/data/data/com.Cartoonifier/lib/libcartoonifier.so 0x41936a40 12-22

15:33:08.200:D / dalvikvm(5999):/data/data/com.Cartoonifier/lib/libcartoonifier.so 0x41936a40にJNI_OnLoadが見つかりません、init 12-22をスキップします15:33:08.200:D / OpenCVManager / Helper( 5999):サービス接続が作成されました12-22 15:33:08.200:D / OpenCVManager / Helper(5999):ライブラリパスを取得しようとしています12-22

15:33:08.232:D / OpenCVManager / Helper(5999):ライブラリリストを取得しようとしています12-22 15:33:08.271:D / OpenCVManager / Helper(5999):ライブラリリスト: ""

12-22 15:33:08.271:D / OpenCVManager / Helper(5999):ライブラリをロードする最初の試行12-22 15:33:08.271:D / OpenCVManager / Helper(5999):

init OpenCV libs 12-22 15:33:08.271:D / OpenCVManager / Helper(5999):ライブラリ/data/data/org.opencv.engine/lib/libopencv_java.so 12-22 15:33:08.271を読み込もうとしています: D / dalvikvm(5999):lib /data/data/org.opencv.engine/lib/libopencv_java.so0x41936a4012-22をロードしようとしています

15:33:08.271:D / dalvikvm(5999):共有ライブラリ'/data/data/org.opencv.engine/lib/libopencv_java.so'はすでに同じCLにロードされています0x41936a4012-22 15:33:08.271:D / OpenCVManager / Helper(5999):OpenCV libs initは大丈夫でした!12-22 15:33:08.271:D / OpenCVManager / Helper(5999):ライブラリを最初にロードしようとしても問題ありません

12-22 15:33:08.271:D / OpenCVManager / Helper(5999):ステータス0で初期化が終了しました12-22 15:33:08.271:D / OpenCVManager / Helper(5999):サービスからバインド解除12-22 15:33 :08.271:D / OpenCVManager / Helper(5999):コールバックを使用した呼び出し12-22 15:33:08.271:I / CartoonifierApp(5999):OpenCVが正常にロードされました12-22 15:33:08.279:D / dalvikvm(5999): lib/data/data/com.Cartoonifier/lib/libcartoonifier.soを読み込もうとしています0x41936a4012-2215:33:08.279:D / dalvikvm(5999):共有lib'/data/data/com.Cartoonifier/lib/libcartoonifier .so'はすでに同じCLにロードされています0x41936a4012-2215:33:08.302:I / Cartoonifier :: SurfaceView(5999):surfaceCreated 12-22 15:33:08.302:I / Cartoonifier :: SurfaceView(5999):surfaceChanged( )。ウィンドウサイズ:1196x670 12-22 15:33:08.302:I / Cartoonifier :: SurfaceView(5999):setupCamera(1196x670)12-22 15:33:08.302:I / Cartoonifier ::

12-22 15:33:08.333:I / dalvikvm-heap(5999):1382416バイトの割り当てでヒープ(フラグメントケース)を11.902MBに拡張します

12-22 15:33:08.357:D / dalvikvm(5999):GC_CONCURRENTが1Kを解放、3%が12156K / 12423Kを解放、12ms + 1msを一時停止、合計24ms

12-22 15:33:08.357:D / dalvikvm(5999):WAIT_FOR_CONCURRENT_GCが11msをブロックしました

12-22 15:33:08.365:D / dalvikvm(5999):GC_FOR_ALLOCが0Kを解放、3%が12156K / 12423Kを解放、9ミリ秒一時停止、合計9ミリ秒

12-22 15:33:08.372:I / dalvikvm-heap(5999):1382416バイトの割り当てでヒープ(フラグメントケース)を13.219MBに拡張します

12-22 15:33:08.388:D / dalvikvm(5999):GC_CONCURRENTが0Kを解放、3%が13506K / 13831Kを解放、11ms + 1msを一時停止、合計21ms

12-22 15:33:08.388:D / dalvikvm(5999):WAIT_FOR_CONCURRENT_GCが7msをブロックしました

12-22 15:33:08.404:D / dalvikvm(5999):GC_FOR_ALLOCが1K未満解放、3%解放13506K / 13831K、9ミリ秒一時停止、合計10ミリ秒

12-22 15:33:08.411:I / dalvikvm-heap(5999):3686416バイトの割り当てでヒープ(フラグメントケース)を16.735MBに拡張します

12-22 15:33:08.427:D / dalvikvm(5999):GC_CONCURRENT解放<1K、3%解放17106K / 17479K、一時停止12ms + 1ms、合計22ms

12-22 15:33:08.427:D / dalvikvm(5999):WAIT_FOR_CONCURRENT_GCが10ミリ秒ブロックされました

12-22 15:33:08.443:D / dalvikvm(5999):GC_FOR_ALLOCの解放<1K、3%の解放17106K / 17479K、一時停止10ms、合計10ms

12-22 15:33:08.450:I / dalvikvm-heap(5999):3686416バイトの割り当てでヒープ(フラグメントケース)を20.250MBに拡張します

12-22 15:33:08.466:D / dalvikvm(5999):GC_CONCURRENTが0Kを解放、2%が20706K / 21127Kを解放、12ms + 2msを一時停止、合計22ms

12-22 15:33:08.466:D / dalvikvm(5999):WAIT_FOR_CONCURRENT_GCが5ミリ秒ブロックされました

12-22 15:33:08.466:I / Cartoonifier :: SurfaceView(5999):プレビューを開始

12-22 15:33:08.497:E / BufferQueue(5999):[unnamed-5999-0] setBufferCount:SurfaceTextureは破棄されました!

12-22 15:33:08.505:E / Cartoonifier :: SurfaceView(5999):mCamera.startPreview()が失敗しました

私の変更を示すCartoonifierApp.javaからのスニペット

private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS:
            {
                Log.i(TAG, "OpenCV loaded successfully");

                // Load native library after(!) OpenCV initialization
                System.loadLibrary("cartoonifier");
            } break;
            default:
            {
                super.onManagerConnected(status);
            } break;
        }
    }
};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    Log.i(TAG, "called onCreate");
    super.onCreate(savedInstanceState);

    Log.i(TAG, "Trying to load OpenCV library");
    if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback))
    {
      Log.e(TAG, "Cannot connect to OpenCV Manager");
    }

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    mView = new CartoonifierView(this);
    setContentView(mView);

    // Call our "onTouch()" callback function whenever the user touches the screen.
    mView.setOnTouchListener(this);
}


@Override
protected void onPause() {
    Log.i(TAG, "onPause");
    super.onPause();
    mView.releaseCamera();
}

@Override
public void onResume()
{
    super.onResume();
    Log.i(TAG, "onResume");
    if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback))
    {
      Log.e(TAG, "Cannot connect to OpenCV Manager");
    }   

    if( !mView.openCamera() ) {
        AlertDialog ad = new AlertDialog.Builder(this).create();  
        ad.setCancelable(false); // This blocks the 'BACK' button  
        ad.setMessage("Fatal error: can't open camera!");  
        /*ad.setButton("OK", new DialogInterface.OnClickListener() {  
            public void onClick(DialogInterface dialog, int which) {  
                dialog.dismiss();                      
                finish();
            }  
        });  */
        ad.show();
    }
}
4

1 に答える 1

9

この問題は、しばらく前にOpenCVで回避されました。

アプリケーションのバグなのかOSのバグなのかわからない。問題は、視覚化に使用されるオブジェクトをBitmap.createBitmapデタッチするための呼び出しです。SurfaceTexture

回避策は、基本クラスのsetupCameraメソッドを変更して変更することでした。View

try {
    setPreview();
} catch (IOException e) {
    Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
}

/* Notify that the preview is about to be started and deliver preview size */
onPreviewStarted(params.getPreviewSize().width, params.getPreviewSize().height);

/* Notify that the preview is about to be started and deliver preview size */
onPreviewStarted(params.getPreviewSize().width, params.getPreviewSize().height);

try {
    setPreview();
} catch (IOException e) {
    Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e);
}

(行の順序が変更されます)

于 2012-12-22T21:30:34.270 に答える