在一个杂乱的场景中使用点特征匹配的目标检测

这个例子展示了如何在一个杂乱的场景中检测一个特定的对象,给定一个对象的参考图像。

概观

本实施例提供用于检测基于寻找参考和对象图像之间的对应点的特定对象的算法。尽管规模变化或平面内旋转,可以探测物体。它也是鲁棒的外的面内旋转和闭塞的量小。

物体检测的这种方法最适合表现出非重复纹理图案的物体,其产生特有的特征匹配。这种技术是不容易的工作以及为均匀着色的对象,或为含有重复图案的物体。注意,该算法被设计用于检测特定对象,例如,大象在参考图像中,而不是任何象。用于检测特定类别的对象,如人或面,看到vision.PeopleDetectorvision.CascadeObjectDetector

第一步:阅读图片

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

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

第4步:查找推定点匹配

使用它们的描述符匹配特征。

matchFeatures(boxFeatures, sceneFeatures);

显示推定匹配的特征。

matchedBoxPoints = boxPoints(:, 1),:);matchedScenePoints = scenePoints(boxpair (:, 2),:);图;showMatchedFeatures (boxImage sceneImage matchedBoxPoints,...matchedScenePoints,'剪辑');标题(“假定匹配点(包括离群值)”);

第五步:使用假定的匹配来定位场景中的物体

estimateGeometricTransform计算与匹配点,同时消除异常值的转变。这一转变使我们能够定位目标在场景中。

[TForm的,inlierBoxPoints,inlierScenePoints] =...estimateGeometricTransform(matchedBoxPoints,matchedScenePoints,“仿射”);

显示与除去异常值的匹配点对

图;showMatchedFeatures(boxImage,sceneImage,inlierBoxPoints,...inlierScenePoints,'剪辑');标题(“匹配点(正常值专用)”);

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

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

将多边形转换为目标图像的坐标系统。转换后的多边形表示物体在场景中的位置。

newBoxPolygon = transformPointsForward(TForm的,boxPolygon);

显示检测到的对象。

图;imshow (sceneImage);保持;line(newBoxPolygon(:, 1), newBoxPolygon(:, 2),“颜色”'Y');标题(“检测箱”);

步骤7:检测另一个对象

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

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

elephantImage = imread (“elephant.jpg”);图;imshow(elephantImage);标题(“大象的图像”);

检测和可视化特征点。

elephantPoints = detectSURFFeatures(elephantImage);图;imshow(elephantImage);保持;情节(selectStrongest (elephantPoints, 100));标题(“大象图像的100个最强特征点”);

提取特征描述符。

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

匹配功能

elephantPairs = matchFeatures(elephantFeatures,sceneFeatures,'MaxRatio', 0.9);

显示推定匹配的特征。

大象对(:,1),:);大象对(:,2),:);图;showMatchedFeatures (elephantImage sceneImage matchedElephantPoints,...matchedScenePoints,'剪辑');标题(“假定匹配点(包括离群值)”);

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

[TForm的,inlierElephantPoints,inlierScenePoints] =...estimateGeometricTransform (matchedElephantPoints matchedScenePoints,“仿射”);图;showMatchedFeatures (elephantImage sceneImage inlierElephantPoints,...inlierScenePoints,'剪辑');标题(“匹配点(正常值专用)”);

显示这两个对象

大象多边形= [1,1;...%左上的大小(elephantImage,2),1;...% 右上大小(elephantImage,2),尺寸(elephantImage,1);...%右下1、大小(elephantImage, 1);...% 左下方1,1];%左上再次关闭多边形newElephantPolygon = transformPointsForward(TForm的,elephantPolygon);图;imshow (sceneImage);保持;line(newBoxPolygon(:, 1), newBoxPolygon(:, 2),“颜色”'Y');线(newElephantPolygon(:,1),newElephantPolygon(:,2),“颜色”'G');标题(“发现大象和盒子”);