在Matlab

时间:2016-04-12 23:16:21

标签: matlab matlab-figure image-recognition matlab-cvst

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

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

谢谢,

1 个答案:

答案 0 :(得分:1)

您可以使用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);