[imagePoints, boardSize] = detectCheckerboardPoints(files);
% 根据方格的实际尺寸,制作world coordinates,左上角为(0,0).
worldPoints = patternWorldPoints("checkerboard",boardSize, squareSize);
imageSize = [size(img, 1), size(img, 2)];
cameraParams = estimateCameraParameters(imagePoints, worldPoints, ...
imHSV = rgb2hsv(img_new);
saturation = imHSV(:, :, 2);
t = graythresh(saturation);
imCoin = (saturation > t);
blobAnalysis = vision.BlobAnalysis(AreaOutputPort = true,...
CentroidOutputPort = false,...
BoundingBoxOutputPort = true,...
MinimumBlobArea = 200, ExcludeBorderBlobs = true);
[areas, boxes] = step(blobAnalysis, imCoin);
[~, idx] = sort(areas, "Descend");
boxes = double(boxes(idx(1:2), :));
% Insert labels for the coins.
imDetectedCoins = insertObjectAnnotation(uint8(imCoin)*255, "rectangle", ...
figure; imshow(imDetectedCoins);
[imagePoints, boardSize] = detectCheckerboardPoints(img_new);
camIntrinsics = cameraParams.Intrinsics;
newOrigin = camIntrinsics.PrincipalPoint - newIntrinsics.PrincipalPoint;
imagePoints = imagePoints + newOrigin; % adds newOrigin to every row of imagePoints
camExtrinsics = estimateExtrinsics(imagePoints, worldPoints, camIntrinsics);
boxes = boxes + [newOrigin, 0, 0];
box1 = double(boxes(1, :));
imagePoints1 = [box1(1:2); ...
box1(1) + box1(3), box1(2)];
worldPoints1 = img2world2d(imagePoints1, camExtrinsics, camIntrinsics);
d = worldPoints1(2, :) - worldPoints1(1, :);
diameterInMillimeters = hypot(d(1), d(2));
fprintf("第一个硬币的直径 = %0.2f mm\n", diameterInMillimeters);
box2 = double(boxes(2, :));
imagePoints2 = [box2(1:2); ...
box2(1) + box2(3), box2(2)];
worldPoints2 = img2world2d(imagePoints2, camExtrinsics, camIntrinsics);
d = worldPoints2(2, :) - worldPoints2(1, :);
diameterInMillimeters = hypot(d(1), d(2));
fprintf("第二个硬币的直径 = %0.2f mm\n", diameterInMillimeters);
center1_image = box1(1:2) + box1(3:4)/2;
center1_world = img2world2d(center1_image, camExtrinsics, camIntrinsics);
center1_world = [center1_world 0];
cameraPose = extr2pose(camExtrinsics);
cameraLocation = cameraPose.Translation;
distanceToCamera = norm(center1_world - cameraLocation);
fprintf("计算第一个硬币相对于相机的距离 = %0.2f mm\n", ...
distanceToCamera);
计算第一个硬币相对于相机的距离 = 719.53 mm
center2_image = box2(1:2) + box2(3:4)/2;
center2_world = img2world2d(center2_image, camExtrinsics, camIntrinsics);
center2_world = [center2_world 0];
cameraPose = extr2pose(camExtrinsics);
cameraLocation = cameraPose.Translation;
distanceToCamera = norm(center2_world - cameraLocation);
fprintf("计算第2个硬币相对于相机的距离 = %0.2f mm\n", ...
distanceToCamera);
计算第2个硬币相对于相机的距离 = 854.93 mm