2017-11-29 11 views
0

私はドキュメントスキャナを開発しています。私は検出、キャプチャ、すべてを保存するようなものでこれを行いました。私はカメラのビュー画面に問題があります。それは風景モードでうまく動作していますが、私はそれを縦向きにしたい。OpenCVカメラプレビューオリエンテーションの問題

また、すべての画像処理操作を完璧に行っています。しかし、ポートレートモードでしばらくしてからアプリを再起動します。誰かがなぜ私の再起動のアプリを助けることができますか?

活動

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

してください研究のAndroid Activity life cycleのためにオリエンテーション

@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); 
} 

に変更後のデータを取得することができますonSaveInstanceState()とonRestoreInstanceState()あなたを使用することにより

オリエンテーション後のチェックn))をお使いの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); 

}

関連する問題