Как получить новое изображение, сделанное камерой, как OpenCV Mat на Android?

Я пытаюсь сделать снимок с помощью устройства Android. Изображение должно быть преобразовано как мат, чтобы быть входом для вычислений, результаты которых я хотел бы предоставить в API.

В каком формате Android предоставляет данные byte[] в своем обратном вызове и как преобразовать их в OpenCV Mat в цветовом формате BGR?

Первая проблема: "Как сделать снимок без 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);
......

person Jakob Alexander Eichler    schedule 18.03.2015    source источник
comment
Изображение мата = Highgui.imdecode(mat, Highgui.CV_LOAD_IMAGE_UNCHANGED); Это то, что я нашел до сих пор.   -  person Jakob Alexander Eichler    schedule 18.03.2015


Ответы (1)


Как указал Токан на свой комментарий в вопросе, это решение отлично работает:

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);
person allgood    schedule 27.02.2016