线性直接变换方法对摄像机进行标定
?具體實現過程如下:
1.從不同角度用攝像機對立方體盒子進行拍攝,得到一幅圖像。如下:
?
2.在立方體盒子上選取至少6個點,獲取這6個點的圖像坐標和空間點坐標(世界坐標系自己設定)。如:
7 %點個數
0 0 0%空間點的世界坐標
0 0 48
50 0 0
0 59 0
0 59 48
50 0 48
50 59 48
?
1538 1619%空間點對應的圖像坐標
1533 1012
1749 1244
814 1414
730 855
1771 707
1077 603
3.編程計算攝像機矩陣CM,完成標定。(Matlab實現的)
代碼如下:
clc
% 打開文件
fid_l=fopen('C:\Documents and Settings\duan\桌面\我的工作\inputdata_l.txt','r');
% 點的數目
tem_l =fscanf(fid_l,'%i',1);
var_l =tem_l;
% 空間點集
WPoint_l = zeros(var_l,3);
% 圖像點集
CPoint_l = zeros(var_l,2);
A_l = zeros(2*var_l,11);
for i = 1:1:var_l
?? ?[A_l,count_l]=fscanf(fid_l,'%f %f %f',[1,3]);
?? ?WPoint_l(i,1)=A_l(1);
?? ?WPoint_l(i,2)=A_l(2);
?? ?WPoint_l(i,3)=A_l(3);
end
for i = 1:1:var_l
?? ?[A_l,count_l]=fscanf(fid_l,'%f %f',[1,2]);
?? ?CPoint_l(i,1)=A_l(1);
?? ?CPoint_l(i,2)=A_l(2);
end
fclose(fid_l);
WPoint_l;
CPoint_l;
for i =1:1:var_l
?? ?m = 2*(i-1)+1;
?? ?n = 2*i;
?? ?A_l(m,1) = WPoint_l(i,1);
?? ?A_l(m,2) = WPoint_l(i,2);
?? ?A_l(m,3) = WPoint_l(i,3);
?? ?A_l(m,4) = 1;
?? ?A_l(m,5) = 0;
?? ?A_l(m,6) = 0;
?? ?A_l(m,7) = 0;
?? ?A_l(m,8) = 0;
?? ?A_l(m,9) ?= -WPoint_l(i,1)*CPoint_l(i,1);
?? ?A_l(m,10) = -WPoint_l(i,2)*CPoint_l(i,1);
?? ?A_l(m,11) = -WPoint_l(i,3)*CPoint_l(i,1);
?? ?A_l(n,1) ?= 0;
?? ?A_l(n,2) ?= 0;
?? ?A_l(n,3) ?= 0;
?? ?A_l(n,4) ?= 0;
?? ?A_l(n,5) ?= WPoint_l(i,1);
?? ?A_l(n,6) ?= WPoint_l(i,2);
?? ?A_l(n,7) ?= WPoint_l(i,3);
?? ?A_l(n,8) ?= 1;
?? ?A_l(n,9) ?= -WPoint_l(i,1)*CPoint_l(i,2);
?? ?A_l(n,10) = -WPoint_l(i,2)*CPoint_l(i,2);
?? ?A_l(n,11) = -WPoint_l(i,3)*CPoint_l(i,2);
end
?
?B_l = zeros(2*var_l,1);
?for i = 1:1:var_l
?? ? B_l(2*(i-1) + 1) = CPoint_l(i,1);
?? ? B_l(2*i) = CPoint_l(i,2);
?end
% ?A_l
% ?B_l
?p = A_l\B_l;
?p1 = [p;1.0];
?p1 = reshape(p1,4,3);
?CM_l = p1';
?%CM_l 即為要求的左攝像機矩陣
?CM_l ? ? ?
?
?
?
%這段代碼的作用是驗證所求的攝像機矩陣的正確性
% ?c =[30;-30;0;1];
% ?t =CM_l*c
% ?t(1)=t(1)/t(3);
% ?t(2)=t(2)/t(3);
% ?t(3)=t(3)/t(3);
% ?t
?
% 打開文件
fid_r = fopen('C:\Documents and Settings\duan\桌面\我的工作\inputdata_r.txt','r');
% 點的數目
tem_r = fscanf(fid_r,'%i',1);
var_r = tem_r;
% 空間點集
WPoint_r = zeros(var_r,3);
% 圖像點集
CPoint_r = zeros(var_r,2);
A_r = zeros(2*var_r,11);
for i = 1:1:var_r
?? ?[A_r,count_r] = fscanf(fid_r,'%f %f %f',[1,3]);
?? ?WPoint_r(i,1) = A_r(1);
?? ?WPoint_r(i,2) = A_r(2);
?? ?WPoint_r(i,3) = A_r(3);
end
for i = 1:1:var_r
?? ?[A_r,count_r] = fscanf(fid_r,'%f %f',[1,2]);
?? ?CPoint_r(i,1) = A_r(1);
?? ?CPoint_r(i,2) = A_r(2);
end
fclose(fid_r);
WPoint_r;
CPoint_r;
for i =1:1:var_r
?? ?m = 2*(i-1)+1;
?? ?n = 2*i;
?? ?A_r(m,1) = WPoint_r(i,1);
?? ?A_r(m,2) = WPoint_r(i,2);
?? ?A_r(m,3) = WPoint_r(i,3);
?? ?A_r(m,4) = 1;
?? ?A_r(m,5) = 0;
?? ?A_r(m,6) = 0;
?? ?A_r(m,7) = 0;
?? ?A_r(m,8) = 0;
?? ?A_r(m,9) ?= -WPoint_r(i,1)*CPoint_r(i,1);
?? ?A_r(m,10) = -WPoint_r(i,2)*CPoint_r(i,1);
?? ?A_r(m,11) = -WPoint_r(i,3)*CPoint_r(i,1);
?? ?A_r(n,1) = 0;
?? ?A_r(n,2) = 0;
?? ?A_r(n,3) = 0;
?? ?A_r(n,4) = 0;
?? ?A_r(n,5) = WPoint_r(i,1);
?? ?A_r(n,6) = WPoint_r(i,2);
?? ?A_r(n,7) = WPoint_r(i,3);
?? ?A_r(n,8) = 1;
?? ?A_r(n,9) ?= -WPoint_r(i,1)*CPoint_r(i,2);
?? ?A_r(n,10) = -WPoint_r(i,2)*CPoint_r(i,2);
?? ?A_r(n,11) = -WPoint_r(i,3)*CPoint_r(i,2);
end
?
?B_r = zeros(2*var_r,1);
?for i = 1:1:var_r
?? ? B_r(2*(i-1) + 1) = CPoint_r(i,1);
?? ? B_r(2*i) = CPoint_r(i,2);
?end
% ?A_r
% ?B_r
?p = A_r\B_r;
?p1 = [p;1.0];
?p1 = reshape(p1,4,3);
?CM_r = p1';
?%CM_r 即為要求的右攝像機矩陣
?CM_r
?
?
%這段代碼的作用是驗證所求的攝像機矩陣的正確性
?c =[30;0;0;1];
?t =CM_r*c;
?t(1)=t(1)/t(3);
?t(2)=t(2)/t(3);
?t(3)=t(3)/t(3);
?t
CM即為所求攝像機矩陣,也就完成了攝像機的標定過程。?
轉載于:https://blog.51cto.com/19870404/388148
總結
以上是生活随笔為你收集整理的线性直接变换方法对摄像机进行标定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Calculation控制台
- 下一篇: 【纯干货】中国的支付清算体系是怎么玩的?