Я делаю приложение для 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, могу ли я ожидать улучшения производительности и если да, то насколько? Или есть другой, лучший способ?
Заранее спасибо.