roboforum.ru

Технический форум по робототехнике.

Работа с Contours

Работа с Contours

blackfxx » 18 авг 2010, 20:36

Есть список контуров contours
Необходимо получить список новый контуров sq_cards на основе старого(выкидывая по условию часть контуров). Вот на чем остановился:
Код: Выделить всёРазвернуть
CvSeq *contours=0; 
cvFindContours(...);
while(contours)
            {
            if((cvContourPerimeter(contours)<MAXPERIMETR)&&(cvContourPerimeter(contours)>MINPERIMETR))
            {
               for(int i = 0; i < contours->total; i++ )
               {
                  cvSeqPush(sq_cards,(CvSeq*)cvGetSeqElem(contours, i));
               }                                              
            }   
                contours = (contours)->h_next;
            }

В результате получается один контур со множеством точек из всех необходимых контуров. А необходимо получить список из несколькох контуров. Как можно реализовать эту задачу?

Re: Работа с Contours

=DeaD= » 18 авг 2010, 20:44

Так надо по завершению копирования экземпляра 1 контура в sq_cards создавать новый контур, цеплять его в хвост sq_cards и начинать дальше писать в него. Короче вопрос не по компьютерному зрению, а по работе со списками в си++.

Re: Работа с Contours

blackfxx » 18 авг 2010, 22:29

Спасибо, буду разбираться

Добавлено спустя 21 минуту 45 секунд:
переработал, ошибок не выдает. Но контуры не рисует. Заранее спасибо, если укажите в чем ошибка и как ее исправить.
Код: Выделить всёРазвернуть
CvMemStorage* storage = cvCreateMemStorage(0);   
   //счетчик новых контуров
   int counter = 0;      
   //новый набор контуров      
   CvSeq* sq_cards = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvSeq), storage );
   while(contours)
            {
            //новый контур, который вставляется в набор контуров
            CvSeq* sq_item = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvPoint), storage );
            if((cvContourPerimeter(contours)<MAXPERIMETR)&&(cvContourPerimeter(contours)>MINPERIMETR))
            {
               for(int i = 0; i < contours->total; i++ )
               {
                  //заносим точки в контур
                  cvSeqPush(sq_item,(CvSeq*)cvGetSeqElem(contours, i));
               }   
               counter++;
               //заносим в след элемент новый контур   
               sq_cards->h_next = sq_item;
               //переходим к следующему элементу для следующего прохода цикла
               sq_cards= sq_cards->h_next;               
            }            
                contours = (contours)->h_next;            
            }
   cvDrawContours(img_gray,sq_cards,color_red,color_blue,100,line_width);      
   cvShowImage( g_wnd_name, img_gray );
   cvWaitKey();


Добавлено спустя 49 минут 17 секунд:
Необходимость в этом отпала. Стал использовать апроксимирующие прямоугольники

Re: Работа с Contours

=DeaD= » 18 авг 2010, 22:31

Опять косяк при работе со списками - вы отправляете на прорисовку ссылку на последний еще пустой элемент списка.
Надо было запомнить первый указатель sq_cards после инициализации и его отправлять на прорисовку.

Re: Работа с Contours

blackfxx » 18 авг 2010, 22:50

Огромное спасибо!


Rambler\'s Top100 Mail.ru counter