Фундаментальная и основная матрица OpenCV (python) не согласуется

Я пытаюсь откалибровать стереокамеру с помощью OpenCV (интерфейс Python). Сначала я откалибровал две камеры отдельно с помощью calibrateCamera2, а затем передал параметры в StereoCalibrate.

cv.StereoCalibrate(object_points, image_points_left, image_points_right, \
               point_counts, intrinsic_left, distortion_left,\
               intrinsic_right, distortion_right, \
               (IMGRES_X,IMGRES_Y), R, T, E, F, \
               term_crit=(cv.CV_TERMCRIT_ITER+cv.CV_TERMCRIT_EPS, 100, 1e-8),\
               flags=cv.CV_CALIB_FIX_INTRINSIC)

Я проверяю результат эпиполярным ограничением (как описано в книге OpenCV) и получаю среднюю ошибку около 0,0039.

В принципе, я должен быть в состоянии связать основную и существенную матрицу с матрицами моей камеры. Итак, что я делаю:

Mr = asarray(intrinsic_right,dtype=float64)
Ml = asarray(intrinsic_left,dtype=float64)
E = asarray(E)
F = asarray(F)
F2 = dot(dot(inv(Mr).T,E),inv(Ml))

Однако полученная матрица F2 совсем не похожа на F. Есть ли что-то очевидное, что я делаю неправильно? Помощь очень ценится.

Изменить: точка и inv взяты из numpy.


person fabee    schedule 17.04.2012    source источник


Ответы (2)


Матрицы E и F, возвращаемые функцией StereoCalibrate(), верны. F определяется в масштабе, поэтому, если вы собираетесь сравнивать возвращенный F и матрицу F, вычисленную из E, вам необходимо нормализовать их, чтобы убедиться, что они оба находятся в одном масштабе. Поэтому, когда вы смотрите на них, они кажутся одинаковыми. StereoCalibrate() нормализует возвращаемый F, поэтому вам необходимо нормализовать вычисленный F2, как вы отметили в одном из своих комментариев. Я надеюсь, что это делает более понятным, почему вам нужно это сделать.

person fireant    schedule 03.05.2012

Я отсылаю вас к фундаментальной песне Matix...

А если серьезно, возможно, это что-то «нормализующее» в точечных произведениях? Стандартная функция numpy dot, кажется, правильно действует для разделения матриц на отдельные векторы строк и столбцов для умножения.

Например, если я делаю:

A = mat(random.rand(3,3))
B = mat(random.rand(3,3))
dot(A,B) == A*B

Вместо этого мне интересно, помогает ли это выполнить прямое матричное умножение как:

F2 = np.linalg.inv(Mr.T) * E * np.linalg.inv(Ml)

(N.B. Здесь я работаю с матрицами numpy)

person timlukins    schedule 17.04.2012
comment
Я использую функцию точки numpy, потому что я работаю с массивами numpy. На самом деле я только что узнал, что масштабирование F2 через F2 /= F2[2,2] дает правильные результаты. Однако это все еще смущает меня, потому что согласно API мои вычисления сверху должны быть правильными. И, честно говоря, я не знаю, как песня добавляет к этому. Я знаю, что такое фундаментальная матрица, я просто хочу знать, почему OpenCV ошибается. - person fabee; 17.04.2012
comment
Ах, похоже, что некоторые из матриц были нормализованы/не нормализованы. Я никогда раньше не замечал этого с OpenCV. Я мог бы взглянуть на базовый исходный код. Песня была лишь беззаботной отсылкой. Извините, что запутал вас еще больше! - person timlukins; 17.04.2012
comment
Ах хорошо. Имеет ли значение, что матрица не нормализована? Я имею в виду, получу ли я неправильные результаты при дальнейшем использовании? Что касается песни, приношу свои извинения за некоторую резкость. Я уверен, что вы имели в виду это беззаботно. Меня просто раздражает, что функции на самом деле вычисляют разные вещи, чем указано в API. - person fabee; 17.04.2012
comment
Не беспокойся. Раздражает, когда что-то отличается от API. Я сам посмотрю на это, когда будет свободная минутка. Кстати, моя глупая ошибка из-за того, что я не привел приведенные выше примеры к матрицам mat(). Тогда это равно тому же самому. Редактирую выше. - person timlukins; 17.04.2012
comment
Спасибо. Я предположил в вашу пользу, что вы все перевели на матрицы :). - person fabee; 17.04.2012
comment
Однако один быстрый финал ... Я, кажется, помню, что основная матрица предназначена для использования с нормализованными координатами изображения, тогда как основная матрица является метрической (применяемой калибровочными матрицами). Интересно, где нормализовались ваши исходные точки калибровки? - person timlukins; 17.04.2012
comment
Нет, они не были. Я думаю, что вы имеете в виду, что если координаты нормированы, то фундаментальная матрица и основная матрица совпадают (поскольку матрица камеры становится тождественной). - person fabee; 17.04.2012
comment
Возможно, мой ответ проясняет, почему вам нужно нормализовать F2. - person fireant; 03.05.2012