2016-10-01 12 views
0

Я работаю над проблемой, связанной с калибровкой камеры. В приведенном ниже изображении мы рассмотрим мировую систему координат с осью X, идущей влево, ось Y вправо и ось Z вверх. Выберем 15 точек (x, y, z), равномерно распределенных по 3 плоскостям. Расстояние между линиями сетки составляет 1 дюйм. Мы также получаем координаты MATLAB для 15 пикселей (u, v). Цель состоит в том, чтобы получить матрицу 3x4 камер (M) с использованием однородных линейных наименьших квадратов, а затем проецировать точки мира (x, y, z) на изображение (u ', v'), используя M. Я написал код, чтобы сделать это но координаты, которые я получаю (u ', v'), по-видимому, очень малы по сравнению с фактическими координатами (u, v). Ошибка RMS слишком велика, и проецируемые точки даже не отображают изображение в непосредственной близости от фактических точек. Есть ли масштабирование, которое мне нужно сделать, чтобы преобразовать его в координаты MATLAB? Я также включаю код, который не очень хорошо написан, так как я относительно новичок в MATLAB. Grid imageКалибровка камеры: отображение 3D-2D-точек

P=[];% 2nx12 matrix - 30x12 matrix 
for i=1:15 %compute P 
    world_row = world_coords(i,:); % 3d homogeneous coordinates (x,y,z,1) 
    zeroelem = repelem(0,4); 
    image_coord = image_coords(i,:); 
    img_u = image_coord(1); 
    prod = -img_u*world_row; 
    row1 = [world_row,zeroelem,prod]; 
    zeroelem = repelem(0,3); 
    img_v = image_coord(2); 
    prod = -img_v*world_row; 
    row2 = [0,world_row,zeroelem,prod]; 
    P=[P;row1;row2]; 
    end 
var1 = P'*P; 
[V,D] = eig(var1');//compute eigen vector corresponding to least eigen value 
m = V(:,1); //unit vector of norm 1 
M = reshape(m,3,4); //camera matrix of 3x4 size 
%get projected points 
proj = M*world_coords'; 
U = proj (1,:); 
V = proj (2,:); 
W = proj (3,:); 
for i=1:15 
    U(i) = U(i)/W(i); 
    V(i) = V(i)/W(i); 
end 
final = [U;V];//(u',v') 

15 points across the 3 planes

Я также включая изображение с 15 очками я выбрал. Возьмите P1 (u, v) = (286,260) и P1 (x, y, z) = (4,0,3). Полученный для этого (u ', v') I имеет низкие значения. Может ли кто-нибудь указать мне, что я делаю неправильно?

ответ

0

Это была глупая ошибка от меня, которая давала мне неправильную матрицу камеры. Я неправильно записал мировые координаты точки P ((7,0,1) вместо (1,0,1)). Это привело к ошибочно сформированной матрице 30 × 12, которую мы используем для формирования уравнения, которое должно быть решено однородными линейными наименьшими квадратами. Я получил калибровочную матрицу, которая проецирует 3D-точки с низкой ошибкой RMS после исправления этой ошибки. enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^