Android opencv загружает оттенки серого png с глубиной 16 бит

Я очень новичок в opencv4android и пытаюсь загрузить изображение PNG в оттенках серого с глубиной 16 бит.

Я старался:

Mat mat2DImg = Utils.loadResource(getBaseContext(), R.drawable.image, Highgui.CV_LOAD_IMAGE_GRAYSCALE);

Но png читается как 8-битный со значениями в [0,255]. Я попробовал флаг CV_LOAD_IMAGE_ANYDEPTH, но то же самое. Я пытался создать альфа-канал или загрузить изображение как необработанное, но это не сработало.

Я также попытался скопировать изображение на устройство и прочитать его с помощью imread, как показано ниже, надеясь, что imread сможет загрузить 16-битный канал:

java.lang.String filename = "/storage/emulated/0/image.png";
Mat mat2DImg = Highgui.imread(filename, 0);

Когда я проверяю file.exists(), он действительно существует. Возвращенный Mat не нулевой, но пустой.

Может ли кто-нибудь предложить способ правильно загрузить изображение?


person Guillaume    schedule 27.01.2016    source источник


Ответы (2)


Мне просто удалось заставить его работать:

1) Добавлено в манифест:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/ >

Это устраняет проблему с пустым изображением.

2) Загрузить изображение с флагом CV_LOAD_IMAGE_ANYDEPTH

rgbLoadedImage = Highgui.imread(filename, Highgui.CV_LOAD_IMAGE_ANYDEPTH);

Значения теперь находятся в правильном 16-битном диапазоне.

person Guillaume    schedule 27.01.2016
comment
Текущее имя для CV_LOAD_IMAGE_ANYDEPTHIMREAD_ANYDEPTH. - person Miki; 27.01.2016
comment
Ни один из флагов загрузки изображения не работает. И IMREAD_ANYDEPTH, и CV_LOAD_IMAGE_ANYDEPTH дают мне изображение CV_8U вместо ожидаемого CV_8UC4. - person pajus_cz; 07.11.2016

используйте этот код, он даст вам изображение RGB

String filename = "/storage/emulated/0/image.png";

File file = new File(filename);

Mat image= Highgui.imread(filename, 0);//temp mat
Mat mat2DImg;
if (image.width() > 0) {

        mat2DImg = new Mat(image.size(), image.type());

        Imgproc.cvtColor(image, mat2DImg, Imgproc.COLOR_BGR2RGB);// you can use Imgproc.COLOR_BGR2GRAY to get a gray image

        Log.d(TAG, "mat2DImg: " + "chans: " + image.channels() + ", ("
                + image.width() + ", " + image.height() + ")");

        image.release();
        image = null;
    }
person Avinash Joshi    schedule 27.01.2016
comment
Это просто поменяет местами плоскости B и R, но все равно загрузит изображение как 8-битное. Так что это не ответ на этот вопрос. - person Miki; 27.01.2016