对象检测在凌乱的现场使用点特征匹配
这个例子展示了如何检测特定的对象在一个混乱的场景,给图像的对象的引用。
概述
这个示例提供了一个检测算法基于一个特定的对象找到点参考和目标图像之间的对应关系。它可以检测对象尽管规模变化或平面旋转。也是强劲的少量的出平面旋转和闭塞。
这种对象检测方法最适合的对象表现出的无重复纹理模式,产生独特的特征匹配。这种方法不可能适合uniformly-colored对象,或为对象包含重复的模式。注意,这个算法是用于检测特定的对象,例如,大象在参考图像,而不是任何的大象。检测对象的一个特定的类别,如人或脸,看到的vision.PeopleDetector
和vision.CascadeObjectDetector
。
步骤1:读取图像
阅读参考图像包含感兴趣的对象。
boxImage = imread (“stapleRemover.jpg”);图;imshow (boxImage);标题(一个盒子的图片);
阅读目标图像包含一个凌乱的场景。
sceneImage = imread (“clutteredDesk.jpg”);图;imshow (sceneImage);标题(“一个混乱的场景的图像”);
第二步:检测特征点
检测特征点在图像。
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 (boxFeatures sceneFeatures);
显示推定地匹配特性。
matchedBoxPoints = boxPoints (boxPairs (: 1):);matchedScenePoints = scenePoints (boxPairs (:, 2):);图;showMatchedFeatures (boxImage sceneImage matchedBoxPoints,…matchedScenePoints,“蒙太奇”);标题(“推定地匹配点(包括异常值)”);
第五步:定位对象在场景中使用公认的比赛
estgeotform2d
计算转换相关的匹配点,消除异常值。这种转变让我们本地化场景中的对象。
[tform, inlierIdx] = estgeotform2d (matchedBoxPoints matchedScenePoints,仿射的);inlierBoxPoints = matchedBoxPoints (inlierIdx:);inlierScenePoints = matchedScenePoints (inlierIdx:);
显示的匹配点对离群值删除
图;showMatchedFeatures (boxImage sceneImage inlierBoxPoints,…inlierScenePoints,“蒙太奇”);标题(“匹配点(仅内围层)”);
参考图像的边界多边形。
boxPolygon = [1,1;…%左上的尺寸(boxImage, 2), 1;…%右上的大小(boxImage, 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 (elephantImage elephantPoints);
匹配功能
elephantPairs = matchFeatures (elephantFeatures、sceneFeatures MaxRatio = 0.9);
显示推定地匹配特性。
matchedElephantPoints = elephantPoints (elephantPairs (: 1):);matchedScenePoints = scenePoints (elephantPairs (:, 2):);图;showMatchedFeatures (elephantImage sceneImage matchedElephantPoints,…matchedScenePoints,“蒙太奇”);标题(“推定地匹配点(包括异常值)”);
估计几何变换和消除异常值
[tform, inlierElephantPoints inlierScenePoints] =…estimateGeometricTransform (matchedElephantPoints matchedScenePoints,仿射的);图;showMatchedFeatures (elephantImage sceneImage inlierElephantPoints,…inlierScenePoints,“蒙太奇”);标题(“匹配点(仅内围层)”);
显示两个对象
elephantPolygon = [1,1;…%左上的尺寸(elephantImage, 2), 1;…%右上的大小(elephantImage, 2),大小(elephantImage, 1);…%右下角1、大小(elephantImage, 1);…%左下侧1,1];%左上的再次关闭多边形newElephantPolygon = transformPointsForward (tform elephantPolygon);图;imshow (sceneImage);持有在;线(newBoxPolygon (: 1), newBoxPolygon(:, 2),颜色=“y”);线(newElephantPolygon (: 1), newElephantPolygon(:, 2),颜色=‘g’);标题(发现大象和盒子的);