主要内容

使用点功能匹配在混乱的场景中检测对象检测

此示例显示了如何在杂乱的场景中检测特定对象(给定对象的参考图像)。

概述

此示例提出了一种基于参考图像和目标图像之间的查找点对应关系检测特定对象的算法。尽管刻度变化或平面内旋转,它仍可以检测对象。它对少量的平面旋转和遮挡也是强大的。

这种对象检测方法最适合表现出非重复纹理模式的对象,从而产生独特的功能匹配。该技术不太可能适合均匀颜色的对象或包含重复模式的对象。请注意,该算法设计用于检测特定对象,例如参考图像中的大象,而不是任何大象。要检测特定类别的对象,例如人或面孔,请参阅Vision.PeopleDetectorVision.CascadeObjectDetector

步骤1:阅读图像

阅读包含感兴趣对象的参考图像。

boxImage = imread('stapleremover.jpg');数字;imshow(boximage);标题(“盒子的图像”);

阅读包含混乱场景的目标图像。

场景图= imread('clutterdesk.jpg');数字;Imshow(场景图);标题(“混乱场景的图像”);

步骤2:检测功能点

检测两个图像中的特征点。

BoxPoints =检测表图(boxImage);ScenePoints =检测表图(场景图);

可视化参考图像中发现的最强特征点。

数字;imshow(boximage);标题(“框图像中的100个最强特征点”);抓住;绘图(SelectStrongest(Boxpoints,100));

可视化目标图像中发现的最强特征点。

数字;Imshow(场景图);标题(“场景图像中的300个最强的特征点”);抓住;绘图(SelectStrongest(ScenePoints,300));

步骤3:提取功能描述符

在这两个图像中的兴趣点上提取功能描述符。

[BoxFeatures,Buxpoints] = ExtractFeatures(BoxImage,Buxpoints);[sceneFeatures,scenepoints] = extractFeatures(场景图,场景点);

步骤4:找到推定的点匹配

使用其描述符匹配功能。

BoxPairs = MatchFeatures(BoxFeatures,SceneFeatures);

显示预定的功能。

匹配的框=盒子(Boxpairs(:,1),:);MatchedScenePoints = ScenePoints(BoxPairs(:,2),:);数字;ShowMatchedFeatures(boximage,centenimage,匹配框点,...匹配的ScenEpoints,'剪辑');标题(“推定的点(包括异常值)”);

步骤5:使用推定的匹配项在场景中找到对象

估计分析图2d计算有关匹配点的转换,同时消除异常值。这种转换使我们能够将对象定位在场景中。

[tform,inlieridx] =...估算尺寸图transform2d(匹配框,匹配scenepoints,“仿射”);InlierBoxPoints = MatchedBoxPoints(InlierIdx,:);inliersCenepoints =匹配scenepoints(inlieridx,:);

显示匹配点对,并删除异常值

数字;ShowMatchedFeatures(boximage,centenimage,inlierboxpoints,...inliersCenepoints,'剪辑');标题(“匹配的点(仅仅是嵌件)”);

获取参考图像的边界多边形。

BoxPolygon = [1,1;...% 左上方尺寸(boximage,2),1;...% 右上尺寸(boximage,2),尺寸(boximage,1);...右下角%1,大小(boximage,1);...% 左下方1,1];左上%再次关闭多边形

将多边形转换为目标图像的坐标系。转换后的多边形指示对象在场景中的位置。

newboxPolygon = transformpointsforward(tform,boxpolygon);

显示检测到的对象。

数字;Imshow(场景图);抓住;线(newboxpolygon(:,1),newboxpolygon(:,2),'颜色',,,,'y');标题(“检测到的盒子”);

步骤7:检测另一个对象

通过使用与以前相同的步骤来检测第二个对象。

阅读包含第二个对象的图像。

elephantimage = imread('Elephant.jpg');数字;Imshow(象征);标题(“大象的图像”);

检测和可视化特征点。

ElephantPoints =检测表面(象征);数字;Imshow(象征);抓住;绘图(SelectStrongest(Elephantpoints,100));标题(“大象图像中的100个最强特征点”);

提取功能描述符。

[ElephantFeatures,ElephantPoints] =提取物(象征,象征);

匹配功能

Elephantpairs = MatchFeatures(ElephantFeatures,场景表演,'maxratio',0.9);

显示预定的功能。

匹配的elephantpoints = elephantpoints(elephantpairs(:,1),:);MatchedScenePoints = ScenePoints(ElephantPairs(:,2),:);数字;showmatchedfeatures(象征,场景图,匹配elephantpoints,...匹配的ScenEpoints,'剪辑');标题(“推定的点(包括异常值)”);

估计几何变换并消除异常值

[tform,inlierelephantpoints,inliersCenepoints] =...估计地理图(匹配elephantpoints,匹配尺寸),“仿射”);数字;showmatchedfeatures(象征,场景图,inlierelephantpoints,...inliersCenepoints,'剪辑');标题(“匹配的点(仅仅是嵌件)”);

显示两个对象

ElephantPolygon = [1,1;...% 左上方尺寸(大象图,2),1;...% 右上尺寸(大象图,2),尺寸(象征,1);...右下角%1,大小(大象图,1);...% 左下方1,1];左上%再次关闭多边形newElephantPolygon = transformpointsforward(Tform,ElephantPolygon);数字;Imshow(场景图);抓住;线(newboxpolygon(:,1),newboxpolygon(:,2),'颜色',,,,'y');线(newelepolygon(:,1),newelephantpolygon(:,2),'颜色',,,,'G');标题(“检测到大象和盒子”);