У меня проблема с OpenCV различной параметризацией координат, используемых для калибровки камеры. Проблема состоит в том, что три разных источника информации по формулам искажения изображения, по-видимому, дают три неэквивалентных описания параметров и уравнений:
(1) В своей книге "Обучение OpenCV..." Брэдски и Каэлер пишут об искажении объектива (стр. 376):
xcorrected = x * ( 1 + k1 * r^2 + k2 * r^4 + k3 * r^6 ) + [ 2 * p1 * x * y + p2 * ( r^2 + 2 * x^2 ) ],
ycorrected = y * ( 1 + k1 * r^2 + k2 * r^4 + k3 * r^6 ) + [ p1 * ( r^2 + 2 * y^2 ) + 2 * p2 * x * y ],
где r = sqrt (x ^ 2 + y ^ 2).
Предположительно, (x, y) - это координаты пикселей в некорректированном захваченном изображении, соответствующем объектам с миром, с координатами (X, Y, Z), с кадром, на которые ссылаются, для которых
xcorrected = fx * ( X / Z ) + cx and ycorrected = fy * ( Y / Z ) + cy,
где fx, fy, cx и cy, являются внутренними параметрами камеры. Итак, имея (x, y) из захваченного изображения, мы можем получить желаемые координаты (xcorrected, ycorrected), чтобы создать неискаженное изображение захваченной мировой сцены, применив вышеприведенные первые два выражения коррекции.
Однако...
(2) Усложнение возникает, когда мы смотрим на ссылку OpenCV 2.0 C Reference в разделе "Калориметрирование камеры и 3D-реконструкция". Для удобства сравнения мы начинаем со всей мировой точкой (X, Y, Z) координат выражены по отношению к эталонной камере кадру, так же, как в # 1. Следовательно, матрица преобразования [R | t] не имеет значения.
В C-ссылке выражается, что:
x' = X / Z,
y' = Y / Z,
x'' = x' * ( 1 + k1 * r'^2 + k2 * r'^4 + k3 * r'^6 ) + [ 2 * p1 * x' * y' + p2 * ( r'^2 + 2 * x'^2 ) ],
y'' = y' * ( 1 + k1 * r'^2 + k2 * r'^4 + k3 * r'^6 ) + [ p1 * ( r'^2 + 2 * y'^2 ) + 2 * p2 * x' * y' ],
где r '= sqrt (x' ^ 2 + y '^ 2) и, наконец, что
u = fx * x'' + cx,
v = fy * y'' + cy.
Как видно, эти выражения не эквивалентны тем, которые представлены в # 1, в результате чего два набора исправленных координат (xcorrected, ycorrected) и (u, v) не совпадают. Почему противоречие? Мне кажется, что первый набор имеет больше смысла, поскольку я могу приложить физический смысл к каждому х и у там, в то время как я не нахожу никакого физического значения в x '= X/Z и y' = Y/Z, когда фокус камеры длина не равна 1. Кроме того, мы не можем вычислить x 'и y', поскольку мы не знаем (X, Y, Z).
(3) К сожалению, все становится еще более мрачным, когда мы ссылаемся на записи в Справочном руководстве по библиотеке Intel Open Source Computer Vision Library Lens Distortion (стр. 6-4), в котором говорится:
"Пусть (u, v) - истинные пиксельные координаты изображения, то есть координаты с идеальной проекцией и (u, v) - соответствующие реальные наблюдаемые (искаженные) координаты изображения. Аналогично, (x, y) являются (без искажений) и (x, y) являются реальными (искаженными) физическими координатами изображения. Принимая во внимание два члена расширения, получаем следующее:
x ̃ = x * ( 1 + k1 * r^2 + k2 * r^4 ) + [ 2 p1 * x * y + p2 * ( r^2 + 2 * x^2 ) ]
y ̃ = y * ( 1 + k1 * r^2 + k2 * r^4 ] + [ 2 p2 * x * y + p2 * ( r^2 + 2 * y^2 ) ],
где r = sqrt (x ^ 2 + y ^ 2)....
"Поскольку u = cx + fx * u и v = cy + fy * v,... результирующая система может быть переписана следующим образом:
u ̃ = u + ( u – cx ) * [ k1 * r^2 + k2 * r^4 + 2 * p1 * y + p2 * ( r^2 / x + 2 * x ) ]
v ̃ = v + ( v – cy ) * [ k1 * r^2 + k2 * r^4 + 2 * p2 * x + p1 * ( r^2 / y + 2 * y ) ]
Последние отношения используются для искажения изображений с камеры.
Ну, казалось бы, выражения, содержащие x и y, совпадали с двумя выражениями, приведенными в начале этой записи, включая xcorrected и ycorrected. Однако х и у не относятся к скорректированным координатам, в соответствии с данным описанием. Я не понимаю различие между значениями координат (x, y) и (u, v) или, если это имеет значение, между парами (x, y) и (u, v). Из их описаний видно, что их единственное отличие состоит в том, что (x, y) и (x, y) относятся к "физическим" координатам, а (u, v) и (u, v) - нет. О чем это различие? Разве это не все физические координаты? Я потерян!
Спасибо за любой вклад!