OpenCV: извлечение треугольников из триангуляции Делоне

Я использую 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
верхняя 0x2cc947d0
предыдущая 0x2cc84840
следующая 0x0 родитель 0x0 подпись
нижняя
верхняя
родитель< br> размер_блока
свободное_пространство
размер_блока 65408
свободное_пространство 0

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

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

Питер.


person OtagoHarbour    schedule 13.02.2012    source источник


Ответы (1)


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

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 в качестве параметра типа, который будет выполнять итерацию по краям одной и той же грани (треугольника).

person Michael Kupchick    schedule 16.02.2012
comment
Спасибо за ваш ответ и извините за мой медленный ответ. Я только что заметил ваш ответ. Мне не удалось найти тип переменной LineSegment. Мне было интересно, не могли бы вы сказать мне, где это определяется. Большое спасибо, Питер. - person OtagoHarbour; 26.02.2012
comment
Кроме того, как определяются края? Спасибо, Питер. - person OtagoHarbour; 27.02.2012
comment
О, извините, LineSegment — это моя внутренняя структура данных, я забыл удалить ее в примере. - person Michael Kupchick; 27.02.2012
comment
Следует ли удалить блок if (CV_IS_SET_ELEM(edge))? Спасибо. - person OtagoHarbour; 27.02.2012
comment
Нет. Вы должны реализовать свою логику внутри блока if (CV_IS_SET_ELEM(edge)). - person Michael Kupchick; 27.02.2012