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

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

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

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

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 - столбцы. Таким образом, нужно заменить 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: В 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);

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

Другие вопросы по тегам