Хорошо, я думаю, что теперь я полностью понимаю это после анализа функций (windows) панели инструментов калибровки Scaramuzza, см. https://sites.google.com/site/scarabotix/ocamcalib-toolbox/ocamcalib-toolbox-download-page
Метод 1 найден в файле " world2cam.m "
Для проекции используйте то же уравнение, что и выше. В проекционном случае уравнение имеет три известные (x, y, z) и три неизвестные переменные (u, v и лямбда). Сначала мы заменяем лямбду на rho, понимая, что
u = x/lambda
v = y/lambda
rho=sqrt(u^2+v^2) = 1/lambda * sqrt(x^2+y^2) --> lambda = sqrt(x^2+y^2) / rho
После этого у нас есть неизвестные переменные (u, v и rho)
u = x/lambda = x / sqrt(x^2+y^2) * rho
v = y/lambda = y / sqrt(x^2+y^2) * rho
z / lambda = z /sqrt(x^2+y^2) * rho = a0 + a2*rho^2 + a3*rho^3 + a4*rho^4
Как видно, последнее уравнение теперь есть только одно неизвестное, а именно rho. Таким образом, мы можем легко решить эту проблему, используя, например, функцию корней в Matlab. Однако результат не всегда существует и не обязательно является уникальным. После решения неизвестной переменной rho вычисление uv очень просто, используя приведенное выше уравнение.
Эту процедуру необходимо выполнять для каждой точки (x, y, z) отдельно и, таким образом, она довольно затратна в вычислительном отношении для изображения.
Метод 2 найден в файле "world2cam_fast.m"
Последнее уравнение имеет вид rho (x, y, z). Однако, если мы определим m = z / sqrt (x ^ 2 + y ^ 2) = tan (90 ° -тета), это зависит только от одной переменной, а именно rho (m).
Вместо того, чтобы решать это уравнение rho (m) для каждого нового m, авторы «строят» функцию для нескольких значений m и подгоняют полином 8-го порядка к этим точкам. Используя этот полином, они могут вычислить приблизительное значение для rho (m) намного быстрее в следующем.
Это становится понятным, потому что "world2cam_fast.m" использует ocam_model.pol, который вычисляется в "неискаженном виде". м». «undistort.m», в свою очередь, использует «findinvpoly.m».