【问题标题】:take picture using CameraBridgeViewBase on openCV在openCV上使用CameraBridgeViewBase拍照
【发布时间】:2017-03-20 10:14:34
【问题描述】:

我有一个二进制图像。现在,当我点击我想要的按钮时,我该怎么做。?请帮帮我。

这是我的代码:

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

【问题讨论】:

    标签: android opencv take


    【解决方案1】:

    所以参考您的示例代码。您可以通过两种方式做到这一点,

    1. 您可以使用 OpenCV onPictureTaken 方法来捕获图像并将其存储在您的存储中。

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

      并将此代码放入 onClick 监听器

      mOpenCvCameraView.takePicture(fileName);
      

      但问题是,作为预览发送到相机的图像将默认保存(如果是 RBG 图像,则保存 RGB 图像,如果是二进制,则保存二进制图像)

    2. 或者您可以在 Android 上创建一个按钮并在 onClick 监听器中使用 imwrite 并保存图像,如果您的相机支持 onTouch 捕获,您也可以在 onTouch 方法中使用它。将此代码粘贴到 onClick 侦听器或 onTouch 侦听器内(您可以选择)。

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

    【讨论】:

    • 非常感谢。我会试试的。
    • 运气好吗?如果它解决了您的问题,请接受答案并投票,这样可以帮助其他人
    • JavaCamera2View 实现似乎没有takePicture 方法。碰巧你对这个话题有任何了解吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2015-01-20
    • 1970-01-01
    • 2016-07-26
    相关资源
    最近更新 更多