我正在使用OpenCV的相机校准功能,我在转盘上有34张棋盘格,是从静态相机拍摄的。从最初的tvec开始的摄像机位置大致正确,但rvec完全错误。我在matlab中绘制了方向以表明问题。
我使用的公式应该是正确的,例如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
答案 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
答案 1 :(得分:0)
要显示相机方向,请尝试使用计算机视觉系统工具箱中的plotCamera功能。
当你在场时,试试Camera Calibrator app。