簡體   English   中英

當給定的定位點是三角形的頂點之一時,OpenCV的Subdiv2D / Delaunay是否斷開?

[英]Is OpenCV's Subdiv2D / Delaunay broken when the point given to locate is one of the triangle's vertices?

用於構建三角剖分的代碼:

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;
}

但是,我的兩種方法都失敗了。 在前三行中,我嘗試查看locate是否在參數上放置了正確的邊。 沒錯,我遇到了細分錯誤。 在第二個塊中,我嘗試訪問CvSubdiv2DPoint結構中的first元素,但它也不起作用-分段錯誤。 first找不到這些點,也無法在其他邊緣上使用它進行迭代。

CvSubdiv2DPoint沒用的原因是,為了遍歷結構並實際找到三角形,我需要CvSubdiv2DEdge ,但是由於我無法從點轉換為邊,因此函數的結果是無用的。

我可能忽略了一些東西,但是對我來說似乎已經壞了。 這是文檔。 有什么想法嗎?

可以使用序列功能來迭代邊緣,以下是代碼:

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);
}

盡管我沒有找到一種方法來迭代連接到某個頂點的邊,但是通過使用細分本身作為序列,以相同的方式迭代頂點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM