特徴の検出と記述

gpu::SURF_GPU

Comments from the Wiki

gpu::SURF_GPU

画像から SURF 特徴を抽出するためのクラス.

class SURF_GPU : public SURFParams_GPU
{
public:
    //! ディスクリプタサイズを float (64 または 128) で返します.
    int descriptorSize() const;

    //! キーポイントを,ホストからデバイスメモリにアップロードします.
    static void uploadKeypoints(const vector<KeyPoint>& keypoints,
        GpuMat& keypointsGPU);
    //! キーポイントを,デバイスからホストメモリにダウンロードします
    static void downloadKeypoints(const GpuMat& keypointsGPU,
        vector<KeyPoint>& keypoints);

    //! ディスクリプタを,デバイスからホストメモリにダウンロードします
    static void downloadDescriptors(const GpuMat& descriptorsGPU,
        vector<float>& descriptors);

    void operator()(const GpuMat& img, const GpuMat& mask,
        GpuMat& keypoints);

    void operator()(const GpuMat& img, const GpuMat& mask,
        GpuMat& keypoints, GpuMat& descriptors,
        bool useProvidedKeypoints = false,
        bool calcOrientation = true);

    void operator()(const GpuMat& img, const GpuMat& mask,
        std::vector<KeyPoint>& keypoints);

    void operator()(const GpuMat& img, const GpuMat& mask,
        std::vector<KeyPoint>& keypoints, GpuMat& descriptors,
        bool useProvidedKeypoints = false,
        bool calcOrientation = true);

    void operator()(const GpuMat& img, const GpuMat& mask,
        std::vector<KeyPoint>& keypoints,
        std::vector<float>& descriptors,
        bool useProvidedKeypoints = false,
        bool calcOrientation = true);

    GpuMat sum;
    GpuMat sumf;

    GpuMat mask1;
    GpuMat maskSum;

    GpuMat hessianBuffer;
    GpuMat maxPosBuffer;
    GpuMat featuresBuffer;
};

SURF_GPU クラスは,SURF ディスクリプタの実装です.ここには,キーポイント検出に高速なマルチスケール Hessian キーポイント検出器(これがデフォルトのオプションです)が利用でき,ユーザ指定のキーポイントに対するディスクリプタも計算できます.8ビットグレースケール画像のみをサポートしています.

SURF_GPU クラスは,GPU および CPU のメモリに結果を保存することができ,その結果を CPU と GPU の間で変換する static 関数( uploadKeypoints , downloadKeypoints , downloadDescriptors )を提供します.CPU の結果は, cv::SURF の結果と同じフォーマットになります.GPU の結果は, GpuMat に保存されます. keypoints 行列は, CV_32FC6 型の1行の行列です.ここには,1つの特徴毎に 6個の float 値が格納されます: x, y, size, response, angle, octavedescriptors 行列は, CV_32FC1 型の, \texttt{nFeatures} \times \texttt{descriptorSize} の行列です.

SURF_GPU クラスは,いくつかのバッファを利用し,そこへのアクセス手段を提供します.すべてのバッファは,関数呼び出しの合間で安全に解放できます.

参考: cv::SURF .

gpu::BruteForceMatcher_GPU

Comments from the Wiki

gpu::BruteForceMatcher_GPU

ブルートフォースディスクリプタ Matcher.1番目の集合の各ディスクリプタに対して,それに最も近いディスクリプタを見つけるために2番目の集合を全探索します.このディスクリプタ Matcher は,ディスクリプタ集合同士のマスキング可能なマッチングをサポートします.

template<class Distance>
class BruteForceMatcher_GPU
{
public:
    // 訓練ディスクリプタコレクションにディスクリプタを追加します.
    void add(const std::vector<GpuMat>& descCollection);

    // 訓練ディスクリプタコレクションを取得します.
    const std::vector<GpuMat>& getTrainDescriptors() const;

    // 訓練ディスクリプタコレクションをクリアします.
    void clear();

    // コレクション内に訓練ディスクリプタが存在しない場合に true を返します.
    bool empty() const;

    // Matcher がマッチング手法でマスクをサポートしている場合に true を返します.
    bool isMaskSupported() const;

    void matchSingle(const GpuMat& queryDescs, const GpuMat& trainDescs,
        GpuMat& trainIdx, GpuMat& distance,
        const GpuMat& mask = GpuMat());

    static void matchDownload(const GpuMat& trainIdx,
        const GpuMat& distance, std::vector<DMatch>& matches);

    void match(const GpuMat& queryDescs, const GpuMat& trainDescs,
        std::vector<DMatch>& matches, const GpuMat& mask = GpuMat());

    void makeGpuCollection(GpuMat& trainCollection, GpuMat& maskCollection,
        const vector<GpuMat>& masks = std::vector<GpuMat>());

    void matchCollection(const GpuMat& queryDescs,
        const GpuMat& trainCollection,
        GpuMat& trainIdx, GpuMat& imgIdx, GpuMat& distance,
        const GpuMat& maskCollection);

    static void matchDownload(const GpuMat& trainIdx, GpuMat& imgIdx,
        const GpuMat& distance, std::vector<DMatch>& matches);

    void match(const GpuMat& queryDescs, std::vector<DMatch>& matches,
        const std::vector<GpuMat>& masks = std::vector<GpuMat>());

    void knnMatch(const GpuMat& queryDescs, const GpuMat& trainDescs,
        GpuMat& trainIdx, GpuMat& distance, GpuMat& allDist, int k,
        const GpuMat& mask = GpuMat());

    static void knnMatchDownload(const GpuMat& trainIdx,
        const GpuMat& distance, std::vector< std::vector<DMatch> >& matches,
        bool compactResult = false);

    void knnMatch(const GpuMat& queryDescs, const GpuMat& trainDescs,
        std::vector< std::vector<DMatch> >& matches, int k,
        const GpuMat& mask = GpuMat(), bool compactResult = false);

    void knnMatch(const GpuMat& queryDescs,
        std::vector< std::vector<DMatch> >& matches, int knn,
        const std::vector<GpuMat>& masks = std::vector<GpuMat>(),
        bool compactResult = false );

    void radiusMatch(const GpuMat& queryDescs, const GpuMat& trainDescs,
        GpuMat& trainIdx, GpuMat& nMatches, GpuMat& distance,
        float maxDistance, const GpuMat& mask = GpuMat());

    static void radiusMatchDownload(const GpuMat& trainIdx,
        const GpuMat& nMatches, const GpuMat& distance,
        std::vector< std::vector<DMatch> >& matches,
        bool compactResult = false);

    void radiusMatch(const GpuMat& queryDescs, const GpuMat& trainDescs,
        std::vector< std::vector<DMatch> >& matches, float maxDistance,
        const GpuMat& mask = GpuMat(), bool compactResult = false);

    void radiusMatch(const GpuMat& queryDescs,
        std::vector< std::vector<DMatch> >& matches, float maxDistance,
        const std::vector<GpuMat>& masks = std::vector<GpuMat>(),
        bool compactResult = false);

private:
    std::vector<GpuMat> trainDescCollection;
};

BruteForceMatcher_GPU クラスは, cv::DescriptorMatcher クラスと似たインタフェースを持っています. このマッチ手法には,2つの種類があります:ある1つの画像のディスクリプタを,別の画像と比較するもの,または別の画像集合と比較するもの,です. また,すべての関数には選択肢があります:結果の保存先を GPU メモリにするか,CPUメモリにするか,です.

Distance テンプレートパラメータは,CPU/GPU インタフェースの類似性を保つためのものです. BruteForceMatcher_GPU は, L1<float> および L2<float> 距離のみをサポートしています.

参考: cv::DescriptorMatcher , cv::BruteForceMatcher .

cv::gpu::BruteForceMatcher_GPU::match

Comments from the Wiki

void match(const GpuMat& queryDescs, const GpuMat& trainDescs, std::vector<DMatch>& matches, const GpuMat& mask = GpuMat())
void match(const GpuMat& queryDescs, std::vector<DMatch>& matches, const std::vector<GpuMat>& masks = std::vector<GpuMat>())

クエリ集合内の各ディスクリプタに対するベストマッチを,訓練ディスクリプタから探します.

参考: DescriptorMatcher::match() .

cv::gpu::BruteForceMatcher_GPU::matchSingle

Comments from the Wiki

void matchSingle(const GpuMat& queryDescs, const GpuMat& trainDescs, GpuMat& trainIdx, GpuMat& distance, const GpuMat& mask = GpuMat())

各クエリディスクリプタに対するベストマッチを見つけます.結果は GPU メモリに保存されます.

{ディスクリプタのクエリ集合.} {ディスクリプタの訓練集合.これは,クラスオブジェクト内に格納される訓練ディスクリプタコレクションには追加されません.} {1行 CV_32SC1 型の行列.各クエリに対するベスト訓練インデックスが保存されます.マスク mask で除外されたクエリディスクリプタの場合,-1 が保存されます.} {1行 CV_32FC1 型の行列.各クエリに対するベスト距離が保存されます.マスク mask で除外されたクエリディスクリプタの場合, FLT_MAX が保存されます.}

パラメタ:
  • mask – 入力クエリキーポイントと訓練キーポイントとの間のマッチに対するマスク.

cv::gpu::BruteForceMatcher_GPU::matchCollection

Comments from the Wiki

void matchCollection(const GpuMat& queryDescs, const GpuMat& trainCollection, GpuMat& trainIdx, GpuMat& imgIdx, GpuMat& distance, const GpuMat& maskCollection)

クエリ集合の各ディスクリプタに最もマッチするものを,訓練ディスクリプタから見つけます.結果は GPU メモリに保存されます.

{ディスクリプタのクエリ集合.} { GpuMat には,訓練コレクションが保存されています. makeGpuCollection の add メソッドを用いてセットされた,訓練ディスクリプタコレクションから取得することができます.これは1行の行列でなければならず,各要素は,1つの訓練ディスクリプタ行列を指す DevMem2D です.} {1行 CV_32SC1 型の行列.各クエリに対するベスト訓練インデックスが格納されます. maskCollection でマスクされたディスクリプタの場合, -1 が保存されます.} {1行 CV_32SC1 型の行列.各クエリに対する訓練インデックスが格納されます. maskCollection でマスクされたディスクリプタの場合, -1 が保存されます.} {1行 CV_32FC1 型の行列.各クエリに対するベスト距離が格納されます. maskCollection でマスクされたディスクリプタの場合, FLT_MAX が保存されます.}

パラメタ:
  • maskCollection – マスクの集合が格納されている GpuMat .これは makeGpuCollection によって std::vector<GpuMat> から取得することができます.あるいは,ユーザ定義のマスク集合を格納することもできます.これは,空の行列,または1行の行列でなければならず,その各要素は 1つのマスクを指す PtrStep です.

cv::gpu::BruteForceMatcher_GPU::makeGpuCollection

Comments from the Wiki

matchCollection

void makeGpuCollection(GpuMat& trainCollection, GpuMat& maskCollection, const vector<GpuMat>& masks = std::vector<GpuMat>())

訓練ディスクリプタのコレクションおよびマスクを, 関数用の適切なフォーマットで作成します.

cv::gpu::BruteForceMatcher_GPU::matchDownload

Comments from the Wiki

matchSingle matchCollection ```` ```` ```` cv::DMatch

void matchDownload(const GpuMat& trainIdx, const GpuMat& distance, std::vector<DMatch>& matches)
void matchDownload(const GpuMat& trainIdx, GpuMat& imgIdx, const GpuMat& distance, std::vector<DMatch>& matches)

または を介して得られる trainIdx, imgIdxおよび distance行列をCPUにダウンロードして, のベクトルにします.

cv::gpu::BruteForceMatcher_GPU::knnMatch

Comments from the Wiki

void knnMatch(const GpuMat& queryDescs, const GpuMat& trainDescs, std::vector< std::vector<DMatch> >& matches, int k, const GpuMat& mask = GpuMat(), bool compactResult = false)

クエリ集合の各ディスクリプタに対して,最も良い上位 k 個のマッチを訓練ディスクリプタから見つけます.見つかった k 個(無理な場合は,それより少ない個数)のマッチは,その距離の昇順で返されます.

void knnMatch(const GpuMat& queryDescs, std::vector< std::vector<DMatch> >& matches, int k, const std::vector<GpuMat>& masks = std::vector<GpuMat>(), bool compactResult = false)

参考: DescriptorMatcher::knnMatch() .

cv::gpu::BruteForceMatcher_GPU::knnMatch

Comments from the Wiki

void knnMatch(const GpuMat& queryDescs, const GpuMat& trainDescs, GpuMat& trainIdx, GpuMat& distance, GpuMat& allDist, int k, const GpuMat& mask = GpuMat())

クエリ集合の各ディスクリプタに対して,最も良い上位 k 個のマッチを訓練ディスクリプタから見つけます.見つかった k 個(無理な場合は,それより少ない個数)のマッチは,その距離の昇順で返されます.結果は GPU メモリに保存されます.

{ディスクリプタのクエリ集合.} {ディスクリプタの訓練集合.これは,クラスオブジェクト内に保存される訓練ディスクリプタ集合には追加されません.} {サイズが \texttt{nQueries} \times \texttt{k}CV_32SC1 型の行列. trainIdx.at<int>(queryIdx, i) には,i-番目に良い訓練ディスクリプタのインデックスが格納されます.マスク mask で除外されたクエリディスクリプタの場合,これは -1 になります.} {サイズが \texttt{nQuery} \times \texttt{k}CV_32FC1 型の行列.各クエリと i-番目に良い訓練ディスクリプタとの距離が格納されます.マスク mask で除外されたクエリディスクリプタの場合,これは FLT_MAX になります.} {クエリディスクリプタと訓練ディスクリプタの間のすべての距離を格納するバッファ.これは,サイズが \texttt{nQuery} \times \texttt{nTrain}CV_32FC1 型の行列になります. trainIdx が,上位 k 個に入っていなければ allDist.at<float>(queryIdx, trainIdx) には FLT_MAX が入り,そうでない場合は queryIdxtrainIdx が示すディスクリプタ同士の距離が入ります.}

パラメタ:
  • k – 各クエリディスクリプタに対して求められるベストマッチの個数(無理な場合は,これより少なくなります).
  • mask – 入力されたクエリと訓練ディスクリプタの行列との,可能なマッチング指定するマスク.

cv::gpu::BruteForceMatcher_GPU::knnMatchDownload

Comments from the Wiki

knnMatch

cv::DMatch


void knnMatchDownload(const GpuMat& trainIdx, const GpuMat& distance, std::vector< std::vector<DMatch> >& matches, bool compactResult = false)

を介して得られる trainIdxおよび distance行列をCPUにダウンロードして, のベクトルにします. compactResultが true の場合,マスクで除外されたクエリディスクリプタに対するマッチが, matchesベクトルに含まれないようになります.

cv::gpu::BruteForceMatcher_GPU::radiusMatch

Comments from the Wiki

void radiusMatch(const GpuMat& queryDescs, const GpuMat& trainDescs, std::vector< std::vector<DMatch> >& matches, float maxDistance, const GpuMat& mask = GpuMat(), bool compactResult = false)

各クエリディスクリプタに対して,与えられた閾値よりも小さい距離にあるベストマッチを見つけます.見つかったマッチは,その距離の昇順で返されます.

void radiusMatch(const GpuMat& queryDescs, std::vector< std::vector<DMatch> >& matches, float maxDistance, const std::vector<GpuMat>& masks = std::vector<GpuMat>(), bool compactResult = false)

この関数は,compute capabiity >= 1.1 のデバイスでのみ動作します.

参考: DescriptorMatcher::radiusMatch() .

cv::gpu::BruteForceMatcher_GPU::radiusMatch

Comments from the Wiki

void radiusMatch(const GpuMat& queryDescs, const GpuMat& trainDescs, GpuMat& trainIdx, GpuMat& nMatches, GpuMat& distance, float maxDistance, const GpuMat& mask = GpuMat())

各クエリキーポイントに対して,与えられた閾値よりも小さい距離にあるベストマッチを見つけます.結果は GPU メモリに保存されます.

{ディスクリプタのクエリ集合.} {ディスクリプタの訓練集合.これは,クラスオブジェクト内に格納される訓練画像コレクションには追加されません.} { trainIdx.at<int>(queryIdx, i) には, (i < min(nMatches.at<unsigned int>(0, queryIdx), trainIdx.cols)) を満たす i-番目の訓練ディスクリプタのインデックスが格納されます. trainIdx が空の場合, \texttt{nQuery} \times \texttt{nTrain} サイズの行列が作成されます.あるいは,ユーザが割り当てることもできます( nQuery 行で, CV_32SC1 型でなければいけません).列数は nTrain より小さい値でも構いませんが,結果を保存するのに十分なメモリがないという理由で,Matcher がすべてのマッチを検出できない可能性があります.} { nMatches.at<unsigned int>(0, queryIdx) には, queryIdx に対するマッチの個数が格納されます.メモリ不足により Matcher がすべてのマッチを検出できなかった場合, nMatchestrainIdx.cols よりも大きい値になることがあります.注意してください.} { distance.at<int>(queryIdx, i) には, (i < min(nMatches.at<unsigned int>(0, queryIdx), trainIdx.cols)) を満たす i-番目の訓練ディスクリプタとの距離が格納されます. trainIdx が空の場合, \texttt{nQuery} \times \texttt{nTrain} の行列が作成されます.そうでなければ,ユーザによって割り当てられていなければいけません( trainIdx と同じサイズで, CV_32FC1 型でなければいけません)}

パラメタ:
  • maxDistance – 距離の閾値.
  • mask – 入力されたクエリと訓練ディスクリプタの行列との,可能なマッチング指定するマスク.

cv::gpu::BruteForceMather_GPU::radiusMatch とは対照的に,結果は距離の昇順で格納されるわけではありません.

この関数は,compute capabiity >= 1.1 のデバイスでのみ動作します.

cv::gpu::BruteForceMatcher_GPU::radiusMatchDownload

Comments from the Wiki

radiusMatch

cv::DMatch


void radiusMatchDownload(const GpuMat& trainIdx, const GpuMat& nMatches, const GpuMat& distance, std::vector< std::vector<DMatch> >& matches, bool compactResult = false)

を介して得られる trainIdx, nMatchesおよび distance行列をCPUにダウンロードして, のベクトルにします. compactResultが true の場合,マスクで除外されたクエリディスクリプタに対するマッチが, matchesベクトルに含まれないようになります.