4

このアルゴリズムが既知のものであるかどうかを知る必要があります。

void getMatches(IpVec &ipts1, IpVec &ipts2, IpPairVec &matches, float ratio) {
    float dist, d1, d2;
    Ipoint *match;

    matches.clear();

    for (unsigned int i = 0; i < ipts1.size(); i++) {
        d1 = d2 = FLT_MAX;

        for (unsigned int j = 0; j < ipts2.size(); j++) {
            dist = ipts1[i] - ipts2[j];

            if (dist < d1) // if this feature matches better than current best
            {
                d2 = d1;
                d1 = dist;
                match = &ipts2[j];
            } else if (dist < d2) // this feature matches better than second best
            {
                d2 = dist;
            }
        }

        // If match has a d1:d2 ratio < 0.65 ipoints are a match
        if (d1 / d2 < ratio) {
            // Store the change in position
            ipts1[i].dx = match->x - ipts1[i].x;
            ipts1[i].dy = match->y - ipts1[i].y;
            matches.push_back(std::make_pair(ipts1[i], *match));
        }
    }
}

class Ipoint {
public:

    //! Destructor

    ~Ipoint() {
    };

    //! Constructor

    Ipoint() : orientation(0) {
    };

    //! Gets the distance in descriptor space between Ipoints

    float operator-(const Ipoint &rhs) {
        float sum = 0.f;
        for (int i = 0; i < 64; ++i) {
            //std::cout << i << "\n";
            try {
                sum += (this->descriptor[i] - rhs.descriptor[i])*(this->descriptor[i] - rhs.descriptor[i]);
            } catch (char *str) {
                std::cout << "Caught some other exception: " << str << "\n";
            }

        }
        return sqrt(sum);
    };

    //! Coordinates of the detected interest point
    float x, y;

    //! Detected scale
    float scale;

    //! Orientation measured anti-clockwise from +ve x-axis
    float orientation;

    //! Sign of laplacian for fast matching purposes
    int laplacian;

    //! Vector of descriptor components
    float descriptor[64];

    //! Placeholds for point motion (can be used for frame to frame motion analysis)
    float dx, dy;

    //! Used to store cluster index
    int clusterIndex;
};

これは、SURFアルゴリズムの結果を比較します。

  1. これは最近傍アルゴリズムですか?これは、funcがすべてのポイントの最も近いポイントを検索しているように見えます。
  2. Quadtreeまたはkd-treeを使用して同じことを行うことはできますか?
  3. 画像ポイントと比較して、それらが同じか類似しているかを知るためのより良いアルゴリズムがありますか?
  4. できれば、それらをmysqlに保存し、kdツリーを構築して1つの画像をすべての画像で比較したいのですが、それは可能ですか?
  5. RANSACは、このタスクで何かに役立ちますか?
  6. 誤検知をキャッチする方法はありますか?
4

2 に答える 2

4

あなたはたくさんの質問をしました、そして私はそれらのすべてに答えることができるとは思いません、しかしここに私ができる限り多くのあなたの質問への答えがあります。

  1. これは間違いなく最近傍アルゴリズムであり、目標は最初のベクトルの各点に最も近い2つの点を見つけ、それらの距離の比率がカットオフ値よりも小さいかどうかを確認することです。

  2. これは、四分木またはkd木で行うことができますが、ポイントはすべて1次元の値であるため、平衡二分探索木を使用すると、はるかにうまくいく可能性があります。このようなツリーが与えられた場合、リンクリストをノードに通すと、二分探索木で最も近い要素pを検索し、それぞれのステップを(k + 1)トラバースすることで、テストポイントpに最も近いk個の近傍を見つけることができます。方向とあなたが見つけたもののk最近傍点を取る。これは時間O(lg n + k)で実行されます。ここで、nはポイントの数であり、kは上記のとおりです。これは、ルックアップごとにO(n)時間かかる現在のものよりも大幅に効率的です。

    特徴ベクトルの次元が1より大きく20未満の場合、kdツリーを使用することは非常に効果的な方法です。

    高次元の場合、kdツリーを適用する前にPCAで次元の数を減らすか、局所性鋭敏型ハッシュなどのよりスケーラブルなANN構造を使用することをお勧めします。

  3. SURFは、シーンとオブジェクトの検出に最適です。2つの画像が同じであるかどうかを確認する必要がある場合は、GISTなどのグローバル記述子アルゴリズムを使用する方が適切です。グローバル記述子を使用する利点は、画像全体に対して単一のベクトルを取得し、画像の比較が単純なユークレディアン距離で実行されることです。

  4. kd-treeは必要ないので、MySQLを使用してこれを確実に行うことができます。単純な平衡二分木で十分です。

  5. RANSACは、外れ値に対してロバストなモデルパラメーターを推定する方法です。複数の写真を3Dシーンに結合するためにSURF機能を使用する場合に便利です。

  6. 誤検知をチェックすることは間違いなく機械学習の演習であり、私はその分野で十分な訓練を受けていません。教師あり学習アルゴリズム(SVM、ブーストされた決定木、ニューラルネットワークなど)を使用してこれを行うこともできますが、これについてアドバイスするのに十分な知識はありません。

お役に立てれば!

于 2011-08-05T01:28:55.550 に答える
1

templatetypedefが残りの部分に対応しているので、5と答えます。RANSACは、パラメーター推定方法です(データポイントのセットに最適な線を見つけるようなものです)。したがって、最近傍探索では直接役立ちません。

于 2011-08-05T02:40:21.533 に答える