【问题标题】:How to retrieve a new picture taken by the camera as OpenCV Mat on Android?如何在Android上检索相机拍摄的新照片作为OpenCV Mat?
【发布时间】:2015-05-21 16:48:48
【问题描述】:

我正在尝试使用 Android 设备拍照。图片必须转换为 Mat 以作为计算的输入,我喜欢在 API 中提供结果。

Android 在其回调中以何种格式提供字节[] 数据以及如何将其转换为颜色格式 BGR 的 OpenCV Mat?

第一个问题:“如何在没有SurfaceView的情况下拍照”解决了。我使用了 SurfaceTexture,它一定是不可见的。

mCamera = Camera.open();
mCamera.setPreviewTexture(new SurfaceTexture(10));

所以我能够开始预览并拍照。但是 byte[] 数据是哪种格式的,如何将其转换为 OpenCV BGR Mat?

mCamera.startPreview();
mCamera.takePicture(null, null, null, new PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                Log.e(MainActivity.APP_ID, "picture-taken");
                android.hardware.Camera.Size pictureSize = camera.getParameters().getPictureSize();
                Mat mat = new Mat(new Size(pictureSize.width, pictureSize.height), CvType.CV_8U);
                mat.put(0,0,data);
                mat.reshape(0, pictureSize.height);
//              Imgproc.cvtColor(mat, mat, Imgproc.COLOR_YUV420sp2RGBA);
......

【问题讨论】:

  • Mat image = Highgui.imdecode(mat, Highgui.CV_LOAD_IMAGE_UNCHANGED);这就是我到目前为止所发现的。

标签: android opencv computer-vision opencv4android


【解决方案1】:

正如 tokan 指出他在问题中的评论,这个解决方案效果很好:

android.hardware.Camera.Size pictureSize = camera.getParameters().getPictureSize();

Mat mat = new Mat(new Size(pictureSize.width, pictureSize.height), CvType.CV_8U);
mat.put(0, 0, data);

Mat img = Imgcodecs.imdecode(mat, Imgcodecs.CV_LOAD_IMAGE_UNCHANGED);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多