Android OpenCV Fatal Signal 11 (плохая практика кодирования?)

0

Там действительно не так много документации о страшном Fatal Signal 11 OpenCV. Может ли кто-нибудь, кто знаком с OpenCV, дать подробное объяснение причин его возникновения? Похоже, это может быть связано с "привязкой Android OpenCV" в некоторых случаях, но в моем случае я не уверен, что это обязательно верно.

Несмотря на повторяющиеся обращения к Журналу, я сузил точную точку, где я часто попадал в Fatal Signal 11. Он появляется перед гигантским циклом, показанным ниже. Я предполагаю, что это проблема памяти, так как программа запускает эту функцию в течение примерно 5-30 секунд перед сбоем с этой ошибкой. Я - самоучитель, поэтому, как правило, если что-то работает, я придерживаюсь этого, но это затрудняет мне знать, когда мой код эффективен или неэффективен. В этом конкретном случае это, по-видимому, вызывает ошибку в коде C++, что я не знаю, как отлаживать.

    int cols = myimage.cols; int rows = myimage.rows;
    for (int y = 0; y < cols; y++){
    for (int x = 0; x < rows; x++){
        //val1 = g4.at<float>(y, x);
        //val2 = g5.at<float>(y, x);
        if (g4.at<float>(y, x) >= minrad && g5.at<float>(y, x) >= minrad){
            if (g4.at<float>(y, x) <= maxrad && g5.at<float>(y, x) <= maxrad){
                if (((x + g4.at<float>(y, x)) <= rows) && (y + g5.at<float>(y, x) <= cols)){
                    mapped.at<float>(y + g5.at<float>(y, x) , y + g4.at<float>(y, x)) =              mapped.at<float>(y + g5.at<float>(y, x), y + g4.at<float>(y, x)) + 1;
                    }
            }
        }
    }
}

Полное сообщение об ошибке (показано в Eclipse - есть ли способ получить дополнительную информацию об этой ошибке? Я пробовал adb logcat несколько дней назад, но я не уверен, была ли полезной информация, которую он мне дал):

Fatal signal 11 (SIGSEGV) at 0x62bacfb4 (code=1), thread 24457 (Thread-475)

Если кто-то может оставить комментарий, объясняющий, что означает это сообщение об ошибке, это тоже помогло бы мне.

  • 2
    у должен идти по строкам, х по столбцам;) (и менять свой проверочный код границ тоже)
  • 0
    Вы хотели исправить мой код, потому что вы только что сделали
Теги:
opencv

1 ответ

1

Сигнал 11 является segfault. Это означает что-то доступная память, которая не была выделена программе ОС. Учитывая адрес, на котором это произошло, похоже, что кто-то либо прошел границы массива, либо получил доступ к указателю, который никогда не был инициализирован. Выяснить больше невозможно без аварии.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню