Оценка расстояния до точки с использованием калибровки камеры
Я хочу оценить расстояние (камера до точки на земле: это означает, что Yw=0) от заданной пиксельной координаты этой точки. Для этого я использовал методы калибровки камеры
Но результаты не имеют смысла.
У меня есть следующие детали для калибровки
-фокусное расстояние x и y, главная точка x и y, эффективный размер пикселя в метрах, углы рыскания и тангажа, высота камеры и т. д.
-Я ввел фокусное расстояние, главные точки и вектор перевода в терминах пикселей для расчета
-Я умножил точку изображения на camera_matrix, а затем вращал | матрица перевода (R|t), чтобы получить мировую точку.
Моя процедура правильная?? Что может быть не так?
результат
image_point(x,y) =400 380
координата точки мира (расстояние) = 12,53
image_point(x,y) =400 180
координата точки мира (расстояние) = 5,93
проблема Я получаю очень мало пикселей для координаты z, это означает, что координата z составляет << 1 м (потому что эффективный размер пикселя в метрах = 10 ^-5)
Это мой код Matlab
%positive downward pitch
xR = 0.033;
yR = 0;
zR = pi;
%effective pixel size in meters = 10 ^-5 ; focal_length x & y = 0.012 m
% principal point x & y = 320 and 240
intrinsic_params =[1200,0,320;0,1200,240;0,0,1];
Rx=[1,0,0 ; 0,cos(xR),sin(xR); 0,-sin(xR),cos(xR)];
Ry=[cos(yR),0,-sin(yR) ; 0,1,0 ; sin(yR),0,cos(yR)];
Rz=[cos(zR),sin(zR),0 ; -sin(zR),cos(zR),0 ; 0,0,1];
R= Rx * Ry * Rz ;
% The camera is 1.17m above the ground
t=[0;117000;0];
extrinsic_params = horzcat(R,t);
% extrinsic_params is 3 *4 matrix
P = intrinsic_params * extrinsic_params; % P 3*4 matrix
% make it square ....
P_sq = [P; 0,0,0,1];
%image size is 640 x 480
%An arbitary pixel 360,440 is entered as input
image_point = [400,380,0,1];
% world point will be in the form X Y Z 1
world_point = P_sq * image_point'
Спасибо
1 ответ
Ваша процедура в некотором роде правильна, однако она идет в неправильном направлении. Смотрите эту ссылку. Используя свою внутреннюю и внешнюю калибровочную матрицу, вы можете найти положение в пикселях в пространстве реального вектора, а НЕ наоборот. Исключением является ситуация, когда ваша камера неподвижна в глобальном кадре, и у вас есть положение Z объекта в глобальном пространстве.
Стационарная камера, известная функция Z case: (см. Также эту ссылку)
%% First we simulate a camera feature measurement
K = [0.5 0 320;
0 0.5 240;
0 0 1]; % Example intrinsics
R = rotx(0)*roty(0)*rotz(pi/4); % orientation of camera in global frame
c = [1; 1; 1]; %Pos camera in global frame
rwPt = [ 10; 10; 5]; %position of a feature in global frame
imPtH = K*R*(rwPt - c); %Homogeneous image point
imPt = imPtH(1:2)/imPtH(3) %Actual image point
%% Now we use the simulated image point imPt and the knowledge of the
% features Z coordinate to determine the features X and Y coordinates
%% First determine the scaling term lambda
imPtH2 = [imPt; 1];
z = R.' * inv(K) * imPtH2;
lambda = (rwPt(3)-c(3))/z(3);
%% Now the RW position of the feature is:
rwPt2 = c + lambda*R.' * inv(K) * imPtH2 % Reconstructed RW point
Нестационарный чехол для камеры:
Чтобы найти реальное положение или расстояние от камеры до определенной функции (заданной на плоскости изображения), вы должны использовать некоторый метод восстановления 3D-данных из 2D-изображения.
Два, которые сразу же приходят на ум, - это opencv solvePnP и оценка глубины стереозрения. Для решения solvePnP необходимы 4 копланарные (в пространстве RW) функции, и положение объектов в пространстве RW известно. Это может показаться бесполезным, так как вам нужно знать положение объектов RW, но вы можете просто определить 4 объекта с известным смещением, а не положение в глобальном кадре - результатом будет относительное положение камеры в фрейм, в котором определены функции. solvePnP дает очень точную оценку положения камеры. Смотрите мой пример.
Для оценки глубины стереозрения требуется, чтобы одна и та же особенность была обнаружена на двух пространственно-отдельных изображениях, и преобразование между изображениями в пространстве RW должно быть известно очень точно.
Могут быть и другие методы, но я знаком с этими двумя.