2

opencv を使用して Android カメラを開くことができました。しかし、カメラの向きを修正するコードを使用すると、「 onCameraFrame(..) メソッドで以下に記載されているコードを参照してください」-アプリは数秒後にクラッシュし、logcat は「logcat セクション」に次の投稿メッセージを生成します。

この問題を解決するには:

  1. SystemClock.sleep を使用してアプリをしばらく遅延させようとしましたが、カメラのプレビューが遅れるため、これは良い解決策ではありませんでした

  2. 私はできる限りフレームサイズを最小化しようとしたので、mOpenCvCameraView.setMaxFrameSize(320, 240) 「コードセクションで言及」を使用して320x240に設定しました。しかし、このソリューションはカメラのプレビューを数分間長く保つことができましたが、最終的にはアプリもクラッシュしました.

このような状況の適切な解決策とそれを回避する方法を教えてください。

ログキャット:

10-07 14:42:43.445 30510-31656/com.example.bak.opencvcamera_00 E/cv::error(): OpenCV Error: Insufficient memory (Failed to allocate 307200 bytes) in void* cv::OutOfMemoryError(size_t), file /home/maksim/workspace/android-pack/opencv/modules/core/src/alloc.cpp, line 52
10-07 14:42:43.445 30510-31656/com.example.bak.opencvcamera_00 E/cv::error(): OpenCV Error: Assertion failed (u != 0) in void cv::Mat::create(int, const int*, int), file /home/maksim/workspace/android-pack/opencv/modules/core/src/matrix.cpp, line 411
10-07 14:42:43.450 30510-31656/com.example.bak.opencvcamera_00 E/org.opencv.core.Mat: Mat::n_1t() caught cv::Exception: /home/maksim/workspace/android-pack/opencv/modules/core/src/matrix.cpp:411: error: (-215) u != 0 in function void cv::Mat::create(int, const int*, int)
10-07 14:42:43.450 30510-31656/com.example.bak.opencvcamera_00 E/AndroidRuntime: FATAL EXCEPTION: Thread-9334
Process: com.example.bak.opencvcamera_00, PID: 30510
CvException [org.opencv.core.CvException: cv::Exception: /home/maksim/workspace/android-pack/opencv/modules/core/src/matrix.cpp:411: error: (-215) u != 0 in function void cv::Mat::create(int, const int*, int)
at org.opencv.core.Mat.n_t(Native Method)
at org.opencv.core.Mat.t(Mat.java:852)
at com.example.bak.opencvcamera_00.MainActivity.onCameraFrame(MainActivity.java:109)
at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:391)
at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:350)

コード:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    setContentView(R.layout.activity_main);
    mOpenCvCameraView = (JavaCameraView) findViewById(R.id.surfaceView);
    mOpenCvCameraView.setOnTouchListener(this);
    mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
    mOpenCvCameraView.setCvCameraViewListener(this);
    mOpenCvCameraView.setMaxFrameSize(320, 240);
}
...
...
...
@Override
public Mat onCameraFrame(Mat inputFrame) {
    mRgbaT = inputFrame.t();
    Core.flip(inputFrame.t(), mRgbaT, 1);
    Imgproc.resize(mRgbaT, mRgbaT, inputFrame.size());
    return mRgbaT;
}

更新:

mRgbaT がフィールドとして宣言され、新しいフレームをキャプチャした後にその内容をクリアするように、以下のメソッドを変更しました...それでも問題は解決しません

@Override
public Mat onCameraFrame(Mat inputFrame) {

    if (mRgbaT != null) {
        mRgbaT.release();
    }

    mRgbaT = inputFrame.t();
    Core.flip(inputFrame.t(), mRgbaT, 1);
    Imgproc.resize(mRgbaT, mRgbaT, inputFrame.size());
    return mRgbaT;
}
4

3 に答える 3

1

私の経験からすると、OpenCV4Android はガベージ コレクション マトリックスが非常に苦手なので、各マトリックスを個別の変数に保持し、手動ですべてクリーンアップします。

@Override
public Mat onCameraFrame(Mat inputFrame) {

    Matrix mat1 = new Mat();
    Matrix mat2 = new Mat();

    Core.flip(inputFrame.t(), mat1, 1);
    Imgproc.resize(mat1, mat2, inputFrame.size());

    mat1.release();
    inputFrame.release();

    return mat2;
}

ソース形式で OpenCV4Android を使用している場合は、modified.release(); ここに追加することもお勧めします

于 2016-10-07T16:31:25.783 に答える