OpenCV: извлечение треугольников из триангуляции Делоне - PullRequest
2 голосов
/ 13 февраля 2012

Я использую NetBeans 7.1 в Ubuntu 11.04 и хотел бы получить треугольники из набора точек, используя OpenCV. Я строю триангуляцию Делоне следующим образом.

CvMemStorage *storage;
size_t      ptIndex;
CvSubdiv2D* subdiv;

storage = cvCreateMemStorage(0);
subdiv =  cvCreateSubdivDelaunay2D( boundRect, storage );
for (ptIndex = 0; ptIndex<numPts; ptIndex++)
    cvSubdivDelaunay2DInsert(subdiv, points[ptIndex]);

Эта часть работает нормально. Он запускается, и полученное хранилище выглядит следующим образом.

хранилище 0xb287a90
подпись 1116274688
дно 0x2a2d57a0
пред 0x0 следующий 0x2a2e5730
top 0x2cc947d0
пред 0x2cc84840
следующий 0x0 родитель 0x0 подпись
Дно
верх
Родитель
block_size
free_space
block_size 65408
free_space 0

Я посмотрел документацию для этих функций здесь , но не могу найти какую-либо функцию для извлечения треугольников.

Буду очень признателен, если кто-нибудь скажет мне, как извлечь треугольники.

Питер.

1 Ответ

1 голос
/ 17 февраля 2012

Вы можете перебирать ребра следующим образом:

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

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))
    {
       // TODO: implement some edge related logic here...   
    }
    CV_NEXT_SEQ_ELEM(seq->elem_size, reader);
}

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

Затем вы можете использовать cvSubdiv2DGetEdge с CV_NEXT_AROUND_LEFT в качестве параметра типа, он будет перебирать ребра из одного фасета (треугольника)

...