关于张正友棋盘标定法的问题,如何确定世界坐标?单应性矩阵怎么建立?

kk284260916 2017-03-01 04:13:50
读过张正友算法的论文,大概明白该算法标定的思想,但在实现过程中遇到一些问题。
1、需要在不同角度拍摄图片
算法需要的数据是一些棋盘格子的世界坐标和对应的像素坐标。那么世界坐标如何确定?
按照张正友教授文章中所说,通过移动棋盘或者相机,拍摄一些图片。
那么移动棋盘或相机,都会造成世界坐标系的改变,那么用这些标定的结果反求世界坐标,会求出不同的世界坐标。
还是说,不以棋盘为绝对世界坐标,按照摄像机视野规定一个绝对世界坐标,然后确定棋盘在这个坐标系中的坐标,那么此时棋盘无论如何移动都在绝对世界坐标系下,就可以了?但是如果通过移动摄像机获得多张图像,那么每次都会改变世界坐标系,此时得到的方程解出的数据应该会有问题吧?感觉很困惑。
2、如何建立单应性矩阵?
在阅读Matlab算法程序过程中,对于建立单应性矩阵的函数没有看懂。
function H = homography2d(varargin)

[x1, x2] = checkargs(varargin(:));% varargin"变长度输入宗量列表"varargin本身是个元胞数组
M=x1; % varargout"变长度输出宗量列表"
m=x2;
% Attempt to normalise( 规格化)each set of points so that the origin
% is at centroid (质心)and mean distance from origin is sqrt(2).(因为是正方形)
[x1, T1] = normalise2dpts(x1);
[x2, T2] = normalise2dpts(x2);

% Note that it may have not been possible to normalise
% the points if one was at infinity so the following does not
% assume that scale parameter w = 1.
% Estimation of the H between the model plane and its image, P18建立单应性矩阵
Npts = length(x1);
A = zeros(3*Npts,9);%A为超定方程

O = [0 0 0];
for n = 1:Npts
X = x1(:,n)';%定义
x = x2(1,n);y = x2(2,n); w = x2(3,n);
A(3*n-2,:) = [ O -w*X y*X];
A(3*n-1,:) = [ w*X O -x*X];
A(3*n ,:) = [-y*X x*X O ];
end

[U,D,V] = svd(A);
% Ax=b x=A\b;
% Extract homography单应性矩阵
H1 = reshape(V(:,9),3,3)'

% Denormalize反向规格化,
H2= T2\H1*T1;
H=H2/H2(3,3);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Maximun likelihood estimation for the H最大似然估计
% using the function(10), P7
options = optimset('LargeScale','off','LevenbergMarquardt','on');
[x,resnorm,residual,exitflag,output] = lsqnonlin( @simon_H, reshape(H,1,9) , [],[],options,m, M);
H=reshape(x,3,3);
H=H/H(3,3);

Row = size(M,2);
Temp = zeros(Row*2,8);
Temp(1:Row,1) = M(1,:);
Temp(1:Row,2) = M(2,:);
Temp(1:Row,3) = M(3,:);
Temp(Row+1:Row*2,4) = M(1,:);
Temp(Row+1:Row*2,5) = M(2,:);
Temp(Row+1:Row*2,6) = M(3,:);
Goal = zeros(Row,1);
for i=1:Row
Temp(i,7) = -m(1,i,1)*M(1,i);
Temp(i,8) = -m(1,i,1)*M(2,i);

Temp(Row+i,7) = -m(2,i,1)*M(1,i);
Temp(Row+i,8) = -m(2,i,1)*M(2,i);
Goal(i) = -m(1,i,1)*M(3,i);
Goal(Row+i) = -m(2,i,1)*M(3,i);
end

HH = [];HH = inv(Temp'*Temp)*Temp'*Goal;
kk = [];kk = Temp*HH-Goal;sumkk = kk'*kk;
HH1 = [];HH1 = [H(1,:),H(2,:),H(3,:)]';
kk1 = [];kk1 = -Temp*HH1(1:8) - Goal;sumkk1 = kk1'*kk1;
[sumkk sumkk1]
...全文
3134 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ai智享 2018-11-06
  • 打赏
  • 举报
回复
你好!也就是说世界坐标系中的点坐标是根据棋盘格的尺寸算出来的是吧? 可以理解为在计算内外参之前这些坐标就已知了吗?
qq_41247319 2018-08-08
  • 打赏
  • 举报
回复
引用 6 楼 u012947309 的回复:
[quote=引用 5 楼 jieleiping 的回复:]
[quote=引用 4 楼 u012947309 的回复:]
世界系以标定板为基准。
不管你移动相机还是移动标定板,你获得的点永远是固定个数。
我一般是定义标定板最左上角的那个点为(0.0)点。

请问其他点如何设置?要考虑标定板上方块的实际大小么?
[/quote]

需要考虑实际大小.是多少写多少就行了.
你可以理解为我们计算的是真实世界坐标系跟相机坐标系之间的"比例"关系.(实际是一个比例加转换关系)
那自然需要求解方块实际比例和单个像素的比例.

(0,0)(0,40)(0,80)
(40,0)(40,40)(40,80)这些即可[/quote]
您好,我想请教一下,关于标定过程中对一张图像进行一次单目标定可以得到RT矩阵,即世界坐标系与相机坐标系间的转换关系,那这个T矩阵怎么表示棋盘格与相机之间的平移关系,他们的中心点在什么地方?
NoEdUl 2018-07-23
  • 打赏
  • 举报
回复
引用 5 楼 jieleiping 的回复:
[quote=引用 4 楼 u012947309 的回复:]
世界系以标定板为基准。
不管你移动相机还是移动标定板,你获得的点永远是固定个数。
我一般是定义标定板最左上角的那个点为(0.0)点。

请问其他点如何设置?要考虑标定板上方块的实际大小么?
[/quote]

需要考虑实际大小.是多少写多少就行了.
你可以理解为我们计算的是真实世界坐标系跟相机坐标系之间的"比例"关系.(实际是一个比例加转换关系)
那自然需要求解方块实际比例和单个像素的比例.

(0,0)(0,40)(0,80)
(40,0)(40,40)(40,80)这些即可
jieleiping 2018-07-22
  • 打赏
  • 举报
回复
引用 4 楼 u012947309 的回复:
世界系以标定板为基准。
不管你移动相机还是移动标定板,你获得的点永远是固定个数。
我一般是定义标定板最左上角的那个点为(0.0)点。

请问其他点如何设置?要考虑标定板上方块的实际大小么?
NoEdUl 2017-03-09
  • 打赏
  • 举报
回复
世界系以标定板为基准。 不管你移动相机还是移动标定板,你获得的点永远是固定个数。 我一般是定义标定板最左上角的那个点为(0.0)点。
shiter 2017-03-02
  • 打赏
  • 举报
回复
shiter 2017-03-02
  • 打赏
  • 举报
回复



其实主要是为了获取摄像机的内参数,顺便计算畸变参数吧,好久远了,忘差不多了



学习opencv中文版406页
ssbqrm 2017-03-02
  • 打赏
  • 举报
回复
用这个matlab的标定工具箱标定一次你就会有所理解 http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html

4,448

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧