Android: производительность хроматического ключа для видео

У меня есть видеопоток, и я хочу применить к нему эффект хроматического ключа . Я попробовал эту библиотеку графического процессора, но она еще медленнее, чем мой собственный код:

public class ChromaKey {
    int[] pix;
    Bitmap bm;
    int picw, pich;
    int index, cur_pix, red2, green2, blue2;

    public Bitmap replaceIntervalColor(Bitmap bitmap,int red, int green, int blue)
    {
        if (bitmap != null)
        {
            picw = bitmap.getWidth();
            pich = bitmap.getHeight();
            if (pix == null)
            {
                pix = new int[picw * pich];
            }
            bitmap.getPixels(pix, 0, picw, 0, 0, picw, pich);

            double distance;

            for (int y = 0; y < pich; y++) {
                for (int x = 0; x < picw ; x++) {
                    index = y * picw + x;
                    cur_pix = pix[index];
                    red2 = (int)((cur_pix & 0x00FF0000) >>> 16); // Color.red(cur_pix);
                    green2 = (int)((cur_pix & 0x0000FF00) >>> 8); //Color.green(cur_pix);
                    blue2 = (int)(cur_pix & 0x000000FF); //Color.blue(cur_pix);
                    // faster Math.sqrt
                    // Source: http://stackoverflow.com/a/13264441/956397
                    /* distance = Math.sqrt(
                            (red2 - red) * (red2 - red)
                                    + (green2 - green) * (green2 - green)
                                    + (blue2 - blue) * (blue2 - blue)
                    ); */
                    distance = Double.longBitsToDouble(((Double.doubleToRawLongBits( (red2 - red) * (red2 - red)
                            + (green2 - green) * (green2 - green)
                            + (blue2 - blue) * (blue2 - blue) ) >> 32) + 1072632448 ) << 31);

                    if (distance < 190)
                    {
                        pix[index] = Color.TRANSPARENT;
                    }
                }
            }

            if (bm == null)
            {
                bm = Bitmap.createBitmap(picw, pich, Bitmap.Config.ARGB_4444);
            }
            bm.setPixels(pix, 0, picw, 0, 0, picw, pich);
            return bm;
        }
        return null;
    }
}

Как я могу улучшить производительность этого кода?

Я уже переместил все создание объектов для повторного использования памяти, но это все еще так медленно на планшете высокого класса.


person PiTheNumber    schedule 04.09.2014    source источник
comment
Йоу, чувак. как убрать зеленый цвет? я должен установить 255 в зеленую позицию?   -  person Peter    schedule 18.04.2018
comment
@Peter да (красный = 0, зеленый = 255, синий = 0), если у вас идеальный зеленый и идеальный свет. В противном случае вам, возможно, придется немного подкорректировать.   -  person PiTheNumber    schedule 18.04.2018
comment
спасибо дружище за информацию   -  person Peter    schedule 18.04.2018


Ответы (1)


Предлагаю перенести эту операцию в нативную библиотеку (C/C++). Вы можете передать весь объект Bitmap в собственную библиотечную функцию и изменить содержимое Bitmap без копирования пикселей туда и обратно. Можно применить даже оптимизацию на ассемблере.

Или, проще говоря, попробуйте оптимизировать свой код.

person dasar    schedule 04.09.2014
comment
Я провел несколько простых измерений производительности с помощью System.nanoTime(), и оказалось, что этот код в порядке. Проблема заключалась в плохом сетевом соединении. - person PiTheNumber; 05.09.2014