Search code examples
matlabmatlab-figureimage-recognitionmatlab-cvst

Draw a circle around the recognized image in Matlab


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,


Solution

  • 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);