主要内容

使用点特征匹配的杂乱场景中的对象检测

本实施例显示了如何考虑到对象的参考图像的杂乱场景中的特定对象。

概述

这个例子提出了一种基于查找参考和目标图像之间的点对应关系来检测特定目标的算法。它可以探测到尺度变化或平面内旋转的物体。它对少量的面外旋转和遮挡也具有鲁棒性。

这种方法的目标检测工作最好的对象显示非重复纹理模式,这导致独特的特征匹配。这种技术不太可能适用于颜色一致的对象,或包含重复图案的对象。请注意,该算法是为检测特定对象而设计的,例如,参考图像中的大象,而不是任何大象。要检测特定类别的物体,如人或脸,请参阅愿景。PeopleDetector愿景。CascadeObjectDetector

第1步:阅读图像

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

boxImage = imread (“stapleRemover.jpg”);图;imshow (boxImage);标题('盒子的形象');

读取包含杂乱场景的目标图像。

sceneImage = imread (“clutteredDesk.jpg”);图;imshow (sceneImage);标题('杂乱的场景的形象');

步骤2:检测特征点

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

boxPoints = detectSURFFeatures (boxImage);scenePoints = detectSURFFeatures (sceneImage);

可视化参考图像中找到的最强的特征点。

图;imshow (boxImage);标题(“盒子图像中100个最强的特征点”);持有;情节(selectStrongest (boxPoints, 100));

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

图;imshow (sceneImage);标题(“场景图像中300个最强的特征点”);持有;情节(selectStrongest (scenePoints, 300));

第3步:提取特征描述符

提取两个图像中的兴趣点的特征描述符。

[boxFeatures, boxPoints] = extractFeatures(boxImage, boxPoints);[sceneFeatures, scenePoints] = extractFeatures(sceneImage, scenePoints);

第四步:找到假定的匹配点

使用特征描述符匹配特征。

boxpairs = matchfeatures(豆章,风景);

显示假定匹配的特征。

matchedboxpoints = bookpoints(boxpaess(:,1),:);matchedscenepoints = scenepoints(boxpaess(:,2),:);图;ShowMatchedFeatures(Bondimage,Squimage,MatchedBoxPoints,...matchedScenePoints,“蒙太奇”);标题('提供匹配的积分(包括异常值)');

步骤5:使用推定匹配定位场景中的对象

estimateGeometricTransform2d.计算匹配点之间的转换,同时消除异常值。这个变换允许我们在场景中定位物体。

[tform, inlierIdx] =...estimateGeometricTransform2D (matchedBoxPoints matchedScenePoints,仿射的);InlierboxPoints = MatchedBoxPoints(InLieridx,:);inlierscenepoints = matchedscenepoints(Inlieridx,:);

显示剔除异常值后的匹配点对

图;showMatchedFeatures (boxImage sceneImage inlierBoxPoints,...inlierScenePoints,“蒙太奇”);标题(“匹配点(仅内层)”);

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

boxPolygon = [1,1;...% 左上方尺寸(盒子,2),1;...%右上的尺寸(盒子,2),尺寸(BOXIMAGE,1);...%右下角1、大小(boxImage, 1);...%左下侧1,1];%左上角再次关闭多边形

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

newBoxPolygon = transformPointsForward(tform, boxPolygon);

显示检测到的对象。

图;imshow (sceneImage);持有;线(NewboxPolygon(:,1),NewboxPolygon(:,2),'颜色'“y”);标题(“检测盒”);

第七步:检测另一个对象

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

读取包含感兴趣的第二个对象的图像。

ElephantImage = Imread('elephant.jpg');图;imshow (elephantImage);标题(“大象的形象”);

检测和可视化特征点。

elephantPoints = detectSURFFeatures (elephantImage);图;imshow (elephantImage);持有;绘图(Selectstrongest(Elephantpoints,100));标题(“大象图像的100个最强特征点”);

提取功能描述符。

[elephantFeatures, elephantPoints] = extractFeatures(elephantage, elephantPoints);

匹配功能

elephant = matchFeatures(elephantFeatures, sceneFeatures,“MaxRatio”,0.9);

显示假定匹配的特征。

matchedelephantpoints = elephantpoints(elephantpairs(:,1),:);matchedscenepoints = synepoints(elephantpairs(:,2),:);图;ShowMatchedFeatures(ElephantImage,Squimimage,Matchedelephantpoints,...matchedScenePoints,“蒙太奇”);标题('提供匹配的积分(包括异常值)');

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

[tform, inlierElephantPoints, inlierScenePoints] =...estimateGeometricTransform(MatchedElephantPoints,MatchedScenepoints,仿射的);图;ShowMatchedFeatures(ElephantImage,Squimimage,InliereleLephantpoints,...inlierScenePoints,“蒙太奇”);标题(“匹配点(仅内层)”);

显示两个对象

Elephantpolygon = [1,1;...% 左上方尺寸(elephantImage, 2), 1;...%右上的size(elephantiage, 2), size(elephantiage, 1);...%右下角1,尺寸(elephantimage,1);...%左下侧1,1];%左上角再次关闭多边形newElephantPolygon = transformPointsForward(tform, elephantPolygon);图;imshow (sceneImage);持有;线(NewboxPolygon(:,1),NewboxPolygon(:,2),'颜色'“y”);line(newElephantPolygon(:, 1), newElephantPolygon(:, 2),'颜色'‘g’);标题('检测到大象和盒子');