使用matlab通过OpenCV从摄像机校准结果显示摄像机方向

时间:2015-04-10 10:08:57

标签: matlab opencv matlab-cvst calibration

我正在使用OpenCV的相机校准功能,我在转盘上有34张棋盘格,是从静态相机拍摄的。从最初的tvec开始的摄像机位置大致正确,但rvec完全错误。我在matlab中绘制了方向以表明问题。

orientation plot

我使用的公式应该是正确的,例如this

我的问题是为什么这些方向是错误的?校准算法是正常的吗? Matlab使用Z作为向上轴,这可能是我的可视化代码问题吗?

感谢。

更新

我把我的情节代码放在这里,我怀疑它有问题。

function drawCameraPoses(rvec, tvec)

if (size(tvec,2) ~= 3 || size(tvec,1) <= 0)
    disp('tvec must contain 3 columns and greater than 0 row') ;
    exit ;
end

if (size(rvec) ~= size(tvec))
    disp('rvec must be at the same size of the tvec.') ;
end


%plot camera positions
figure ;
%watch out xyz order
plot3(tvec(:,1), tvec(:,3), tvec(:,2),'r+') ;
hold on ;
grid on ;

plotrange = [max(tvec);min(tvec)] ;
disp(plotrange)
xyrange = [max([plotrange(1,1),plotrange(1,3)]) ; min([plotrange(2,1),plotrange(2,3)])];
disp(xyrange)
plotscaleFactor = 1.5 ;

xlim([xyrange(2) - abs(xyrange(2))*(plotscaleFactor - 1.0), xyrange(1) + abs(xyrange(1))*(plotscaleFactor - 1.0)]) ;
ylim([xyrange(2) - abs(xyrange(2))*(plotscaleFactor - 1.0), xyrange(1) + abs(xyrange(1))*(plotscaleFactor - 1.0)]) ;
zlim([plotrange(2,2) - abs(plotrange(2,2)) * (plotscaleFactor - 1.0), plotrange(1,2) + abs(plotrange(1,2)) * (plotscaleFactor - 1.0)]) ;

%plot camera orientation

for i = 1 : size(rvec,1)
    [x,y,z] = getEndPoint(tvec(i,:),rvec(i,:)) ;
    line([tvec(i,1), x],[tvec(i,3),z],[tvec(i,2),y],'Color','r');
end


end

function [x,y,z] = getEndPoint(t,r)
length = 50 ;
unitR = r / norm(r) ;
unitR = unitR * length ;
x = t(1) + unitR(1) ;
y = t(2) + unitR(2) ;
z = t(3) + unitR(3) ;
end

2 个答案:

答案 0 :(得分:1)

实际上,输出rvec和tvec应该形成变换矩阵而不是简单的坐标赋值。所以受到calibration toolbox的启发。

显示相机姿势的代码是,

function drawCameraPoses(rvec, tvec, flag)

if (size(tvec,2) ~= 3 || size(tvec,1) <= 0)
    disp('tvec must contain 3 columns and greater than 0 row') ;
    exit ;
end

if (size(rvec) ~= size(tvec))
    disp('rvec must be at the same size of the tvec.') ;
end

if ~flag
    %raw rvec tvec
    for i = 1:size(tvec,1)
        rotM = rodrigues(rvec(i,:)) ;
        tvec(i,:) = -rotM'* tvec(i,:)' ;
        rvec(i,:) = rodrigues(rotM') ;
    end
end

%plot camera positions
figure ;
%watch out xyz order
plot3(tvec(:,1), tvec(:,2), tvec(:,3),'r+') ;
hold on ;
grid on ;

xlim([-1 1]) ;
ylim([-1 1]) ;
zlim([-1 1]) ;

%plot camera orientation
baseSymbol = 0.2 * [0 1 0 0 0 0;0 0 0 1 0 0;0 0 0 0 0 1] ;
for i = 1 : size(rvec,1)
   %rotM already transposed
   rotM = rodrigues(rvec(i,:)) ;
   baseK = rotM * baseSymbol + tvec(i,:)' * ones(1,6) ;
   plot3(baseK(1,:),baseK(2,:), baseK(3,:),'-b') ;
end


end

enter image description here

答案 1 :(得分:0)

要显示相机方向,请尝试使用计算机视觉系统工具箱中的plotCamera功能。

当你在场时,试试Camera Calibrator app