画像から 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, octave
.
descriptors
行列は,
CV_32FC1
型の,
の行列です.
SURF_GPU クラスは,いくつかのバッファを利用し,そこへのアクセス手段を提供します.すべてのバッファは,関数呼び出しの合間で安全に解放できます.
参考: cv::SURF .
ブルートフォースディスクリプタ 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 .
クエリ集合内の各ディスクリプタに対するベストマッチを,訓練ディスクリプタから探します.
参考: DescriptorMatcher::match() .
各クエリディスクリプタに対するベストマッチを見つけます.結果は GPU メモリに保存されます.
{ディスクリプタのクエリ集合.} {ディスクリプタの訓練集合.これは,クラスオブジェクト内に格納される訓練ディスクリプタコレクションには追加されません.} {1行 CV_32SC1 型の行列.各クエリに対するベスト訓練インデックスが保存されます.マスク mask で除外されたクエリディスクリプタの場合,-1 が保存されます.} {1行 CV_32FC1 型の行列.各クエリに対するベスト距離が保存されます.マスク mask で除外されたクエリディスクリプタの場合, FLT_MAX が保存されます.}
パラメタ: |
|
---|
クエリ集合の各ディスクリプタに最もマッチするものを,訓練ディスクリプタから見つけます.結果は GPU メモリに保存されます.
{ディスクリプタのクエリ集合.} { GpuMat には,訓練コレクションが保存されています. makeGpuCollection の add メソッドを用いてセットされた,訓練ディスクリプタコレクションから取得することができます.これは1行の行列でなければならず,各要素は,1つの訓練ディスクリプタ行列を指す DevMem2D です.} {1行 CV_32SC1 型の行列.各クエリに対するベスト訓練インデックスが格納されます. maskCollection でマスクされたディスクリプタの場合, -1 が保存されます.} {1行 CV_32SC1 型の行列.各クエリに対する訓練インデックスが格納されます. maskCollection でマスクされたディスクリプタの場合, -1 が保存されます.} {1行 CV_32FC1 型の行列.各クエリに対するベスト距離が格納されます. maskCollection でマスクされたディスクリプタの場合, FLT_MAX が保存されます.}
パラメタ: |
|
---|
matchCollection
クエリ集合の各ディスクリプタに対して,最も良い上位 k 個のマッチを訓練ディスクリプタから見つけます.見つかった k 個(無理な場合は,それより少ない個数)のマッチは,その距離の昇順で返されます.
参考: DescriptorMatcher::knnMatch() .
クエリ集合の各ディスクリプタに対して,最も良い上位 k 個のマッチを訓練ディスクリプタから見つけます.見つかった k 個(無理な場合は,それより少ない個数)のマッチは,その距離の昇順で返されます.結果は GPU メモリに保存されます.
{ディスクリプタのクエリ集合.}
{ディスクリプタの訓練集合.これは,クラスオブジェクト内に保存される訓練ディスクリプタ集合には追加されません.}
{サイズが
で
CV_32SC1
型の行列.
trainIdx.at<int>(queryIdx, i)
には,i-番目に良い訓練ディスクリプタのインデックスが格納されます.マスク
mask
で除外されたクエリディスクリプタの場合,これは -1 になります.}
{サイズが
で
CV_32FC1
型の行列.各クエリと i-番目に良い訓練ディスクリプタとの距離が格納されます.マスク
mask
で除外されたクエリディスクリプタの場合,これは
FLT_MAX
になります.}
{クエリディスクリプタと訓練ディスクリプタの間のすべての距離を格納するバッファ.これは,サイズが
で
CV_32FC1
型の行列になります.
trainIdx
が,上位 k 個に入っていなければ
allDist.at<float>(queryIdx, trainIdx)
には
FLT_MAX
が入り,そうでない場合は
queryIdx
と
trainIdx
が示すディスクリプタ同士の距離が入ります.}
パラメタ: |
|
---|
各クエリディスクリプタに対して,与えられた閾値よりも小さい距離にあるベストマッチを見つけます.見つかったマッチは,その距離の昇順で返されます.
この関数は,compute capabiity
1.1 のデバイスでのみ動作します.
参考: DescriptorMatcher::radiusMatch() .
各クエリキーポイントに対して,与えられた閾値よりも小さい距離にあるベストマッチを見つけます.結果は GPU メモリに保存されます.
{ディスクリプタのクエリ集合.}
{ディスクリプタの訓練集合.これは,クラスオブジェクト内に格納される訓練画像コレクションには追加されません.}
{
trainIdx.at<int>(queryIdx, i)
には,
(i < min(nMatches.at<unsigned int>(0, queryIdx), trainIdx.cols))
を満たす i-番目の訓練ディスクリプタのインデックスが格納されます.
trainIdx
が空の場合,
サイズの行列が作成されます.あるいは,ユーザが割り当てることもできます(
nQuery
行で,
CV_32SC1
型でなければいけません).列数は
nTrain
より小さい値でも構いませんが,結果を保存するのに十分なメモリがないという理由で,Matcher がすべてのマッチを検出できない可能性があります.}
{
nMatches.at<unsigned int>(0, queryIdx)
には,
queryIdx
に対するマッチの個数が格納されます.メモリ不足により Matcher がすべてのマッチを検出できなかった場合,
nMatches
が
trainIdx.cols
よりも大きい値になることがあります.注意してください.}
{
distance.at<int>(queryIdx, i)
には,
(i < min(nMatches.at<unsigned int>(0, queryIdx), trainIdx.cols))
を満たす i-番目の訓練ディスクリプタとの距離が格納されます.
trainIdx
が空の場合,
の行列が作成されます.そうでなければ,ユーザによって割り当てられていなければいけません(
trainIdx
と同じサイズで,
CV_32FC1
型でなければいけません)}
パラメタ: |
|
---|
cv::gpu::BruteForceMather_GPU::radiusMatch とは対照的に,結果は距離の昇順で格納されるわけではありません.
この関数は,compute capabiity
1.1 のデバイスでのみ動作します.
を介して得られる trainIdx, nMatchesおよび distance行列をCPUにダウンロードして, のベクトルにします. compactResultが true の場合,マスクで除外されたクエリディスクリプタに対するマッチが, matchesベクトルに含まれないようになります.