extrinsics test1
Contents
load image filenames and prior calibration
clear close all load filelist load params2 cameraParams
cameraParams = cameraParameters with properties: Camera Intrinsics IntrinsicMatrix: [3x3 double] FocalLength: [6.5732e+03 6.5686e+03] PrincipalPoint: [2.3784e+03 1.4077e+03] Skew: 0 Lens Distortion RadialDistortion: [0.0099 -0.0836] TangentialDistortion: [0 0] Camera Extrinsics RotationMatrices: [3x3x12 double] TranslationVectors: [12x3 double] Accuracy of Estimation MeanReprojectionError: 0.5275 ReprojectionErrors: [64x2x12 double] ReprojectedPoints: [64x2x12 double] Calibration Settings NumPatterns: 12 WorldPoints: [64x2 double] WorldUnits: 'in' EstimateSkew: 0 NumRadialDistortionCoefficients: 2 EstimateTangentialDistortion: 0
choose which image
n = 15; filename = files{n}; rgb = imread(filename);
Undistort image
im = undistortImage(rgb, cameraParams); sz = size(im); imshow(imresize(im,800/sz(2)));
Detect checkerboard corners
Generate the world coordinates of the checkerboard corners in the pattern-centric coordinate system, with the upper-left corner at (0,0).
[imagePoints, boardSize] = detectCheckerboardPoints(im);
Warning: The checkerboard must be asymmetric: one side should be even, and the other should be odd. Otherwise, the orientation of the board may be detected incorrectly.
Generate world coordinates
squareSize = 3; % in inches
worldPoints = generateCheckerboardPoints(boardSize, squareSize);
show points
show_points(im,imagePoints,worldPoints);
Warning: Image is too big to fit on screen; displaying at 25%
Compute new extrinsics
[R, T] = extrinsics(imagePoints, worldPoints, cameraParams);
Compute vector from target to camera (in feet)
loc = -T*R'/12
fprintf('camera is %g ft above floor\n',-loc(3));
loc = 7.0859 -4.3194 -4.7078 camera is 4.70778 ft above floor