Android YUV для оптимизации производительности в оттенках серого - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь преобразовать изображение YUV в оттенки серого, поэтому в основном мне просто нужны значения Y.Для этого я написал небольшой фрагмент кода (с кадром, являющимся изображением YUV):

imageConversionTime = System.currentTimeMillis();
        size = frame.getSize();

        byte nv21ByteArray[] = frame.getImage();

        int lol;

        for (int i = 0; i < size.width; i++) {
            for (int j = 0; j < size.height; j++) {
                lol = size.width*j + i;
                yMatrix.put(j, i, nv21ByteArray[lol]);
            }
        }

        bitmap = Bitmap.createBitmap(size.width, size.height, Bitmap.Config.ARGB_8888);
        Utils.matToBitmap(yMatrix, bitmap);


        imageConversionTime = System.currentTimeMillis() - imageConversionTime;

Однако это занимает около 13500 мс.Мне нужно, чтобы он был НАМНОГО быстрее (на моем компьютере это занимает 8,5 мс в питоне) (я работаю на Motorola Moto E 4G 2-го поколения, не супер мощный, но этого должно быть достаточно для преобразования изображений, верно?).

Есть предложения?

Заранее спасибо.

1 Ответ

0 голосов
/ 28 ноября 2018

Прежде всего, я бы присвоил size.width и size.height переменной.Я не думаю, что компилятор оптимизирует это по умолчанию, но я не уверен в этом.

Кроме того, создайте byte[], представляющий результат, вместо использования Matrix.Тогда вы можете сделать что-то вроде этого:

int[] grayScalePixels = new int[size.width * size.height];
int cntPixels = 0;

В вашем внутреннем цикле установите

grayScalePixels[cntPixels] = nv21ByteArray[lol];
cntPixels++;

Чтобы получить ваше окончательное изображение, сделайте следующее:

Bitmap grayScaleBitmap = Bitmap.createBitmap(grayScalePixels, size.width, size.height, Bitmap.Config.ARGB_8888);

Надеждаэто работает должным образом (я не проверял это, однако, по крайней мере, показанный принцип должен быть применим -> полагаясь на байт [] вместо матрицы)

...