I have a reference picture and i want to draw a circle around a picture that exists in the reference picture. Now it draw a rectangle over the picture that exists in the reference picture but i don't know how to make it circle.
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');
Thanks,
You can use rectangle
to actually draw an ellipse around your object of interest by using the Curvature
parameter.
%// 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])
If you want to enforce an actual circle, you will want the diameter to be the diagonal distance across the rectangle and the center to be the midpoint of the diagonal of the rectangle.
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);