Как выполнить коррекцию перспективы в Matlab по известным внутренним и внешним параметрам? - PullRequest
14 голосов
/ 13 мая 2011

Я использую Matlab для калибровки камеры, используя Жан- Набор инструментов для калибровки камеры Ива Буге . У меня есть все камеры параметры из процедуры калибровки. Когда я использую новое изображение не в наборе калибровки я могу получить его уравнение преобразования, например, Xc = R * X + T, где X - трехмерная точка калибровочной установки (плоская) в кадр мира и Xc его координаты в кадре камеры. В других слова, у меня есть все (как внешние, так и внутренние параметры).

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

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

Ответы [ 2 ]

4 голосов
/ 05 января 2012

Всем, кто все еще интересуется этим после стольких месяцев, мне удалось получить правильную матрицу гомографии, используя код Ковеси (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 - столбцам. Таким образом, необходимо заменить xy в уравнениях (как вы, вероятно, увидите в приведенном выше коде). Кроме того, мне удалось вычислить матрицу гомографии только из параметров, но результат был немного отключен (возможно, ошибки округления в наборе инструментов калибровки). Лучший способ сделать это - выше.

Если вы хотите использовать только параметры камеры (то есть не используйтеКод Ковеси), то матрица гомографии будет 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
1 голос
/ 15 июля 2011

Подход 1: В Camera Calibration Toolbox вы должны заметить, что для каждого изображения вашей шахматной доски в вашем рабочем пространстве имеется 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);

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

...