Мне удалось открыть камеру Android с помощью opencv. но когда я использую код, который фиксирует ориентацию камеры — «см. код, указанный ниже в методе onCameraFrame (..)», — приложение вылетает через несколько секунд, и logcat генерирует сообщения, размещенные в belwo, в «разделе logcat».
Чтобы решить эту проблему:
я пытался использовать SystemClock.sleep, чтобы приложение задержалось на некоторое время, но это не было хорошим решением, потому что оно задерживает предварительный просмотр камеры
я попытался максимально уменьшить размер кадра, поэтому я установил его на 320x240, используя mOpenCvCameraView.setMaxFrameSize(320, 240) «упомянутый ниже в разделе кода». Но этому решению удалось продлить предварительный просмотр камеры на несколько минут, но в конце концов приложение также вышло из строя.
Подскажите, пожалуйста, какое правильное решение в такой ситуации и как этого избежать?
Логкат:
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;
}