2016-01-20 9 views
4

У меня есть изображение, снятое с помощью стандартной камеры, как показано в приведенной ниже настройке. Мне посчастливилось предположить, что я знаю фокусное расстояние (в миллиметрах), коэффициент урожая и размер датчика, и можно предположить, что центр проекции является центром изображения - поэтому я знаю его положение в пикселях и в терминах датчик.Правильное изображение перспективы, заданное фокусное расстояние и положение/вращение камеры

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

Setup of camera over plane

Теперь мне нужно, чтобы получить метрику выпрямление изображения таким образом, что я могу измерить объект на голубой плоскости в миллиметрах (в 2D).

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

Мой поиск привел меня к этому подобный вопрос, но методология в ответах не работает для меня (пояснено ниже): How to do perspective correction in Matlab from known Intrinsic and Extrinsic parameters?

Я попытался вычисления внутренние и внешние матрицы, то получение гомография:

f = 4.9; % Focal length is given as 4.9mm 
sensor_size = [6.17 4.55]; % Again in mm 
cc = sensor_size ./ 2; 

% Calculate intrinsic matrix 
KK = [f 0 cc(1);0 f cc(2); 0 0 1]; 

theta = 21.8; % Angle of camera above plane, degrees 
Rc = xrotate(theta) % xrotate fcn given below 
Tc = [0 0 60]'; % Camera is 60mm above plane along camera z-axis 

H = KK * [R(:,1) R(:,2) Tc]; 
figure;imshow(imtransform(I,maketform('projective',H), 'Size', image_size)) 

function R = xrotate(theta) 
    R = [ 1 0 0; 
      0 cosd(theta) sind(theta); 
      0 -sind(theta) cosd(theta) ];   
end 

К сожалению, это дает мне барахло - учитывая полноразмерный оригинал этого изображения:

Downscaled input image

я получаю этот результат из приведенной выше коды:

Result of homography calculated using above

Учитывая его лишь вращение по оси X. Я думаю, что мы должны получить форму трапеции, как результат омографии, но я не кажется. Может ли кто-нибудь указать на очевидные ошибки, которые я здесь сделал?

ответ

0

Вы смешиваете пиксели и мм. Экспресс-матрица KK в пиксельных единицах, используя известную ширину и высоту изображения в качестве коэффициентов масштабирования.

+0

Спасибо, я был обеспокоен тем, что может быть так. К сожалению, их замена для значений пикселей (масштаб, рассчитанный с использованием размера датчика и размера изображения), по-видимому, не значительно улучшает результат. – n00dle