OpenCV相机预览定位问题

时间:2017-11-29 04:24:11

标签: java android opencv image-processing

我正在开发文档扫描程序。我用检测,捕获,保存一切来完成这项工作。我的相机视图屏幕有问题。它在横向模式下工作正常,但我想要它在纵向方向。

也做到了并完美地完成了所有图像处理操作。但它在纵向模式下一段时间后重新启动应用程序。有人可以帮助我重启应用程序的原因吗?

活动

public class OpenCvCamera extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2, View.OnClickListener, FragmentCompat.OnRequestPermissionsResultCallback {


// Used to load the 'native-lib' library on application startup.
static {
    System.loadLibrary("native-lib");
    System.loadLibrary("opencv_java3");
}



private Mat mRgba;
private Mat mIntermediateMat;
private Mat mGray;
private Mat mRgbaT;
private Button btnCapture;
private org.opencv.core.Rect mBoundingRect;
private static final String FILE_LOCATION= Environment.getExternalStorageDirectory()+"/DocumentScan/";

private CameraBridgeViewBase mOpenCvCameraView;
BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {

    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS: {
                Log.i("TAG", "OpenCV loaded successfully");
                mOpenCvCameraView.enableView();
            }
            break;
            default: {
                super.onManagerConnected(status);
            }
            break;
        }
    }
};



@Override
public void onResume() {
    super.onResume();
    if (!OpenCVLoader.initDebug()) {
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_2_0,
                this, mLoaderCallback);
    } else {
        mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.cam);
    mOpenCvCameraView = (JavaCameraView) findViewById(R.id.java_surface_view);
    mOpenCvCameraView.setVisibility(View.VISIBLE);

    mOpenCvCameraView.setCvCameraViewListener(this);
    btnCapture = (Button) findViewById(R.id.btnCapture);
    btnCapture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String timestamp = new SimpleDateFormat("ddMMyyyy_HHmmss", Locale.US).format(new Date());
            File imgFolder = new File(FILE_LOCATION);
            imgFolder.mkdir();
            File image = new File(imgFolder, "Scan" + timestamp + ".jpg");
            String fileName = FILE_LOCATION +
                    "/Scan" + timestamp + ".jpg";
            Toast.makeText(OpenCvCamera.this, image + " saved", Toast.LENGTH_SHORT).show();
            Mat cropped = mRgbaT.submat( mBoundingRect );
            Imgcodecs.imwrite(fileName, cropped);

        }
    }) ;
}

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

public native Rect doWithMat(long matAddrGr, long matAddrRgba);

@Override
public void onCameraViewStarted(int width, int height) {
    Log.d("Width", width + "\t" + height);
    mRgba = new Mat(height, width, CvType.CV_8UC4);
    mIntermediateMat = new Mat(height, width, CvType.CV_8UC4);
    mGray = new Mat(height, width, CV_8UC1);
}

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

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    mRgba = inputFrame.rgba();
    mGray = inputFrame.gray();
    mRgbaT = mRgba.t();
    Core.flip(mRgba.t(), mRgbaT, 1);
    Imgproc.resize(mRgbaT, mRgbaT, mRgba.size());
    mBoundingRect = doWithMat(mGray.getNativeObjAddr(), mRgbaT.getNativeObjAddr());


    return mRgbaT;
}

@Override
public void onClick(View view) {

}
}

1 个答案:

答案 0 :(得分:0)

请学习Android Activity life cycle

通过使用onSaveInstanceState()和onRestoreInstanceState(),您可以在方向更改后获取数据

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);


    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}
  

用于检查方向更改后将其放入onCreate()

// Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
  

或者您可以实现onRestoreInstanceState()

public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);


// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);

}