РЕДАКТИРОВАТЬ: по общему признанию, это только частичный ответ, поскольку я только объясняю, почему это вообще возможно с этими методами подбора, а не как улучшить входные ключевые точки, чтобы избежать этой проблемы с самого начала. Существуют проблемы с распределением совпадений ваших ключевых точек, как указано в других ответах, и есть способы решить эту проблему на этапе обнаружения ключевых точек. Но причина, по которой один и тот же ввод может давать разные результаты при повторном выполнении estimateFundamentalMatrix
с одними и теми же парами ключевых точек, заключается в следующем. (Опять же, это не дает разумного совета по улучшению ключевых точек, чтобы решить эту проблему).
Причина разных результатов при повторных запусках в связана с методом RANSAC (а также с LMedS и MSAC). Все они используют стохастическую (случайную) выборку и поэтому не являются детерминированными. Все методы, кроме Norm8Point
, работают путем случайной выборки 8 пар точек за раз для (до) NumTrials
.
Но сначала обратите внимание, что разные результаты, которые вы получаете для одних и тех же входных данных, не являются одинаково подходящими (они не будут иметь одинаковых остатков), но пространство поиска может легко привести к любому такому минимуму, поскольку алгоритмы оптимизации не являются детерминированными. Как справедливо предлагают другие ответы, улучшите свои ключевые точки, и это не будет проблемой, но вот почему надежные методы подгонки могут сделать это и некоторые способы изменить их поведение.
Обратите внимание на документацию для параметра 'NumTrials'
(ДОПОЛНИТЕЛЬНОЕ ПРИМЕЧАНИЕ: изменение этого параметра — не решение, но это объясняет поведение):
'NumTrials'
— Количество случайных попыток найти выбросы 500 (по умолчанию) | целое число
Количество случайных испытаний для нахождения выбросов в виде разделенной запятой пары, состоящей из 'NumTrials' и целочисленного значения. Этот параметр применяется, если для параметра Метод задано значение LMedS, RANSAC, MSAC или LTS.
MSAC (Консенсус M-оценки SAmple) представляет собой модифицированный RANSAC (Консенсус RANdom SAmple). Детерминированные алгоритмы для LMedS имеют экспоненциальную сложность, поэтому практически требуется стохастическая выборка.
Прежде чем вы решите использовать Norm8Point
(опять же, это не решение), имейте в виду, что этот метод НЕ предполагает выбросов и, следовательно, не устойчив к ошибочным совпадениям. Попробуйте использовать больше испытаний, чтобы стабилизировать другие методы (РЕДАКТИРОВАТЬ: я имею в виду, вместо того, чтобы переключаться на Norm8Point
, но если вы можете сделать резервную копию в своих алгоритмах, тогда обратитесь к входным данным - ключевым точкам - в качестве первой линии атаки) . Кроме того, чтобы сбросить генератор случайных чисел, вы можете делать rng('default')
перед каждым вызовом estimateFundamentalMatrix
. Но опять же, обратите внимание, что, хотя это будет заставлять один и тот же ответ при каждом запуске, улучшение распределения ключевых точек в целом является лучшим решением.
person
chappjc
schedule
04.02.2014