Почему сопоставление изображений Opencv ORB не удается случайно для определенного изображения? - PullRequest
0 голосов
/ 29 апреля 2019

Мое приложение разработано с использованием Android и Opencv.

Я пытаюсь сопоставить 3 изображения в реальном времени с 3 эталонными изображениями, используя ORB (я должен был упомянуть методфункции совпадают, потому что, возможно, это может быть источником проблемы).

Основная обработка изображения выполняется в c ++ и вызывает функцию JNI в java.

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

Много других отладок я обнаружил, что послеЯ выполняю тест на симметрию, результат равен 0, поэтому тест RANSAC дает 0 совпадений, и программа завершается ошибкой.

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

Вот функция проверки симметрии

void symmetryTest(
    const std::vector<std::vector<cv::DMatch> > &matches1,
    const std::vector<std::vector<cv::DMatch> > &matches2,
    std::vector<cv::DMatch> &symMatches) {
int count = 0;
// for all matches image 1 -> image 2
for (std::vector<std::vector<cv::DMatch> >::
     const_iterator matchIterator1 = matches1.begin();
     matchIterator1 != matches1.end(); ++matchIterator1) {
    // ignore deleted matches
    if (matchIterator1->size() < 2)
        continue;
    // for all matches image 2 -> image 1
    for (std::vector<std::vector<cv::DMatch> >::
         const_iterator matchIterator2 = matches2.begin();
         matchIterator2 != matches2.end();
         ++matchIterator2) {

        // ignore deleted matches
        if (matchIterator2->size() < 2)
            continue;
        // Match symmetry test
        if ((*matchIterator1)[0].queryIdx ==
            (*matchIterator2)[0].trainIdx &&
            (*matchIterator2)[0].queryIdx ==
            (*matchIterator1)[0].trainIdx) {

            count++;
            // add symmetrical match
            symMatches.push_back(
                    cv::DMatch((*matchIterator1)[0].queryIdx,
                               (*matchIterator1)[0].trainIdx,
                               (*matchIterator1)[0].distance));
            break; // next match in image 1 -> image 2
        }
    }
}
}

Вот изображение, которое вызывает сбой

enter image description here

Я пытался клонировать Mat объекты перед отправкой их на собственную обработку.

Я также выполнял тесты, чтобы убедиться, что изображения действительны и доступны.

Итак, у меня есть два предположения

  1. Может быть, ORB не может обнаружить функции из этого типа изображений (низкая детализация) (я не слишком уверен в этом вопросе, потому что иногда одно и то же изображениедает мне хорошие результаты)
  2. Это первое изображение в массиве, может быть, это вызывает проблему

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

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

...