Android: Изпълнение на Chroma key за видео

Имам видеопоток и искам да приложа ефект на цветен ключ върху него . Опитах тази GPU библиотека, но тя е дори по-бавна от моя собствен код:

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