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();
}
}