├── main.m ├── Zhang.m ├── main.asv ├── images ├── 0.jpg ├── 1.jpg ├── 10.jpg ├── 11.jpg ├── 12.jpg ├── 2.jpg ├── 3.jpg ├── 4.jpg ├── 5.jpg ├── 6.jpg ├── 7.jpg ├── 8.jpg └── 9.jpg ├── caliByMatlab.m ├── homography2d.m ├── README.md ├── simon_H.m ├── normalise2dpts.m ├── detectChessBoardCorners.asv └── simon_HHH.m /main.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/main.m -------------------------------------------------------------------------------- /Zhang.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/Zhang.m -------------------------------------------------------------------------------- /main.asv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/main.asv -------------------------------------------------------------------------------- /images/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/images/0.jpg -------------------------------------------------------------------------------- /images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/images/1.jpg -------------------------------------------------------------------------------- /images/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/images/10.jpg -------------------------------------------------------------------------------- /images/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/images/11.jpg -------------------------------------------------------------------------------- /images/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/images/12.jpg -------------------------------------------------------------------------------- /images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/images/2.jpg -------------------------------------------------------------------------------- /images/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/images/3.jpg -------------------------------------------------------------------------------- /images/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/images/4.jpg -------------------------------------------------------------------------------- /images/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/images/5.jpg -------------------------------------------------------------------------------- /images/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/images/6.jpg -------------------------------------------------------------------------------- /images/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/images/7.jpg -------------------------------------------------------------------------------- /images/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/images/8.jpg -------------------------------------------------------------------------------- /images/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/images/9.jpg -------------------------------------------------------------------------------- /caliByMatlab.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/caliByMatlab.m -------------------------------------------------------------------------------- /homography2d.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujiacheng1009/zhang-s-calibration/HEAD/homography2d.m -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # zhang-s-calibration 2 | 张正友标定法的matlab实现 3 | 4 | 参考https://github.com/simonwan1980/A-flexible-new-technique-for-camera-calibration 5 | 添加了角点提取和测试图片 6 | -------------------------------------------------------------------------------- /simon_H.m: -------------------------------------------------------------------------------- 1 | function f = simon_H(H, m, M) 2 | H=reshape(H,3,3); 3 | h=H; 4 | m=[m([1:2],:); ones(1,size(m,2))]; 5 | M=[M([1:2],:); ones(1,size(M,2))]; 6 | 7 | X=h*M; 8 | X=[X(1,:)./X(3,:) ; X(2,:)./X(3,:); X(3,:)./X(3,:)]; 9 | 10 | res=m-X; 11 | req=[res(1,:), res(2,:)]; 12 | f = req; 13 | end 14 | 15 | -------------------------------------------------------------------------------- /normalise2dpts.m: -------------------------------------------------------------------------------- 1 | 2 | 3 | function [newpts, T] = normalise2dpts(pts) 4 | 5 | finiteind = find(abs(pts(3,:)) > eps); 6 | 7 | if length(finiteind) ~= size(pts,2) 8 | warning('Some points are at infinity'); 9 | end 10 | 11 | % For the finite points ensure homogeneous coords have scale of 1 12 | pts(1,finiteind) = pts(1,finiteind)./pts(3,finiteind); 13 | pts(2,finiteind) = pts(2,finiteind)./pts(3,finiteind); 14 | pts(3,finiteind) = 1; 15 | if nargin == 1 16 | c = mean(pts(1:2,finiteind)')'; % Centroid of finite points; 17 | end 18 | 19 | newp(1,finiteind) = pts(1,finiteind)-c(1); % Shift origin to centroid. 20 | newp(2,finiteind) = pts(2,finiteind)-c(2); 21 | 22 | meandist = mean(sqrt(newp(1,finiteind).^2 + newp(2,finiteind).^2)); 23 | 24 | scale = sqrt(2)/meandist; 25 | 26 | T = [scale 0 -scale*c(1) 27 | 0 scale -scale*c(2) 28 | 0 0 1 ]; 29 | 30 | newpts = T*pts; 31 | end 32 | 33 | -------------------------------------------------------------------------------- /detectChessBoardCorners.asv: -------------------------------------------------------------------------------- 1 | count = 5; 2 | width = 9; 3 | height = 6; 4 | interval = 0.031; 5 | imageFileNames = {1,count}; 6 | for i = 1:count 7 | imageFileNames{i} = sprintf('images/%d.jpg', i); 8 | end 9 | [imagePoints,boardSize,imagesUsed] = detectCheckerboardPoints(imageFileNames); 10 | x=-interval;y=-interval; 11 | M =zeros(width*height,2); 12 | for i=1:width 13 | x = x+interval; 14 | for j=1:height 15 | y = y+interval; 16 | M((i-1)*height+j,1)=x; 17 | M((i-1)*height+j,2)=y; 18 | end 19 | y=-interval; 20 | end 21 | worldPoints 22 | I = readimage(images,1); 23 | imageSize = [size(I,1),size(I,2)]; 24 | cameraParams = estimateCameraParameters(imagePoints,worldPoints, ... 25 | 'ImageSize',imageSize); 26 | 27 | 28 | % imageFileNames = imageFileNames(imagesUsed); 29 | % for i = 1:numel(imageFileNames) 30 | % I = imread(imageFileNames{i}); 31 | % subplot(2, 3, i); 32 | % imshow(I); 33 | % hold on; 34 | % plot(imagePoints(:,1,i),imagePoints(:,2,i),'ro'); 35 | % end -------------------------------------------------------------------------------- /simon_HHH.m: -------------------------------------------------------------------------------- 1 | % 2 | % *********************************************************************************** 3 | % ******* A Flexible New Technique for Camera Calibration ******* 4 | % *********************************************************************************** 5 | % 7/2004 6 | % 7 | % 8 | % REF: "A Flexible New Technique for Camera Calibration" 9 | % - Zhengyou Zhang 10 | % - Microsoft Research 11 | % 12 | function f = simon_HHH(params, m, M) 13 | % unpack the params 14 | num=size(m,3); 15 | R=[]; 16 | for i=1:num 17 | R_new=params( [(i-1)*6+1 : (i-1)*6+6] ); 18 | Q1=R_new(1); 19 | Q2=R_new(2); 20 | Q3=R_new(3); 21 | TL=R_new([4:6])'; 22 | RL=[cos(Q2)*cos(Q1) sin(Q2)*cos(Q1) -sin(Q1) ; -sin(Q2)*cos(Q3)+cos(Q2)*sin(Q1)*sin(Q3) cos(Q2)*cos(Q3)+sin(Q2)*sin(Q1)*sin(Q3) cos(Q1)*sin(Q3) ; sin(Q2)*sin(Q3)+cos(Q2)*sin(Q1)*cos(Q3) -cos(Q2)*sin(Q3)+sin(Q2)*sin(Q1)*cos(Q3) cos(Q1)*cos(Q3)]; 23 | RT=[RL(:,1:2) , TL]; 24 | R=[R;RT]; 25 | end 26 | k1=params(num*6+1); 27 | k2=params(num*6+2); 28 | A=[params(num*6+3) params(num*6+4) params(num*6+5); 0 params(num*6+6) params(num*6+7); 0,0,1]; 29 | u0=A(1,3); 30 | v0=A(2,3); 31 | D=[]; 32 | d=[]; 33 | npts=size(m,2); 34 | for flag=1:num 35 | RT=R([(flag-1)*3+1 : (flag-1)*3+3],:); 36 | XY=RT*M; 37 | UV=A*XY; 38 | UV=[UV(1,:)./UV(3,:); UV(2,:)./UV(3,:); UV(3,:)./UV(3,:)]; 39 | XY=[XY(1,:)./XY(3,:); XY(2,:)./XY(3,:); XY(3,:)./XY(3,:)]; 40 | D=[D; UV(1,:)+((UV(1,:)-u0).*( (XY(1,:)).^2 + (XY(2,:)).^2 ))*k1 + ((UV(1,:)-u0).*( (XY(1,:)).^2 + (XY(2,:)).^2 ).^2)*k2 ; UV(2,:) + ((UV(2,:)-v0).*( (XY(1,:)).^2 + (XY(2,:)).^2 ))*k1 + ((UV(2,:)-v0).*( (XY(1,:)).^2 + (XY(2,:)).^2 ).^2)*k2 ]; 41 | d=[d; m(1,:,flag); m(2,:,flag)]; 42 | end 43 | f=d-D; 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | --------------------------------------------------------------------------------