簡體   English   中英

OpenCV相機預覽方向問題

[英]OpenCV camera preview orientation issue

我正在開發文檔掃描儀。 我通過檢測,捕獲,保存所有內容來完成此操作。 我的相機查看屏幕有問題。 在橫向模式下可以正常工作,但我希望在縱向下使用。

還做到了,完美地完成了所有圖像處理操作。 但是它在縱向模式下一段時間后會重新啟動應用程序。 有人可以幫我為什么重新啟動應用程序嗎?

活動

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) {

}
}

請研究Android Activity生命周期

通過使用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);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM