1

ワームの輪郭を構成する順序付けられたポイントのベクトルがあります (opencv で見つかりました)。ワームの骨格に沿ってポイントを取得しようとしています。私はこれを非常に速くしたいので、単純なセグメンテーション関数を持っています:

void Worm::segmentWorm(void)
{
    int jump = 5;
    int numPoints = wormContour.size();

    int currentIndex = headIndex; //large circle in image w/overlay
    int endIndex = tailIndex;     //small circle in image w/overlay
    int matchingIndex;

    int direction = (endIndex - currentIndex)/abs(endIndex - currentIndex);

    int thisSideLength = abs(endIndex - currentIndex);
    int otherSideLength = numPoints - thisSideLength;

    double lengthPercentage;

    if (direction > 0) {
        while (currentIndex < endIndex - jump) {
            currentIndex += jump;

            lengthPercentage = (double)(endIndex - currentIndex)/(double)thisSideLength;
            matchingIndex = boundCheck((int)((lengthPercentage * otherSideLength) + endIndex), numPoints - 1);

            segments.push_back(pair<int, int>(currentIndex, matchingIndex));
        }
    } else if (direction < 0) {
        while (currentIndex > endIndex + jump) {
            currentIndex -= jump;

            lengthPercentage = (double)(currentIndex - endIndex)/(double)thisSideLength;
            matchingIndex = boundCheck((int)(-(lengthPercentage * otherSideLength) + endIndex), numPoints - 1);

            segments.push_back(pair<int, int>(currentIndex, matchingIndex));
        }
    }
}

この関数の問題点は、ワームが大きく曲がると、つまり、輪郭が片側で凹状になると、スケルトンが角を切り取り、ワームの中心を表すことができなくなることです。私の解決策は、セグメントの端が凹んでいる場合はセグメントの端をずらして、セグメントとスケルトンを修正することです。

輪郭上のすべての凹面 (または凸面) の点を見つける非常に時間効率の良い関数に関する提案はありますか?

問題の画像:

ここに画像の説明を入力

4

1 に答える 1

1

いくつかの幾何学的計算を行わずに、その配列から正しい点のペアを取得する方法はありません。

1 つの解決策は、片側に沿って反復し、法線を使用してポイントの対応物を見つけることです。ワームの幅があまり変わらない場合は、固定オフセット長を使用して他のポイントを検索し、他のポイントでも反対側のポイントのサブセットを使用できると思います。これは、BF が一致することを意味します。非常に高速である必要があります。次に、繰り返しながらオフセットとサブセットを更新できます。

編集:相手のインデックスの最初の推測がそれほどひどいものではない場合、ポイントが近づくことがなくなるまで側面をトラバースできるため、ブルートフォースマッチは必要ありません.

于 2014-08-07T23:29:34.877 に答える