Детектор краев Canny для Android - StackOverflow на рекурсивной функции - PullRequest
4 голосов
/ 31 января 2011

Я работаю над приложением дополненной реальности для Android. Я реализую класс Тома Гибары и заменил BufferedImage, который не поддерживается Android, на Bitmap.

Метод «follow» (опубликован ниже) вызывает ошибку StackOverflow для меня. Это рекурсивная функция, но меня сбивает с толку то, что она будет правильно работать в течение примерно 10-15 секунд до сбоя на устройстве.

Из Google похоже, что люди успешно внедрили этот класс в Java, но мне интересно, если по какой-то причине он не работает на Android. Код Gibara указывает, что он предназначен только для однопоточного использования; Может ли это быть частью проблемы? Если нет, то очевидна ли моя ошибка?

Спасибо!

private void follow(int x1, int y1, int i1, int threshold) {  
    int x0 = x1 == 0 ? x1 : x1 - 1;  
    int x2 = x1 == width - 1 ? x1 : x1 + 1;  
    int y0 = y1 == 0 ? y1 : y1 - 1;  
    int y2 = y1 == height -1 ? y1 : y1 + 1;

    data[i1] = magnitude[i1];  
    for (int x = x0; x <= x2; x++) {  
        for (int y = y0; y <= y2; y++) {  
            int i2 = x + y * width;  
            if ((y != y1 || x != x1) && data[i2] == 0 
                    && magnitude[i2] >= threshold) {  
                follow(x, y, i2, threshold);  
                return;  
            }  
        }  
    }  
}

1 Ответ

1 голос
/ 31 января 2011

Стек потоков Android по умолчанию намного меньше, чем на рабочем столе.В текущих сборках Android (2.3) размер стека установлен на 12 кБ, я считаю.Ваша рекурсия просто слишком глубока.

...