2011-12-16 3 views
1

Я портирую код, который использует OpenCV только для соответствия эллипсу. Я могу переписать его позже, но сейчас мне нужно использовать процедуру OpenCV. Этот код всего несколько строк, но мне пришлось изменить почти все, потому что профиль cvFitEllipse2() изменился.OpenCV эффективно создает последовательность из массива uchar.

Мой проблематичной является следующий: преобразовать массив точки (Пара Uchar) в чем-то я могу кормить cvFitEllipse2() с

я не нашел много образцов кода, и я считаю, что OpenCV плохо документирован (но поскольку я новичок в OpenCV, возможно, это чувство неверно). Во всяком случае вот что я писал:

/* centers is the input uchar array */ 
CvBox2D box; //output 
CvMemStorage* storage = cvCreateMemStorage(0); 
CvSeq* seq = cvCreateSeq(CV_32FC2, sizeof(CvSeq), sizeof(CvPoint2D32f), storage); 

for(int h=0; h<mm; ++h) 
{ 
    CvPoint2D32f p; 
    p.x = (float)centers[h].x; 
    p.y = (float)centers[h].y; 
    cvSeqPush(seq, &p); 
} 

// Fits ellipse to current contour. 
box = cvFitEllipse2(seq); 

Проблема: этот код чертовски медленно по сравнению с исходной.

  • Есть ли способ предопределить память, необходимую для seq? (Используя объект CvMemStorage)
  • Существуют ли более эффективные (контейнеры проще? Чем CvSeq?
  • Могу ли я заменить cvSeqPush на что-то быстрее?

Спасибо большое за помощь!

ответ

3

Я полагаю, что centers является вектором точек.

Если вы счастливы использовать интерфейс C++ вместо старого, ваша боль закончилась.

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

vector<cv::Point> centers; 
RotatedRect rect = fitEllipse(centers); 

Или злостный подход:

struct { 
    uchar x, y 
} myPoint; 

vector<myPoint> centers; 
... 
int sz = centers.size(); 

// if you have a different type for x and y, modify here to CV_MY_TYPE 
// Here I have taken a pointer to the vector data storage, 
// and fed it into the Mat. 
// Check Mat documentation on constructors 
Mat pts(1,sz,CV_8UC2, (void*)&centers[0].x); 
RotatedRect rect = fitEllipse(pts); 
... 
// take care not to change/ delete your vector 
// before finishing with the pts Mat. 

EDIT

Я модифицировал типы в Uchar

+0

Вы зависимы от ** opencv **, не так ли? – karlphillip

+0

Любите его! Знаете ли вы трюк с (void *) &? – Sam

+0

Кстати, @karlphillip, похоже, вы так же зависимы, как и я;) – Sam

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