Search code examples
androidimageopencvimage-processingcamera

How to capture a image in Android OpenCV


I am working in a project of Image processing and now I have one issue where I imported the OpenCV library I converted the RGB frame to binary frame. Now I dont know how to capture the binary image and store it in database. There is no tutorial available regarding the OpenCV library. So could any one please help me to solve the issue. My coding is below..

public class MainActivity extends AppCompatActivity implements View.OnTouchListener,CameraBridgeViewBase.CvCameraViewListener2 {

private static final String TAG = MainActivity.class.getCanonicalName();
private CameraBridgeViewBase mOpenCvCameraView;
private Mat mRgba;
private Scalar mBlobColorHsv;
private Scalar mBlobColorRgba;

private Mat mIntermediateMat;
private Mat mGray;
Mat hierarchy;


List<MatOfPoint> contours;


private BaseLoaderCallback mLoaderCallback=new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS: {
                Log.i(TAG, "OpenCV loaded successfully");
                mOpenCvCameraView.enableView();
                mOpenCvCameraView.setOnTouchListener(MainActivity.this);
            }
            break;
            default: {
                super.onManagerConnected(status);
            }
            break;

        }
    }

};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);


    mOpenCvCameraView=(CameraBridgeViewBase)findViewById(R.id.opencv_tutorial_activity_surface_view);
    mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
    mOpenCvCameraView.setCvCameraViewListener(this);
}
@Override
public void onPause(){
    super.onPause();
    if(mOpenCvCameraView!=null)
        mOpenCvCameraView.disableView();
}
@Override
public void onResume(){
    {
        super.onResume();
        if(!OpenCVLoader.initDebug()) {
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mLoaderCallback);
        }
        else{
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
    }
}
@Override
public void onDestroy(){
    super.onPause();
    if(mOpenCvCameraView!=null)
        mOpenCvCameraView.disableView();
}

@Override
public boolean onTouch(View v, MotionEvent event) {

    return false;
}


@Override
public void onCameraViewStarted(int width, int height) {
    mRgba=new Mat();
    mBlobColorRgba=new Scalar(255);
    mBlobColorHsv=new Scalar(255);
    mRgba = new Mat(height, width, CvType.CV_8UC4);
    mIntermediateMat = new Mat(height, width, CvType.CV_8UC4);
    mGray = new Mat(height, width, CvType.CV_8UC1);
    hierarchy = new Mat();
}

So in short what I want to do is create a button and in onclick method I want to capture the image and preview of the image has to be displayed. Please someone help me to resolve this issue. Thanks in advance.


Solution

  • if you want to preview the image then you have to convert the mat to a bitmap and then display it in an ImageView. You can set a CvCameraViewListener to receive the bitmap. Like so

        private Mat mat;
        private boolean showPreviews;
            private BaseLoaderCallback mLoaderCallback=new BaseLoaderCallback(this) {
                @Override
                public void onManagerConnected(int status) {
                    switch (status) {
                        case LoaderCallbackInterface.SUCCESS: {
                            Log.i(TAG, "OpenCV loaded successfully");
                          someButton.setOnclickListener(new View.OnclickListener(View v){
                                   showPreviews = !showPreviews;
    });
                            mOpenCvCameraView.enableView();
                            mOpenCvCameraView.setOnTouchListener(MainActivity.this);
            mOpenCvCameraView.setCvCameraViewListener(MainActivity.this);
    
                        }
                        break;
                        default: {
                            super.onManagerConnected(status);
                        }
                        break;
    
                    }
                }
    
            };
    
            @Override
                public void onCameraViewStarted(int width, int height) {
                    // TODO Auto-generated method stub
    
                }
                @Override
                public void onCameraViewStopped() {
                    // TODO Auto-generated method stub
    
                }
                @Override
                public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
                    // TODO Auto-generated method stub
                   if(!showPreviews)
          mat = inputFrame.rgba();
               // you can return a modified mat if you want to display it in opencv
                    return mat;
                }