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
. Но опять же, обратите внимание, что, хотя это будет заставлять один и тот же ответ выполнять каждый раз, улучшение вашего распределения ключевых точек является лучшим решением в целом.
так есть ли способ сделать это детерминированным? –
Используйте метод Norm8Point, если у вас есть вычислительная способность использовать все точки против случайной выборки из 8 пар точек за раз. Тем не менее, этот метод предполагает NO outliers и, следовательно, не является надежным для ошибочных совпадений! Возможно, если вы будете использовать больше испытаний, другие методы стабилизируются? – chappjc
Существует один вид глупых способов, особенно на C++, но вам нужно изменить исходный код. Псевдослучайный генератор всегда дает одни и те же ряды с одним и тем же семенем. Таким образом, вы инициализируете случайный генератор не со случайным, а с одним предопределенным числом. –