【问题标题】:OpenCv with Android Camera SurfaceviewOpenCv 与 Android 相机 Surfaceview
【发布时间】:2013-10-06 19:52:52
【问题描述】:

我正在尝试开发图像识别 android 应用程序...我正在使用使用表面视图的自定义相机...As Herein android 捕获图像...我想使用 opencv 处理捕获的图像,如何获取捕获的图像并将其转换为 mat ?还有一种方法可以保存捕获的图像 Temporary 吗?提前致谢

【问题讨论】:

    标签: android opencv


    【解决方案1】:

    我假设您已经成功地将 opencv 库添加到您的项目中。

    这是一个使用 OpenCV4android 的示例代码。

    public class SampleCameraFrameAccessActivity extends Activity implements        CvCameraViewListener2, OnTouchListener{
    private static final String  TAG = "SampleCameraFrameAccessActivity";
    
    protected CameraBridgeViewBase cameraPreview;
    protected Mat mRgba;
    
    protected 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(ColorRegionDetectionActivity.this);
                    cameraPreview.enableView();
                } break;
                default:
                {
                    super.onManagerConnected(status);
                } break;
            }
        }
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera_sample_layout);
    
        cameraPreview = (CameraBridgeViewBase) findViewById(R.id.sample_test_camera_view);
    
        cameraPreview.setCvCameraViewListener(this);
    
    }
    
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }
    
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        if(cameraPreview != null){
            cameraPreview.disableView();
        }
    }
    
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
    }
    
    @Override
    public void onCameraViewStarted(int width, int height) {
        // TODO Auto-generated method stub
        mRgba =  new Mat(height, width, CvType.CV_8UC4);
    }
    
    @Override
    public void onCameraViewStopped() {
        // TODO Auto-generated method stub
        mRgba.release();
    
    }
    
    @Override
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
        // TODO Auto-generated method stub
        mRgba = inputFrame.rgba();
    
        return mRgba;
    }
    
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        return false;
    }
    

    }

    XML 布局文件是:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/sample_test_layout" >
    
        <org.opencv.android.JavaCameraView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/sample_test_camera_view" />
    
    </RelativeLayout>
    

    在 onCameraFrame 方法中,您可以访问相机帧缓冲区中的每一帧。如果要捕获图像,可以添加一个按钮并从缓冲区中获取特定帧并进行处理。默认情况下,框架作为 Mat 对象给出。因此您不必转换它。处理后,如果需要转换成位图, 你可以调用 Utils.matToBitmap(mat, bmp);方法来做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      • 2012-08-29
      • 2012-08-04
      相关资源
      最近更新 更多