我正在开发文档扫描程序。我用检测,捕获,保存一切来完成这项工作。我的相机视图屏幕有问题。它在横向模式下工作正常,但我想要它在纵向方向。
也做到了并完美地完成了所有图像处理操作。但它在纵向模式下一段时间后重新启动应用程序。有人可以帮助我重启应用程序的原因吗?
活动
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) {
}
}
答案 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);
}