三角測量を構築するためのコード:その後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.どのような考えですか?