2

CvSubdiv2D*OpenCVを使用して、サブディビジョン内の隣接する頂点のインデックスを取得することは可能かどうか疑問に思いました。

CvSubdiv2DPoint* pt = cvSubdiv2DEdgeOrg( CvSubdiv2DEdge edge );
index= pt->id;

したがって、座標のリストがある場合、たとえば、リストのポイント15は、エッジを介してリストのポイント300、210、400、および76に接続されていることがわかります。

座標を取得しても問題ないことはわかっていますが、興味はありません。この方法でインデックスを取得しようとして時間を無駄にしないようにしたいのですが、それ以外の場合は他の解決策を見つけようとします。

4

2 に答える 2

1

この問題を解決する方法は、サブディビジョンに挿入した後、ポイントのインデックスとその座標を保存するために、ソースファイルCvPoint2D32f内の構造体定義を変更することでした。types_c.h

これが私がしたことの段階的な手順です:

  1. types_c.hソースファイルを開きます(私の場合はにあります)~/OpenCV-2.4.3/modules/core/include/opencv2/core/types_c.hCvPoint2D32fサブディビジョンに挿入するポイントのインデックスを格納するために使用される構造体にフィールドを追加します。例えば:

    typedef struct CvPoint2D32f
    {
        float x;
        float y;
        int index;
    }
    CvPoint2D32f;
    
  2. ソースファイルを再度ビルドしてインストールします。

  3. サブディビジョンにポイントを挿入する前に、次のコードのように、ポイントのインデックスを保存してください。

    int i;
    for (i = 0; i < size; i++) {
        fp = cvPoint2D32f(x[i], y[i]);
        fp.index = i;
        cvSubdivDelaunay2DInsert(subdiv, fp);
    }
    
  4. サブディビジョン内のエッジをステップスルーするときは、以前に定義されたインデックスフィールドを参照するだけでインデックスにアクセスできます。たとえば、私の場合、これを次のように実行しました。

        CvSubdiv2DPoint* ptSub = cvSubdiv2DEdgeOrg(delaunay_edge);
        CvPoint2D32f pt32f = ptSub->pt;
        whatYouWant = pt32f.index;
    

それが役に立てば幸い。:)

于 2013-02-15T13:55:55.257 に答える
-1

はい、OpenCV 2 を使用するのが最善の方法です。CvSubdiv2DPoint に id が追加されています。

    #define CV_SUBDIV2D_POINT_FIELDS()\
         int            flags;      \
         CvSubdiv2DEdge first;      \
        CvPoint2D32f   pt;         \
         int id;

typedef struct CvSubdiv2DPoint
{
     CV_SUBDIV2D_POINT_FIELDS()
}
于 2013-04-17T15:20:49.767 に答える