特徴の検出と記述 ======================== .. highlight:: cpp .. index:: gpu::SURF_GPU .. _gpu::SURF_GPU: gpu::SURF_GPU ------------- `id=0.220524797135 Comments from the Wiki `__ .. ctype:: gpu::SURF_GPU 画像から SURF 特徴を抽出するためのクラス. .. code-block:: c class SURF_GPU : public SURFParams_GPU { public: //! ディスクリプタサイズを float (64 または 128) で返します. int descriptorSize() const; //! キーポイントを,ホストからデバイスメモリにアップロードします. static void uploadKeypoints(const vector& keypoints, GpuMat& keypointsGPU); //! キーポイントを,デバイスからホストメモリにダウンロードします static void downloadKeypoints(const GpuMat& keypointsGPU, vector& keypoints); //! ディスクリプタを,デバイスからホストメモリにダウンロードします static void downloadDescriptors(const GpuMat& descriptorsGPU, vector& 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& keypoints); void operator()(const GpuMat& img, const GpuMat& mask, std::vector& keypoints, GpuMat& descriptors, bool useProvidedKeypoints = false, bool calcOrientation = true); void operator()(const GpuMat& img, const GpuMat& mask, std::vector& keypoints, std::vector& 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, octave`` . ``descriptors`` 行列は, ``CV_32FC1`` 型の, :math:`\texttt{nFeatures} \times \texttt{descriptorSize}` の行列です. ``SURF_GPU`` クラスは,いくつかのバッファを利用し,そこへのアクセス手段を提供します.すべてのバッファは,関数呼び出しの合間で安全に解放できます. 参考: cv::SURF . .. index:: gpu::BruteForceMatcher_GPU .. _gpu::BruteForceMatcher_GPU: gpu::BruteForceMatcher_GPU -------------------------- `id=0.58252477716 Comments from the Wiki `__ .. ctype:: gpu::BruteForceMatcher_GPU ブルートフォースディスクリプタ Matcher.1番目の集合の各ディスクリプタに対して,それに最も近いディスクリプタを見つけるために2番目の集合を全探索します.このディスクリプタ Matcher は,ディスクリプタ集合同士のマスキング可能なマッチングをサポートします. .. code-block:: c template class BruteForceMatcher_GPU { public: // 訓練ディスクリプタコレクションにディスクリプタを追加します. void add(const std::vector& descCollection); // 訓練ディスクリプタコレクションを取得します. const std::vector& 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& matches); void match(const GpuMat& queryDescs, const GpuMat& trainDescs, std::vector& matches, const GpuMat& mask = GpuMat()); void makeGpuCollection(GpuMat& trainCollection, GpuMat& maskCollection, const vector& masks = std::vector()); 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& matches); void match(const GpuMat& queryDescs, std::vector& matches, const std::vector& masks = std::vector()); 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 >& matches, bool compactResult = false); void knnMatch(const GpuMat& queryDescs, const GpuMat& trainDescs, std::vector< std::vector >& matches, int k, const GpuMat& mask = GpuMat(), bool compactResult = false); void knnMatch(const GpuMat& queryDescs, std::vector< std::vector >& matches, int knn, const std::vector& masks = std::vector(), 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 >& matches, bool compactResult = false); void radiusMatch(const GpuMat& queryDescs, const GpuMat& trainDescs, std::vector< std::vector >& matches, float maxDistance, const GpuMat& mask = GpuMat(), bool compactResult = false); void radiusMatch(const GpuMat& queryDescs, std::vector< std::vector >& matches, float maxDistance, const std::vector& masks = std::vector(), bool compactResult = false); private: std::vector trainDescCollection; }; .. ``BruteForceMatcher_GPU`` クラスは, cv::DescriptorMatcher クラスと似たインタフェースを持っています. このマッチ手法には,2つの種類があります:ある1つの画像のディスクリプタを,別の画像と比較するもの,または別の画像集合と比較するもの,です. また,すべての関数には選択肢があります:結果の保存先を GPU メモリにするか,CPUメモリにするか,です. ``Distance`` テンプレートパラメータは,CPU/GPU インタフェースの類似性を保つためのものです. ``BruteForceMatcher_GPU`` は, ``L1`` および ``L2`` 距離のみをサポートしています. 参考: cv::DescriptorMatcher , cv::BruteForceMatcher . .. index:: cv::gpu::BruteForceMatcher_GPU::match .. _cv::gpu::BruteForceMatcher_GPU::match: cv::gpu::BruteForceMatcher_GPU::match ------------------------------------- `id=0.878801856653 Comments from the Wiki `__ .. cfunction:: void match(const GpuMat\& queryDescs, const GpuMat\& trainDescs, std::vector\& matches, const GpuMat\& mask = GpuMat()) .. cfunction:: void match(const GpuMat\& queryDescs, std::vector\& matches, const std::vector\& masks = std::vector()) クエリ集合内の各ディスクリプタに対するベストマッチを,訓練ディスクリプタから探します. 参考: :func:`DescriptorMatcher::match` . .. index:: cv::gpu::BruteForceMatcher_GPU::matchSingle .. _cv::gpu::BruteForceMatcher_GPU::matchSingle: cv::gpu::BruteForceMatcher_GPU::matchSingle ------------------------------------------- `id=0.232052771017 Comments from the Wiki `__ .. cfunction:: 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`` が保存されます.} :param mask: 入力クエリキーポイントと訓練キーポイントとの間のマッチに対するマスク. .. index:: cv::gpu::BruteForceMatcher_GPU::matchCollection .. _cv::gpu::BruteForceMatcher_GPU::matchCollection: cv::gpu::BruteForceMatcher_GPU::matchCollection ----------------------------------------------- `id=0.460735833149 Comments from the Wiki `__ .. cfunction:: 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`` が保存されます.} :param maskCollection: マスクの集合が格納されている ``GpuMat`` .これは makeGpuCollection によって ``std::vector`` から取得することができます.あるいは,ユーザ定義のマスク集合を格納することもできます.これは,空の行列,または1行の行列でなければならず,その各要素は 1つのマスクを指す ``PtrStep`` です. .. index:: cv::gpu::BruteForceMatcher_GPU::makeGpuCollection .. _cv::gpu::BruteForceMatcher_GPU::makeGpuCollection: cv::gpu::BruteForceMatcher_GPU::makeGpuCollection ------------------------------------------------- `id=0.816741702087 Comments from the Wiki `__ matchCollection .. cfunction:: void makeGpuCollection(GpuMat\& trainCollection, GpuMat\& maskCollection, const vector\& masks = std::vector()) 訓練ディスクリプタのコレクションおよびマスクを, 関数用の適切なフォーマットで作成します. .. index:: cv::gpu::BruteForceMatcher_GPU::matchDownload .. _cv::gpu::BruteForceMatcher_GPU::matchDownload: cv::gpu::BruteForceMatcher_GPU::matchDownload --------------------------------------------- `id=0.868902666149 Comments from the Wiki `__ matchSingle matchCollection ```` ```` ```` cv::DMatch .. cfunction:: void matchDownload(const GpuMat\& trainIdx, const GpuMat\& distance, std::vector\& matches) .. cfunction:: void matchDownload(const GpuMat\& trainIdx, GpuMat\& imgIdx, const GpuMat\& distance, std::vector\& matches) または を介して得られる trainIdx, imgIdxおよび distance行列をCPUにダウンロードして, のベクトルにします. .. index:: cv::gpu::BruteForceMatcher_GPU::knnMatch .. _cv::gpu::BruteForceMatcher_GPU::knnMatch: cv::gpu::BruteForceMatcher_GPU::knnMatch ---------------------------------------- `id=0.597774063702 Comments from the Wiki `__ .. cfunction:: void knnMatch(const GpuMat\& queryDescs, const GpuMat\& trainDescs, std::vector< std::vector >\& matches, int k, const GpuMat\& mask = GpuMat(), bool compactResult = false) クエリ集合の各ディスクリプタに対して,最も良い上位 k 個のマッチを訓練ディスクリプタから見つけます.見つかった k 個(無理な場合は,それより少ない個数)のマッチは,その距離の昇順で返されます. .. cfunction:: void knnMatch(const GpuMat\& queryDescs, std::vector< std::vector >\& matches, int k, const std::vector\& masks = std::vector(), bool compactResult = false ) 参考: :func:`DescriptorMatcher::knnMatch` . .. index:: cv::gpu::BruteForceMatcher_GPU::knnMatch .. _cv::gpu::BruteForceMatcher_GPU::knnMatch: cv::gpu::BruteForceMatcher_GPU::knnMatch ---------------------------------------- `id=0.0400758899376 Comments from the Wiki `__ .. cfunction:: void knnMatch(const GpuMat\& queryDescs, const GpuMat\& trainDescs, GpuMat\& trainIdx, GpuMat\& distance, GpuMat\& allDist, int k, const GpuMat\& mask = GpuMat()) クエリ集合の各ディスクリプタに対して,最も良い上位 k 個のマッチを訓練ディスクリプタから見つけます.見つかった k 個(無理な場合は,それより少ない個数)のマッチは,その距離の昇順で返されます.結果は GPU メモリに保存されます. {ディスクリプタのクエリ集合.} {ディスクリプタの訓練集合.これは,クラスオブジェクト内に保存される訓練ディスクリプタ集合には追加されません.} {サイズが :math:`\texttt{nQueries} \times \texttt{k}` で ``CV_32SC1`` 型の行列. ``trainIdx.at(queryIdx, i)`` には,i-番目に良い訓練ディスクリプタのインデックスが格納されます.マスク ``mask`` で除外されたクエリディスクリプタの場合,これは -1 になります.} {サイズが :math:`\texttt{nQuery} \times \texttt{k}` で ``CV_32FC1`` 型の行列.各クエリと i-番目に良い訓練ディスクリプタとの距離が格納されます.マスク ``mask`` で除外されたクエリディスクリプタの場合,これは ``FLT_MAX`` になります.} {クエリディスクリプタと訓練ディスクリプタの間のすべての距離を格納するバッファ.これは,サイズが :math:`\texttt{nQuery} \times \texttt{nTrain}` で ``CV_32FC1`` 型の行列になります. ``trainIdx`` が,上位 k 個に入っていなければ ``allDist.at(queryIdx, trainIdx)`` には ``FLT_MAX`` が入り,そうでない場合は ``queryIdx`` と ``trainIdx`` が示すディスクリプタ同士の距離が入ります.} :param k: 各クエリディスクリプタに対して求められるベストマッチの個数(無理な場合は,これより少なくなります). :param mask: 入力されたクエリと訓練ディスクリプタの行列との,可能なマッチング指定するマスク. .. index:: cv::gpu::BruteForceMatcher_GPU::knnMatchDownload .. _cv::gpu::BruteForceMatcher_GPU::knnMatchDownload: cv::gpu::BruteForceMatcher_GPU::knnMatchDownload ------------------------------------------------ `id=0.599489598313 Comments from the Wiki `__ knnMatch ```` ```` cv::DMatch ```` ```` .. cfunction:: void knnMatchDownload(const GpuMat\& trainIdx, const GpuMat\& distance, std::vector< std::vector >\& matches, bool compactResult = false) を介して得られる trainIdxおよび distance行列をCPUにダウンロードして, のベクトルにします. compactResultが true の場合,マスクで除外されたクエリディスクリプタに対するマッチが, matchesベクトルに含まれないようになります. .. index:: cv::gpu::BruteForceMatcher_GPU::radiusMatch .. _cv::gpu::BruteForceMatcher_GPU::radiusMatch: cv::gpu::BruteForceMatcher_GPU::radiusMatch ------------------------------------------- `id=0.872179051279 Comments from the Wiki `__ .. cfunction:: void radiusMatch(const GpuMat\& queryDescs, const GpuMat\& trainDescs, std::vector< std::vector >\& matches, float maxDistance, const GpuMat\& mask = GpuMat(), bool compactResult = false) 各クエリディスクリプタに対して,与えられた閾値よりも小さい距離にあるベストマッチを見つけます.見つかったマッチは,その距離の昇順で返されます. .. cfunction:: void radiusMatch(const GpuMat\& queryDescs, std::vector< std::vector >\& matches, float maxDistance, const std::vector\& masks = std::vector(), bool compactResult = false) この関数は,compute capabiity :math:`>=` 1.1 のデバイスでのみ動作します. 参考: :func:`DescriptorMatcher::radiusMatch` . .. index:: cv::gpu::BruteForceMatcher_GPU::radiusMatch .. _cv::gpu::BruteForceMatcher_GPU::radiusMatch: cv::gpu::BruteForceMatcher_GPU::radiusMatch ------------------------------------------- `id=0.0739094906123 Comments from the Wiki `__ .. cfunction:: void radiusMatch(const GpuMat\& queryDescs, const GpuMat\& trainDescs, GpuMat\& trainIdx, GpuMat\& nMatches, GpuMat\& distance, float maxDistance, const GpuMat\& mask = GpuMat()) 各クエリキーポイントに対して,与えられた閾値よりも小さい距離にあるベストマッチを見つけます.結果は GPU メモリに保存されます. {ディスクリプタのクエリ集合.} {ディスクリプタの訓練集合.これは,クラスオブジェクト内に格納される訓練画像コレクションには追加されません.} { ``trainIdx.at(queryIdx, i)`` には, ``(i < min(nMatches.at(0, queryIdx), trainIdx.cols))`` を満たす i-番目の訓練ディスクリプタのインデックスが格納されます. ``trainIdx`` が空の場合, :math:`\texttt{nQuery} \times \texttt{nTrain}` サイズの行列が作成されます.あるいは,ユーザが割り当てることもできます( ``nQuery`` 行で, ``CV_32SC1`` 型でなければいけません).列数は ``nTrain`` より小さい値でも構いませんが,結果を保存するのに十分なメモリがないという理由で,Matcher がすべてのマッチを検出できない可能性があります.} { ``nMatches.at(0, queryIdx)`` には, ``queryIdx`` に対するマッチの個数が格納されます.メモリ不足により Matcher がすべてのマッチを検出できなかった場合, ``nMatches`` が ``trainIdx.cols`` よりも大きい値になることがあります.注意してください.} { ``distance.at(queryIdx, i)`` には, ``(i < min(nMatches.at(0, queryIdx), trainIdx.cols))`` を満たす i-番目の訓練ディスクリプタとの距離が格納されます. ``trainIdx`` が空の場合, :math:`\texttt{nQuery} \times \texttt{nTrain}` の行列が作成されます.そうでなければ,ユーザによって割り当てられていなければいけません( ``trainIdx`` と同じサイズで, ``CV_32FC1`` 型でなければいけません)} :param maxDistance: 距離の閾値. :param mask: 入力されたクエリと訓練ディスクリプタの行列との,可能なマッチング指定するマスク. cv::gpu::BruteForceMather\_GPU::radiusMatch とは対照的に,結果は距離の昇順で格納されるわけではありません. この関数は,compute capabiity :math:`>=` 1.1 のデバイスでのみ動作します. .. index:: cv::gpu::BruteForceMatcher_GPU::radiusMatchDownload .. _cv::gpu::BruteForceMatcher_GPU::radiusMatchDownload: cv::gpu::BruteForceMatcher_GPU::radiusMatchDownload --------------------------------------------------- `id=0.142402172895 Comments from the Wiki `__ radiusMatch ```` ```` ```` cv::DMatch ```` ```` .. cfunction:: void radiusMatchDownload(const GpuMat\& trainIdx, const GpuMat\& nMatches, const GpuMat\& distance, std::vector< std::vector >\& matches, bool compactResult = false) を介して得られる trainIdx, nMatchesおよび distance行列をCPUにダウンロードして, のベクトルにします. compactResultが true の場合,マスクで除外されたクエリディスクリプタに対するマッチが, matchesベクトルに含まれないようになります.