4

Я реализую сопоставление стерео и в качестве предварительной обработки Я пытаюсь исправить изображения без калибровки камеры. Я использую детектор прибоя для обнаружения и сопоставления функций на изображениях и пытаюсь их выровнять. После того, как я считаю, все матчи, я удалить все, что не лежит на эпиполярных линиях, используя эту функцию:Различные результаты для Фундаментальной матрицы в Matlab

[fMatrix, epipolarInliers, status] = estimateFundamentalMatrix(... 
    matchedPoints1, matchedPoints2, 'Method', 'RANSAC', ... 
    'NumTrials', 10000, 'DistanceThreshold', 0.1, 'Confidence', 99.99); 

inlierPoints1 = matchedPoints1(epipolarInliers, :); 
inlierPoints2 = matchedPoints2(epipolarInliers, :); 

figure; showMatchedFeatures(I1, I2, inlierPoints1, inlierPoints2); 
legend('Inlier points in I1', 'Inlier points in I2'); 

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

Inliner Points

UPDATE: Я думал, что разница была вызвана методом RANSAC, но с использованием LMedS, MSAC, я все еще получаю разные результаты на тех же данных

ответ

4

EDIT: По общему признанию, это лишь частичный ответ, так как я объясняю, почему это возможно даже при использовании этих методов подгонки, а не как улучшить вводные точки ввода, чтобы избежать этой проблемы с самого начала. Существуют проблемы с распределением совпадений с вашими ключевыми точками, как указано в других ответах, и есть способы адресовать это на этапе обнаружения ключевых точек. Но причина в том, что тот же ввод может дать различные результаты для повторных исполнений estimateFundamentalMatrix с одинаковыми парами ключевых точек из-за следующего. (Опять же, это не дает разумных рекомендаций для улучшения ключевых точек, чтобы решить эту проблему).

Причина различных результатов повторных исполнений, -, связанная с методом RANSAC (и LMedS и MSAC). Все они используют стохастическую (случайную) выборку и, таким образом, не детерминированы. Все методы, за исключением Norm8Point, работают случайным образом сэмплированием 8 пар точек за раз (до) NumTrials.

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

Обратите внимание на документации для 'NumTrials' опции (ДОБАВЛЕННОЙ Примечание: изменение этого не решение, но это действительно объясняет поведение):

'NumTrials' - Число случайных испытаний для нахождения выбросов 500 (по умолчанию) | integer

Количество случайных попыток для нахождения выбросов, заданных как пара, разделенная запятой, состоящая из «NumTrials» и целочисленного значения. Этот параметр применяется, когда вы устанавливаете параметр Method для LMedS, RANSAC, MSAC или LTS.

MSAC (M-оценочный SAmple Consensus) представляет собой модифицированный RANSAC (RANdom SAmple Consensus).Детерминированные алгоритмы для LMedS имеют экспоненциальную сложность, и поэтому стохастическая выборка практически необходима.

Прежде чем вы решите использовать Norm8Point (опять же, а не решение), имейте в виду, что этот метод не принимает NO выбросов и, следовательно, не устойчив к ошибочным совпадениям. Попробуйте использовать другие испытания для стабилизации других методов (EDIT: я имею в виду, вместо переключения на Norm8Point, но если вы можете выполнить резервное копирование в своих алгоритмах, тогда обращайтесь к входам - ​​ключевым точкам - в качестве первой линии атаки) , Кроме того, чтобы сбросить генератор случайных чисел, вы можете сделать rng('default') перед каждым звонком до estimateFundamentalMatrix. Но опять же, обратите внимание, что, хотя это будет заставлять один и тот же ответ выполнять каждый раз, улучшение вашего распределения ключевых точек является лучшим решением в целом.

+0

так есть ли способ сделать это детерминированным? –

+0

Используйте метод Norm8Point, если у вас есть вычислительная способность использовать все точки против случайной выборки из 8 пар точек за раз. Тем не менее, этот метод предполагает NO outliers и, следовательно, не является надежным для ошибочных совпадений! Возможно, если вы будете использовать больше испытаний, другие методы стабилизируются? – chappjc

+0

Существует один вид глупых способов, особенно на C++, но вам нужно изменить исходный код. Псевдослучайный генератор всегда дает одни и те же ряды с одним и тем же семенем. Таким образом, вы инициализируете случайный генератор не со случайным, а с одним предопределенным числом. –

3

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

  • Degenerate расположение функций, т.е. расположение функций в основном локализованы (на вас: P) и не очень хорошо распространены по всему изображению.

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

Математически это означает, что вы являетесь добычей E (или F) с плоской поверхности, которая всегда имеет бесконечные решения. Чтобы разобраться в этом, я бы предложил использовать некоторое ограничение на расстоянии между любыми двумя выделенными функциями SURF, т. Е. Любые две функции SURF, используемые для сопоставления, должны быть не менее 40 или 100 пикселей друг от друга (в зависимости от разрешения вашего изображения).

+0

Это должен быть принятый ответ! – jhegedus

+0

@jhegedus Что это связано с тем, что ответ не является детерминированным? Тот же ввод, который не дает того же выхода, обусловлен случайной выборкой. Результат не стабильный - это другая проблема, и в этом случае этот ответ полезен, но это не изменит того факта, что вы все равно можете столкнуться с различными совпадениями ключевых точек. ОП не знал об этом. Прокомментируйте, почему мой ответ неверен.Вопрос был не в том, «как я могу получить максимальную выгоду от соответствия ключевых точек», поэтому я получаю разные результаты каждый раз для _same data_. – chappjc

+0

Да, существование нескольких действительных ответов - это то, что позволяет использовать надежный метод подгонки на разных решениях, но причина, почему это может произойти даже при повторных запусках с одними и теми же входами, - это случайная выборка. Совет в ответ полезен, чтобы понять, почему эта конкретная проблема неустойчива, и я полностью согласен с ней. ОР должен был понять обе проблемы, но хотел знать, почему 'оценкаFundamentalMatrix' недетерминирована. – chappjc

2

Еще один способ улучшить функции SURF - установить «NumOctaves» в detectSURFFeatures(rgb2gray(I1),'NumOctaves',5); на большие значения.

У меня такая же проблема, и это помогло (немного).

+0

Хороший совет, но я хотел бы указать, что независимо от того, насколько вы настраиваете детектор функций и экстрактор, в конечном итоге неправильная сцена (возможно, невозможная) в видеопотоке может возникнуть и создать проблемы. В этом случае может оказаться желательным обеспечить воспроизводимые результаты ... вызов для любого метода, который использует случайную выборку :) и как я интерпретировал этот вопрос. +1 тем не менее. Надеюсь, мой первоначальный ответ не был слишком обманчивым. Приветствия. – chappjc

Смежные вопросы