Найдите относительный масштаб в монокулярной визуальной одометрии без PnP
Я реализую стандартный алгоритм VO с некоторыми изменениями, то есть извлекаю признаки, сопоставляю их, нахожу основную матрицу и разлагаю, чтобы получить позу. Однако после инициализации вместо использования оценки движения 3D-2D (PNP) для последующих кадров я использую ту же оценку движения 2D-2D (с использованием основной матрицы). Я считаю, что оценка 2D-2D кажется намного более точной, чем 3D-2D. Чтобы найти относительный масштаб второй позы по отношению к первой, я могу найти общие точки (которые были триангулированы для обеих пар кадров). Согласно по учебникувизуальной одометрии, Scaramuzza , можно найти относительный масштаб, найдя отношение относительных расстояний между парами общих точек.
Если
f13D
а также
f23D
- это триангулированные трехмерные точки из последующих пар кадров, я выбираю пары точек случайным образом и вычисляю расстояния, вот примерный фрагмент кода для того же.
indices = np.random.choice(np.arange(0,len(f23D)), size=(5 * len(f23D),2),replace=True)
indices = indices[indices[...,0]!=indices[...,1]]
num = np.linalg.norm(f13D[indices[...,0]] - f13D[indices[...,1]], axis=1).reshape((len(indices),1))
den = np.linalg.norm(f23D[indices[...,0]] - f23D[indices[...,1]], axis=1).reshape((len(indices),1))
return np.median(num/den).
Я также попытался заменить последнюю строку линейным оценщиком выкупа. Однако, поскольку масштабная триангуляция не идеальна, эти значения очень зашумлены, и, следовательно, оценка масштаба также значительно варьируется при использовании разных numpy seed.
Это правильный способ реализовать относительный масштаб в монокулярном ВО, как описано в статье? Если нет, то как лучше всего это сделать (я не хочу использовать PNP, поскольку вращение кажется менее точным)