MATLAB——混乱场景目标图像检测(特征点匹配)

%本例描绘在一个混乱场景检测一个盒子,目标物匹配策略为寻找SURF特征匹配
%并根据特征点仿射变化去除野值

%% Step 1: 读取图片
boxImage = imread('stapleRemover.jpg');
sceneImage = imread('clutteredDesk.jpg');

%% Step 2: 提取SURF特征点
boxPoints = detectSURFFeatures(boxImage);
scenePoints = detectSURFFeatures(sceneImage);

%% Step 3: 根据特征点生成图像的特征向量
[boxFeatures, boxPoints] = extractFeatures(boxImage, boxPoints);
[sceneFeatures, scenePoints] = extractFeatures(sceneImage, scenePoints);

%% Step 4: 初步建立一个匹配对(含野值)
boxPairs = matchFeatures(boxFeatures, sceneFeatures);
%show
matchedBoxPoints = boxPoints(boxPairs(:, 1), :);
matchedScenePoints = scenePoints(boxPairs(:, 2), :);
figure(1);
showMatchedFeatures(boxImage, sceneImage, matchedBoxPoints,matchedScenePoints, 'montage');
title('Putatively Matched Points (Including Outliers)');

%% Step 5: 预测仿射变化,去除不满足变化的野值
[tform, inlierBoxPoints, inlierScenePoints] = estimateGeometricTransform(matchedBoxPoints, matchedScenePoints, 'affine');
figure(2);
showMatchedFeatures(boxImage, sceneImage, inlierBoxPoints,inlierScenePoints, 'montage');
title('Matched Points (Inliers Only)');

%% Step 6:获取目标物的多边形框

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
    
%Transform the polygon into the coordinate system of the target image.
%The transformed polygon indicates the location of the object in the scene.
newBoxPolygon = transformPointsForward(tform, boxPolygon);

%Display the detected object.
figure(3);
imshow(sceneImage);hold on;line(newBoxPolygon(:, 1), newBoxPolygon(:, 2), 'Color', 'y');
title('Detected Box');

含野值的特征点匹配:

去野值的特征点匹配:

标记目标物的多边形框;

猜你喜欢

转载自blog.csdn.net/Ephemeroptera/article/details/84348740
今日推荐