Как увеличить FPS при обработке изображений - PullRequest
0 голосов
/ 07 мая 2019

Я делаю приложение для Android, чтобы выполнить некоторую обработку изображений, но, к сожалению, это слишком медленно. Я получаю изображение с камеры (как коврик RGBA), конвертирую его в HSV, применяю к нему пороговое значение и снова конвертирую в RGBA. На этом этапе моего кода я бегу 25-30 FPS.

Теперь мне нужно обнаружить линию на изображении. Для этого я определяю оба края линии, начиная с нижней середины.

// at this point, the first pixel of the line has already been found
while (!lFound || !rFound || !lineFound) {
    // left edge of the line
    if (!lFound) {
        // check all different possibilities for the next pixel of the line (there are 8 different possibilities)
        for (i = 0; i < 8; i++) {
            data1 = mat.get(lx + lBlackX[i], ly + lBlackY[i]);
            data2 = mat.get(lx + lWhiteX[i], ly + lWhiteY[i]);
            if (data1[0] == black[0] && data2[0] == white[0]) {
                lx += lBlackX[i];
                ly += lBlackY[i];
                drawing.put(lx, ly, green);
                lineXL.add(lx);
                lineYL.add(ly);
                i = 9;
            }
        }
    }

    // stop if you reach one of the edges of the image or no next pixel is found
    if (lx <= 1 || lx >= mWidth-1 || ly <= 0 || ly >= mHeight-1 || i < 9) {
        lFound = true;
    }
    // right edge of the image
    if (!rFound) {
        // check all different possibilities for the next pixel of the line
        for (i = 0; i < 8; i++) {
            data1 = mat.get(rx + rBlackX[i], ry + rBlackY[i]);
            data2 = mat.get(rx + rWhiteX[i], ry + rWhiteY[i]);
            if (data1[0] == black[0] && data2[0] == white[0]) {
                rx += rBlackX[i];
                ry += rBlackY[i];
                drawing.put(rx, ry, green);
                lineXR.add(rx);
                lineYR.add(ry);
                i = 9;
            }
        }
    }
    // stop if you reach one of the edges of the image
    if (rx <= 1 || rx >= mWidth-1 || ry <= 0 || ry >= mHeight-1 || i < 9) {
        rFound = true;
    }
    // stop if left edge and right edge of the line meet each other or left and right edge of the line have found the edge of the image
    if ((abs(lx-rx) <= 1 && abs(ly-ry) <= 1) || (rFound && lFound)) {
        lineFound = true;
    }
}

Но сейчас я работаю только на 5-7 FPS. Обрабатываемое изображение имеет размер 480x220. Линия обычно имеет длину +/- 500 пикселей (поэтому цикл выполняется 500 раз). Я использую LG G6 ThinQ и Android Studio.

Есть ли способ сделать это быстрее? Я никогда не использовал Android-NDK, могу ли я ожидать улучшения производительности и если да, то насколько? Или есть другой, лучший способ?

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

...