Работа с 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;
            }

В результате получается один контур со множеством точек из всех необходимых контуров. А необходимо получить список из несколькох контуров. Как можно реализовать эту задачу?
blackfxx
 
Сообщения: 4
Зарегистрирован: 12 авг 2010, 00:17

Re: Работа с Contours

Сообщение =DeaD= » 18 авг 2010, 20:44

Так надо по завершению копирования экземпляра 1 контура в sq_cards создавать новый контур, цеплять его в хвост sq_cards и начинать дальше писать в него. Короче вопрос не по компьютерному зрению, а по работе со списками в си++.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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 секунд:
Необходимость в этом отпала. Стал использовать апроксимирующие прямоугольники
blackfxx
 
Сообщения: 4
Зарегистрирован: 12 авг 2010, 00:17

Re: Работа с Contours

Сообщение =DeaD= » 18 авг 2010, 22:31

Опять косяк при работе со списками - вы отправляете на прорисовку ссылку на последний еще пустой элемент списка.
Надо было запомнить первый указатель sq_cards после инициализации и его отправлять на прорисовку.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Работа с Contours

Сообщение blackfxx » 18 авг 2010, 22:50

Огромное спасибо!
blackfxx
 
Сообщения: 4
Зарегистрирован: 12 авг 2010, 00:17


Вернуться в Компьютерное зрение

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5