Как выполнить коррекцию перспективы в Matlab по известным внутренним и внешним параметрам?

Я использую Matlab для калибровки камеры с помощью Jean-Yves Bouget Camera Calibration Toolbox. У меня есть все параметры камеры из процедуры калибровки. Когда я использую новое изображение, не входящее в калибровочный набор, я могу получить его уравнение преобразования, например. Xc=R*X+T, где X — 3D-точка калибровочной установки (планарной) в мировом кадре, а Xc — ее координаты в кадре камеры. Другими словами, у меня есть все (и внешние, и внутренние параметры).

Что я хочу сделать, так это выполнить коррекцию перспективы на этом изображении, т. Е. Я хочу, чтобы оно удалило любую перспективу и увидело неискаженную калибровочную установку (это шахматная доска).

В новом наборе инструментов компьютерного зрения Matlab есть объект, который выполняет перспективное преобразование изображения с заданной матрицей 3X3 H. Проблема в том, что я не могу вычислить эту матрицу по известным внутренним и внешним параметрам!


person GMus    schedule 13.05.2011    source источник
comment
Я бы тоже хотел знать ответ на это. Я чувствую, что в этой статье может быть некоторая подсказка: webee. technion.ac.il/~lihi/Publications/, хотя у меня не было времени его прочитать и переварить.   -  person n00dle    schedule 13.05.2011


Ответы (2)


Всем, кто все еще интересуется этим после стольких месяцев, мне удалось получить правильную матрицу гомографии, используя код Ковеси (http://www.csse.uwa.edu.au/~pk/research/matlabfns), и особенно функцию homography2d.m. Однако вам понадобятся значения пикселей четырех углов установки. Если камера устойчиво зафиксирована, то вам нужно будет сделать это один раз. См. пример кода ниже:

%get corner pixel coords from base image
p1=[33;150;1];
p2=[316;136;1];
p3=[274;22;1];
p4=[63;34;1];
por=[p1 p2 p3 p4];
por=[0 1 0;1 0 0;0 0 1]*por;    %swap x-y <--------------------

%calculate target image coordinates in world frame
% rig is 9x7 (X,Y) with 27.5mm box edges
XXw=[[0;0;0] [0;27.5*9;0] [27.5*7;27.5*9;0] [27.5*7;0;0]];
Rtarget=[0 1 0;1 0 0;0 0 -1]; %Rotation matrix of target camera (vertical pose)
XXc=Rtarget*XXw+Tc_ext*ones(1,4); %go from world frame to camera frame
xn=XXc./[XXc(3,:);XXc(3,:);XXc(3,:)]; %calculate normalized coords
xpp=KK*xn;  %calculate target pixel coords

% get homography matrix from original to target image
HH=homography2d(por,xpp);
%do perspective transformation to validate homography
pnew=HH*por./[HH(3,:)*por;HH(3,:)*por;HH(3,:)*por]; 

Это должно делать свое дело. Обратите внимание, что Matlab определяет ось x в изображении как индекс строк и y как столбцы. Таким образом, в уравнениях нужно поменять местами x-y (как вы, вероятно, увидите в приведенном выше коде). Кроме того, мне удалось вычислить матрицу гомографии исключительно из параметров, но результат был немного неверным (возможно, ошибки округления в наборе инструментов калибровки). Лучший способ сделать это выше.

Если вы хотите использовать только параметры камеры (то есть не использовать код Ковеси), то матрица гомографии будет H=KK*Rmat*inv_KK. В этом случае код,

% corner coords in pixels
p1=[33;150;1];
p2=[316;136;1];
p3=[274;22;1];
p4=[63;34;1];
pmat=[p1 p2 p3 p4];
pmat=[0 1 0;1 0 0;0 0 1]*pmat; %swap x-y

R=[0 1 0;1 0 0;0 0 1];  %rotation matrix of final camera pose
Rmat=Rc_ext'*R;  %rotation from original pose to final pose
H=KK*Rmat*inv_KK; %homography matrix
pnew=H*pmat./[H(3,:)*pmat;H(3,:)*pmat;H(3,:)*pmat]; %do perspective transformation

H2=[0 1 0;-1 0 0;0 0 1]*H;  %swap x-y in the homography matrix to apply in image
person Jorge    schedule 05.01.2012

Подход 1: В наборе инструментов для калибровки камеры вы должны заметить, что для каждого изображения вашей шахматной доски в рабочей области есть матрица H. Я еще не знаком с набором инструментов компьютерного зрения, но, возможно, это та матрица, которая вам нужна для вашей функции. Кажется, что H вычисляется так:

KK = [fc(1) fc(1)*alpha_c cc(1);0 fc(2) cc(2); 0 0 1];
H = KK * [R(:,1) R(:,2) Tc]; % where R is your extrinsic rotation matrix and Tc the translation matrix
H = H / H(3,3);

Подход 2: Если функция набора инструментов компьютерного зрения не работает для вас, чтобы найти предполагаемую проекцию изображения, я использовал interp2 работает следующим образом:

[X, Y] = meshgrid(0:size(I,2)-1, 0:size(I,1)-1);
im_coord = [X(:), Y(:), ones(prod(size(I_1)))]';
% Insert projection here for X and Y to XI and YI
ZI = interp2(X,Y,Z,XI,YI);

Я использовал перспективные проекции в проекте некоторое время назад, и я считаю, что вам нужно использовать однородные координаты. Я думаю, что нашел эту статью в Википедии весьма полезной.

person cwadding    schedule 15.07.2011