2012-02-13 2 views
2

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

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 подписи
нижней
верхней
родитель
block_size
free_space
block_size 65408
free_space 0

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

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

Peter.

ответ

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

+0

Спасибо за Ваш ответ и извините за мой медленный ответ. Я только что заметил ваш ответ. Мне не удалось найти тип переменной LineSegment. Мне было интересно, можете ли вы сказать мне, где это определено. Большое спасибо, Питер. – OtagoHarbour

+0

Также, как определяются грани? Спасибо, Питер. – OtagoHarbour

+0

О, извините, LineSegment - это моя внутренняя структура данных, которую я забыл удалить в этом примере. –

Смежные вопросы