Я пытаюсь сделать программу, которая создает различные фильтры через веб-камеру и столкнулась с некоторыми проблемами с BLOB-анализом и некоторыми другими.
Я получаю segFault каждый раз, когда активирую свою функцию FIFFIFE.
Вот код для моей функции FIFF:
void testApp::grassFire(int mask_Y, int mask_X, unsigned char labelCnt)
{
blobArray[mask_Y * camWidth + mask_X] = labelCnt;
if (mask_X + 1 <= camWidth - 1 && blobArray[mask_Y * camWidth + mask_X + 1] == 0)
grassFire(mask_Y, mask_X + 1, labelCnt);
if (mask_Y + 1 <= camHeight - 1 && blobArray[(mask_Y + 1) * camWidth + mask_X] == 0)
grassFire(mask_Y + 1, mask_X, labelCnt);
if (mask_X - 1 >= 0 && blobArray[mask_Y * camWidth + mask_X - 1] == 0)
grassFire(mask_Y, mask_X - 1, labelCnt);
if (mask_Y - 1 >= 0 && blobArray[(mask_Y - 1) * camWidth + mask_X] == 0)
grassFire(mask_Y - 1, mask_X, labelCnt);
}
И как он вызывается регистром коммутатора, который запускает каждый кадр Это означает, что он вызывается при каждом обновлении кадра
Сама функция объявлена вне любой другой области видимости.
Я знаю, что это действительно тяжелый фильтр, и он может использовать много памяти, но по сравнению с некоторыми другими фильтрами он не так уж плох, поэтому я не могу понять, почему я получаю segFault.
Я также получаю segFault на другом фильтре, который не должен требовать использования памяти.
Я использую openframeworks в кодовых блоках на win 7.
Это не похоже, что вы можете читать / писать вставить конец вашего blobArray
так как вы делаете некоторые проверки, значит, вы стали жертвой переполнение стека.
Вы должны использовать отладчик и запустить обратную трассировку, которую многие вызовы не могут скрыть.
Если у вас много значений массива 0, вы, вероятно, получаете переполнение стека из-за сильно рекурсивного характера функции. Я бы предложил попробовать итерационный алгоритм заливки вместо этого и посмотрите, решит ли это проблему.
Я бы приложил к заявке Valgrind. Valgrind покажет трассировку стека, где произошла ошибка сегментации.