Мое приложение разработано с использованием 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
}
}
}
}
Вот изображение, которое вызывает сбой
Я пытался клонировать Mat
объекты перед отправкой их на собственную обработку.
Я также выполнял тесты, чтобы убедиться, что изображения действительны и доступны.
Итак, у меня есть два предположения
- Может быть, ORB не может обнаружить функции из этого типа изображений (низкая детализация) (я не слишком уверен в этом вопросе, потому что иногда одно и то же изображениедает мне хорошие результаты)
- Это первое изображение в массиве, может быть, это вызывает проблему
Но я не могу ничего предположить, может быть, вы, ребята, можете помочь мне через этопотому что я застрял на этой ошибке на неделю.
Заранее спасибо.