2011-08-05 13 views
2

三角測量を構築するためのコード:その後locateに与えられた点が三角形の頂点の1つであるとき、OpenCVのSubdiv2D/Delaunayは壊れていますか?

CvSubdiv2D *subdiv; 
CvMemStorage *storage = cvCreateMemStorage(0); 
CvRect rectangle = cvRect(0, 0, 100, 100); 
subdiv = cvCreateSubdivDelaunay2D(rectangle, storage); 
CvPoint2D32f p1 = cvPoint2D32f(10, 10); 
CvPoint2D32f p2 = cvPoint2D32f(50, 10); 
CvPoint2D32f p3 = cvPoint2D32f(10, 50); 
cvSubdivDelaunay2DInsert(subdiv, p1); 
cvSubdivDelaunay2DInsert(subdiv, p2); 
cvSubdivDelaunay2DInsert(subdiv, p3); 

、ポイントの一つを使用してクエリを作成:あなたは結果を持っていたら

CvSubdiv2DEdge edge; 
CvSubdiv2DPoint *pp; 
CvSubdiv2DPointLocation loc = cvSubdiv2DLocate(subdiv, p1, &edge, &pp); 

が、あなたはポイントがオンに落ちるかどうかを確認する必要があります:

  • ファセット
  • エッジ
  • 頂点
  • この場合、定義された三角測量/長方形

の外側には、それは頂点です:

if(loc == CV_PTLOC_VERTEX) { 
//  CvSubdiv2DPoint *tp = cvSubdiv2DEdgeOrg(edge); 
//  CvPoint2D32f point = tp->pt; 
//  std::cout << point.x << ", " << point.y << std::endl; 

//  CvSubdiv2DPoint *tp = cvSubdiv2DEdgeOrg(pp->first); 
//  CvPoint2D32f point = tp->pt; 
//  std::cout << point.x << ", " << point.y << std::endl; 
} 

はしかし、それに両方の私のアプローチが失敗しています。最初の3行では、locateがパラメータに正しいエッジを置いているかどうかを調べました。それはしなかったし、私はセグメント違反を持っていた。 2番目のブロックでは、CvSubdiv2DPoint構造体のfirst要素にアクセスしようとしましたが、セグメンテーションフォルトも機能しません。私はfirst上のポイントを見つけることができないし、他のエッジでiterateを使うこともできない。

構造を反復し、実際の三角形を見つけるために、私はCvSubdiv2DEdgeを必要とする、ためCvSubdiv2DPointは無用である理由は、私はポイントからエッジへ変換することができないので、関数の結果であります役に立たない。

私は何か見落としているかもしれませんが、私にとっては壊れているようです。 Here's the documentation.どのような考えですか?

答えて

0

エッジは、ここでシーケンス機能を使用して反復することができるコードです:

CvMemStorage* storage = cvCreateMemStorage(); 
CvSubdiv2D* subdivision = cvCreateSubdivDelaunay2D(rect, storage); 
for (int i = 0; i < points.size(); ++i) 
{ 
    cvSubdivDelaunay2DInsert(subdivision, points[i]); 
} 

cvCalcSubdivVoronoi2D(subdivision); 
CvSeqReader reader; 
CvSeq* seq = (CvSeq*) subdivision->edges; 
cvStartReadSeq(seq, &reader); 
for (int i = 0; i < seq->total; ++i) 
{ 
    CvQuadEdge2D* edge = (CvQuadEdge2D*)reader.ptr; 
    if (CV_IS_SET_ELEM(edge)) 
    { 
       //Do something... 
    } 
    CV_NEXT_SEQ_ELEM(seq->elem_size, reader); 
} 

if (storage != 0) 
{ 
    cvReleaseMemStorage(&storage); 
} 

私は頂点を使用して同じように反復されている方法によって、いくつかの頂点に接続されたエッジを反復処理する方法を見つけることができませんでしたが、サブディビジョンそのものをシーケンスとして返します。

関連する問題