【问题标题】:How to capture a image in Android OpenCV如何在 Android OpenCV 中捕获图像
【发布时间】:2017-04-15 22:57:54
【问题描述】:

我正在从事一个图像处理项目,现在我遇到了一个问题,我导入了 OpenCV 库,我将 RGB 帧转换为二进制帧。现在我不知道如何捕获二进制图像并将其存储在数据库中。没有关于 OpenCV 库的教程。所以任何人都可以帮我解决这个问题。我的编码如下..

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

简而言之,我想要做的是创建一个按钮,并在 onclick 方法中我想捕获图像并且必须显示图像的预览。请有人帮我解决这个问题。提前致谢。

【问题讨论】:

  • 简而言之,您想将 Mat 转换为 Bitmap?
  • 其实你是对的,但我想用一个按钮来捕捉图像。我不知道该怎么做。你能帮我写代码部分怎么做吗?
  • 我已经发布了一个编辑过的答案

标签: android image opencv image-processing camera


【解决方案1】:

如果要预览图像,则必须将 mat 转换为位图,然后将其显示在 ImageView 中。您可以设置一个 CvCameraViewListener 来接收位图。像这样

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

【讨论】:

  • 是的。你是对的。但我想要的是有一个按钮“点击我”。如果我触摸按钮,则应捕获图像,然后显示该图像。所以现在当我按照你告诉我的那样做时,我无法捕获图像,并且从未使用过 displayPreview 方法。很抱歉给您带来不便,作为初学者,我不打算掌握您提供的答案。如果您不介意,请更具体一些并解决我的问题。
  • 我已经更新了答案以便您轻松理解。
  • 太棒了。您的程序运行良好。它的工作。但不幸的是,我遇到了其他一些情况。作为一个新手并且在 OpenCv 库中工作,很难理解这个概念并在其中工作。如果您不介意,请在此 OpenCv 库中帮助我完成此应用程序并指导我完成此工作。我需要一些适当的指导来学习这一点并在这方面工作。如果您有空并准备帮助我,请通过此邮件 ID 对我进行 ping 操作:someshwaran23@gmail.com。非常感谢您的指导。
  • 好的,我已经给你发了一封电子邮件。
猜你喜欢
  • 2015-07-18
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2015-01-10
  • 2012-07-03
  • 1970-01-01
相关资源
最近更新 更多