У меня есть проблема с различной параметризацией OpenCV координат, используемых в целях калибровки фотоаппарата. Проблема состоит в том, что три других источника информации о формулах искажения изображения, по-видимому, дают три неэквивалентных описания параметров и включенных уравнений:
(1) В их книге "Изучение OpenCV …" Bradski и запись Kaehler относительно искажения объектива (страница 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).
Assumably, (x, y) являются координатами пикселей в неисправленном полученном изображении, соответствующем мировым точечным объектам с координатами (X, Y, Z), кадр камеры, на который ссылаются, для который
xcorrected = fx * ( X / Z ) + cx and ycorrected = fy * ( Y / Z ) + cy,
где fx, финансовый год, cx, и cy, являются внутренними параметрами камеры. Так, имея (x, y) из полученного изображения, мы можем получить желаемые координаты (xcorrected, ycorrected) к произведенному неискаженное изображение полученной мировой сцены путем применения вышеупомянутого сначала два выражения исправления.
Однако...
(2) Сложность возникает, поскольку мы смотрим на ссылку OpenCV 2.0 C при Калибровке фотоаппарата и 3D разделе Reconstruction. Для простоты сравнения мы запускаем со всей мировой точки (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 и Y там, в то время как я не нахожу физического значения в x' = X / Z и y' = Y / Z, когда фокусное расстояние камеры не точно 1. Кроме того, нельзя вычислить x' и y', поскольку мы не знаем (X, Y, Z).
(3) К сожалению, вещи становятся еще более темными, когда мы обращаемся к записям в разделе Lens Distortion Руководства Справочного руководства по библиотеке Машинного зрения Intel С открытым исходным кодом (страница 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 + финансовый год * 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 ̃ не относятся к исправленным координатам, согласно данному описанию. Я не понимаю различия между значением координат (x ̃, y ̃) и (u ̃, v ̃), или в этом отношении, между парами (x, y) и (u, v). Из их описаний кажется, что их единственное различие - то, что (x ̃, y ̃) и (x, y) относятся к 'физическим' координатам, в то время как (u ̃, v ̃) и (u, v) не делают. О чем является это различие всеми? Разве они все не физические координаты?Я заблудился!
Спасибо за любой вход!
Не существует единой формулы для калибровки камеры, все они действительны. Обратите внимание, что первый содержит константы K1, K2 и K3 для r ^ 2, r ^ 4 и r ^ 6, а два других имеют константы только для r ^ 2 и r ^ 4? Это потому, что все они приблизительные модели. Первый, вероятно, будет более точным, поскольку у него больше параметров.
Каждый раз, когда вы видите:
r = sqrt( x^2 + y^2 )
, вероятно, безопасно принять x = (пиксель координаты x) - (центр камеры в пикселях), поскольку r обычно означает радиус от центра.
Кстати, что вы пытаетесь сделать? Оценить параметры камеры, скорректировать искажение объектива или и то, и другое?