OpenCVでドロネー三角形メモ

ドロネー三角形(delaunay triangulation)という有名らしい幾何アルゴリズムがあって、画像処理で使われる時の文脈で話せば、与えられた点群に対してそれぞれをいい具合に結ぶ辺を返す。

で、素晴らしいことにOpenCVで実装されてる。http://opencv.jp/opencv-1.0.0/document/opencvref_cv_subdivisions.html


詳しい使い方は"OpenCV\samples\c\delaunay.c"参照。。
ただ、サンプルプログラムのような単純な描画処理では何の問題もないのですが、もともと通し番号のついた点群等を持っていて、これらの隣接関係を整理したいとき等は、ドロネー関数に座標値しか渡せないので不便。(当然アルゴリズム適用後には座標値しか戻ってこず、元の点群との対応を取るのが面倒。)


そこで、関数に渡した直後に、関数内部で保有する点に改めて通し番号を付けるとOKとのこと。
ドロネー関数用の点の構造体CvSubdiv2DPointにはflagsというint型の変数があるのでこれを利用します。


こんなかんじ

CvSubdiv2DPoint *p=0;
CvSubdiv2DEdge e0=0;

cvSubdiv2DLocate(subdiv, fp, &e0);
p = cvSubdivDelaunay2DInsert(subdiv, fp); // 追加された点へのポインタを返してくれる

p->flags = newindex; // ここで新たな通し番号を付ける(例えば元の点群でのそれ)



するとあとでまた取り出せる。
ほへー。めもめも。