JavaCameraView - Огромное снижение частоты кадров в новых API - PullRequest
0 голосов
/ 26 августа 2018

Я работаю над простым приложением, которое получает кадры с камеры моего смартфона.Когда у моего телефона более старые API (24 и ниже), я всегда получал 30 кадров в секунду, поскольку обработка изображений не выполнялась.К моему удивлению, когда я пытался использовать это приложение на одном телефоне с Android Oreo 8.0 (API 26), я мог получить только 7,5 кадров в секунду, даже если я изменил разрешение камеры на минимальное (320x240).Я пытался добавить android: largeHeap = "true" в манифест приложения, но это не сработало.Что могло случиться?Как я могу это исправить?

Телефон: Motorola Z-Play - 3 ГБ Ram

OpenCV: 3.1.0

Операционная система телефона: 8.0 (API 26)

Основная деятельность

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2{

private static String TAG = "MainActivity";
JavaCameraView javaCameraView;
Mat mRgba;

BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status){
            case BaseLoaderCallback.SUCCESS:
                javaCameraView.enableView();
                javaCameraView.setCameraIndex(1);
                break;
            default:
                super.onManagerConnected(status);
                break;
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide();
    setContentView(R.layout.activity_main);

    javaCameraView = (JavaCameraView)findViewById(R.id.java_camera_view);
    javaCameraView.setVisibility(View.VISIBLE);
    javaCameraView.setCvCameraViewListener(this);
    javaCameraView.setMaxFrameSize(320,240);
    javaCameraView.enableFpsMeter();
}

@Override
protected void onPause(){
    super.onPause();
    if(javaCameraView != null)
        javaCameraView.disableView();
}

protected void onDestroy(){
    super.onDestroy();
    if(javaCameraView != null)
        javaCameraView.disableView();
}

protected void onResume(){
    super.onResume();
    if(OpenCVLoader.initDebug()){
        mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
    else {
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
    }
}

@Override
public void onCameraViewStarted(int width, int height) {
    mRgba = new Mat (height, width, CvType.CV_8UC4);
}

@Override
public void onCameraViewStopped() {
    mRgba.release();
}

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) 
    mRgba = inputFrame.rgba();
    return mRgba;
}

}

...