主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

特徴点のマッチングを使用した要素の多いシーンでのオブジェクト検出

この例では,オブジェクトの参照イメージがある場合に,要素の多いシーンで特定のオブジェクトを検出する方法を説明します。

概要

この例では,参照イメージとターゲットイメージの間で点の対応を見つけることにより,特定のオブジェクトを検出するアルゴリズムを提示します。スケールの変更や面内回転がある場合でもオブジェクトを検出できます。また,少量であれば面外の回転やオクルージョンに対してもロバストです。

このオブジェクト検出方法は,一意の特徴マッチが得られる繰り返しのないテクスチャパターンを示すオブジェクトに最適です。色が均一のオブジェクトや反復パターンのあるオブジェクトでは,この手法はうまく機能しない可能性が高くなります。このアルゴリズムは特定のオブジェクトを検出するよう設計されています。たとえば,任意のゾウすべてを検出するのではなく,参照イメージ内のゾウを検出します。人物や顔といった特定のカテゴリに属するオブジェクトの検出については,愿景。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);

手順4:点の推定的マッチの検出

特徴記述子を使用して特徴をマッチングします。

boxPairs = matchFeatures(boxFeatures, sceneFeatures);

マッチであると推定される特徴を表示します。

matchedBoxPoints = boxPoints(boxPairs(:, 1),:);matchedScenePoints = scenePoints(boxPairs(:, 2),:);图;showMatchedFeatures (boxImage sceneImage matchedBoxPoints,...matchedScenePoints,“蒙太奇”);标题(假定匹配点(包括离群点));

手順5:推定的マッチを使用したシーン内のオブジェクト検出

estimateGeometricTransform2Dは,外れ値を排除しながら,マッチした点を関連付ける変換を計算します。この変換によってシーン内のオブジェクトの位置を決定できます。

[tform, inlierIdx] =...estimateGeometricTransform2D (matchedBoxPoints matchedScenePoints,仿射的);inlierBoxPoints = matchedBoxPoints(inlierIdx,:);inlierScenePoints = matchedScenePoints(inlierIdx,:);

外れ値を削除したうえで,マッチする点のペアを表示します。

图;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);持有;newBoxPolygon(:, 1), newBoxPolygon(:, 2),“颜色”“y”);标题(“检测盒”);

手順7:別のオブジェクトの検出

前と同じ手順で2つ目のオブジェクトを検出します。

2つ目の対象オブジェクトを含むイメージを読み取ります。

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

特徴点を検出して可視化します。

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

特徴記述子を抽出します。

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

特徴のマッチング

大象配对=匹配特征(大象特征,场景特征,“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;...%右上的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’);标题(“发现大象与箱子”);