lucky lucky -4 years ago 346
Android Question

take picture using CameraBridgeViewBase on openCV

I had a Binary image. Now, How to when I will click on Button I want to take its.? Please Help me.

This is my code:

public class MainActivity extends Activity implements CameraBridgeViewBase.CvCameraViewListener2, Camera.PictureCallback {

private static final String TAG = "MainActivity";
private JavaCameraView mOpenCvCameraView;
private static final int REQUEST_CODE = 123;
private Button mButton;
private Mat mRgba;
private Mat mByte;
private Mat imGgray, imgCandy;
CameraBridgeViewBase.CvCameraViewFrame inputFrame;

BaseLoaderCallback mBaseLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
super.onManagerConnected(status);
switch (status) {
case BaseLoaderCallback.SUCCESS:
{
mOpenCvCameraView.enableView();
break;
}
default:
{
super.onManagerConnected(status);
break;
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_main);
mButton = (Button) findViewById(R.id.detetionbutton);
mOpenCvCameraView = (JavaCameraView) findViewById(R.id.textdetetion_view);
mOpenCvCameraView.setCvCameraViewListener(this);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
mButton.setOnClickListener(new View.OnClickListener() { // take a picture
@Override
public void onClick(View v) {

}
});

}
@Override
public void onPause() {
super.onPause();
if (mOpenCvCameraView != null) {
mOpenCvCameraView.disableView();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (mOpenCvCameraView != null) {
mOpenCvCameraView.disableView();
}
}
@Override
public void onResume() {
super.onResume();
if (OpenCVLoader.initDebug() == true) {
Log.i(TAG, "opencv loaded");
mBaseLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
} else {
Log.i(TAG, "opencn not loade");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_2_0, this, mBaseLoaderCallback);
}
}
@Override
public void onCameraViewStarted(int width, int height) {
mRgba = new Mat(height, width, CvType.CV_8UC4);
mByte = new Mat(height, width, CvType.CV_8UC4);
imGgray = new Mat(height, width, CvType.CV_8UC4);
imgCandy = new Mat(height, width, CvType.CV_8UC1);
}
@Override
public void onCameraViewStopped() {
mRgba.release();
}
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
Imgproc.cvtColor(mRgba, imGgray, Imgproc.COLOR_RGB2GRAY);
Imgproc.adaptiveThreshold(imGgray, mByte, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 35, 5);
return mByte; // this is m Binary image
}
@Override
public void onPictureTaken(byte[] data, Camera camera) {}
}

Answer Source

So with reference to your sample code. You can do that in two ways,

  1. You can either use the OpenCV onPictureTaken method to capture the image and store it in your storage.

    public void onPictureTaken(byte[] data, Camera camera) {
    
    //Log.i(TAG, "Saving a bitmap to file");
    // The camera preview was automatically stopped. Start it again.
    mCamera.startPreview();
    mCamera.setPreviewCallback(this);
    // Write the image in a file (in jpeg format)
    try {
        FileOutputStream fos = new FileOutputStream(mPictureFileName);
    
        fos.write(data);
        fos.close();
    
    } catch (java.io.IOException e) {
        Log.e("PictureDemo", "Exception in photoCallback", e);
    }
    }
    

    and place this code inside onClick Listener

    mOpenCvCameraView.takePicture(fileName);
    

    but the thing is, the image that is sent as preview to the camera will be saved as default(if its RBG image then RGB image will be saved, if its binary then binary image will be saved)

  2. Or you could create a button on Android and in onClick listener you can use imwrite and save the image, if your camera supports onTouch capture you could also use it in onTouch method. paste this code inside onClick listener or inside onTouch listener (its your wish to choose).

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
    String currentDateandTime = sdf.format(new Date());
    String fileName = Environment.getExternalStorageDirectory().getPath() +
            "/sample_picture_" + currentDateandTime + ".jpg";
    Toast.makeText(this, fileName + " saved", Toast.LENGTH_SHORT).show();
    String filename = "/storage/emulated/0/DCIM/Camera/samplepass.jpg";
    Highgui.imwrite(filename,mByte);
    
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download