Main Content

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

特徴のマッチング

この例では、MATLAB® コードから CUDA® MEX を生成し、2 つのイメージ間で特徴マッチングを実行する方法を説明します。この例では、Image Processing Toolbox™ の関数 matchFeatures (Computer Vision Toolbox) を使用して、互いに回転しスケーリングされた 2 つのイメージ間で特徴記述子をマッチングします。Speeded-Up Robust Features (SURF) アルゴリズムを使用して 2 つのイメージの特徴記述子を検出および抽出します。

サードパーティの必要条件

必須

この例では、CUDA MEX を生成します。以下のサードパーティ要件が適用されます。

  • CUDA 対応 NVIDIA® GPU および互換性のあるドライバー。

オプション

スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では以下の要件も適用されます。

GPU 環境の検証

この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証するために、関数 coder.checkGpuInstall を使用します。

envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

特徴の検出と抽出

この例では、互いに回転およびスケーリングされた 2 つのイメージに対して特徴マッチングを実行します。2 つのイメージをマッチングする前に、各イメージの特徴点を検出および抽出しなければなりません。以下の関数 featureDetectionAndExtraction は、SURF (detectSURFFeatures (Computer Vision Toolbox)) 局所特徴検出器を使用して特徴点を検出し、extractFeatures (Computer Vision Toolbox) を使用して特徴を抽出します。

関数 featureDetectionAndExtraction は、参照イメージの特徴座標を格納する refPoints、クエリ イメージの特徴座標を格納する qryPoints、参照イメージ特徴記述子を格納する refDesc 行列、およびクエリ イメージ特徴記述子を格納する qryDesc 行列を返します。

  • refPoints = 参照イメージ特徴座標。

  • qryPoints = クエリ イメージ特徴座標。

  • refDescFeat = 参照イメージ特徴記述子。

  • qryDescFeat = クエリ イメージ特徴記述子。

% Read Image
K = imread('cameraman.tif'); % Reference image
refImage = imresize(K,3);

scale = 0.7;  % Scaling the image.
J = imresize(refImage, scale);
theta = 30.0;   % Rotating the image
qryImage = imrotate(J,theta); % Query image

[refPoints,refDescFeat,qryPoints,qryDescFeat] = featureDetectionAndExtraction(refImage, qryImage);

エントリポイント関数 feature_matching

関数 feature_matching は 2 つのイメージから抽出された特徴点および特徴記述子を受け取り、それらの間でマッチする点を見つけます。

type feature_matching
function [matchedRefPoints,matchedQryPoints] = feature_matching(refPoints,refDesc,qryPoints,qryDesc) %#codegen

%   Copyright 2018 The MathWorks, Inc.

coder.gpu.kernelfun;

%% Feature Matching
[indexPairs,matchMetric] = matchFeatures(refDesc, qryDesc);
matchedRefPoints = refPoints(indexPairs(:,1),:);
matchedQryPoints = qryPoints(indexPairs(:,2),:);

特徴マッチング コード生成

この例はホスト システムで実行されるため、既定のパラメーターを使って MEX 呼び出し構成オブジェクトを作成します。生成コードに実行時エラーがある場合に MATLAB が異常終了しないように、セーフ ビルド オプションを選択します。

cfg = coder.gpuConfig;
cfg.GpuConfig.SafeBuild = 1;
codegen -config cfg -args {refPoints,refDescFeat,qryPoints,qryDescFeat} feature_matching -o feature_matching_gpu_mex
[matchedRefPoints_gpu,matchedQryPoints_gpu] = feature_matching_gpu_mex(refPoints,refDescFeat,qryPoints,qryDescFeat);

特徴マッチの表示

figure;
showMatchedFeatures(refImage, qryImage, matchedRefPoints_gpu, matchedQryPoints_gpu);
title('Putatively Matched Points (Including Outliers)');