在Matlab中围绕识别出的图像画一个圆圈

Draw a circle around the recognized image in Matlab

我有一张参考图片,我想在参考图片中存在的图片周围画一个圆圈。 现在它在参考图片中存在的图片上绘制了一个矩形,但我不知道如何使它成为圆形。

boxImage = imread('RefImg.jpg');
sceneImage = imread('full_image.jpg');
boxPoints = detectSURFFeatures(rgb2gray(boxImage));
scenePoints = detectSURFFeatures(rgb2gray(sceneImage));
[boxFeatures, boxPoints] = extractFeatures(rgb2gray(boxImage), boxPoints);
[sceneFeatures, scenePoints] = extractFeatures(rgb2gray(sceneImage), scenePoints);

boxPairs = matchFeatures(boxFeatures, sceneFeatures);
matchedBoxPoints = boxPoints(boxPairs(:, 1), :);
matchedScenePoints = scenePoints(boxPairs(:, 2), :);
figure;
showMatchedFeatures(rgb2gray(boxImage),rgb2gray(sceneImage), matchedBoxPoints, ...
    matchedScenePoints, 'montage');
title('Putatively Matched Points (Including Outliers)');
[tform, inlierBoxPoints, inlierScenePoints] = ...
    estimateGeometricTransform(matchedBoxPoints, matchedScenePoints, 'affine');
figure;
showMatchedFeatures(rgb2gray(boxImage), rgb2gray(sceneImage), inlierBoxPoints, ...
    inlierScenePoints, 'montage');
title('Matched Points (Inliers Only)');

boxPolygon = [1, 1;...                           % top-left
        size(boxImage, 2), 1;...                 % top-right
        size(boxImage, 2), size(boxImage, 1);... % bottom-right
        1, size(boxImage, 1);...                 % bottom-left
        1, 1];                   % top-left again to close the polygon
    newBoxPolygon = transformPointsForward(tform, boxPolygon);
    figure;


imshow(sceneImage);
hold on;
line(newBoxPolygon(:, 1), newBoxPolygon(:, 2), 'Color', 'y');
title('Detected Box');

谢谢,

您可以使用 rectangle 通过使用 Curvature 参数在您感兴趣的对象周围实际绘制一个椭圆。

%// Transform your points
boxCorners = [1, 1; size(boxImage, 2), size(boxImage, 1)];
box = transformPointsForward(tform, boxCorners);

%// Position as [x, y, width, height]
position = [boxCorners(1,:), diff(boxCorners)];

%// Display the image
imshow(sceneImage);
hold on

%// Plot an ellipse at this location
rectangle('Position', position, 'Curvature', [1 1])

如果要强制执行 实际 圆,您需要直径为横跨矩形的对角线距离,圆心为矩形对角线的中点.

boxCorners = [1, 1; size(boxImage, 2), size(boxImage, 1)];
box = transformPointsForward(tform, boxCorners);

%// Now compute the diagonal distance (diameter)
diameter = sqrt(sum(diff(box).^2));

%// Now determine the middle of the circle
center = mean(box);

%// Display the image
imshow(sceneImage);
hold on

%// Now plot the circle
t = linspace(0, 2*pi, 100);
plot(center(1) + cos(t) * diameter/2, ...
     center(2) + sin(t) * diameter/2);