Перейти к содержимому
Compvision.ru
femida1029

CvSeq и pointPolygonTest

Recommended Posts

Здравствуйте. Помогите, пожалуйста, разобраться.

Мне необходимо векторизовать чертеж, я использую стандартную функцию:

int Nc =cvFindContours( gray, storage,&contour,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));

В переменной Nc получаю значение 510, а contour ->total =8. На самом деле контуров 510, а 8 , возможно, внешних.

1)Возможно ли записать contour в массив, чтобы обращаться к i контуру (contour)?

2)Как удалить ненужный контур?

Такая запись не дала результата:

for(CvSeq* seq0 = contour;seq0!=NULL;seq0 = seq0->h_next) {

…………….// проверяю контур на пригодность, если не нужен, то ok=false

if(ok=false){

seq0->h_prev=seq0->h_next;

cvClearSeq(seq0); }

}

3)Как привести CvSeq к Mat?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

См. opencv\samples\cpp\tutorial_code\ShapeDescriptors\pointPolygonTest_demo.cpp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте, Smorodov. Спасибо за ответ.

Я использую Opencv 1.1 , а билдер 6. Где-то в Интернете прочитала, что файлы Opencv 2.0 и выше в 6 билдере скомпилировать невозможно. Конструкция vector<vector<Point> > не сработала, т.е запись в массив происходит, а вот считать записи не получается, да и использовать как CvArr не получается. Ниже мой код.

CvPoint *PointArray; vector <CvArr*> v4; //пробовала определять vector <CvPoint*> v4;

  k=0;  

  for(CvSeq *seq0 = contour;seq0!=NULL;seq0 = seq0->h_next) { 

     count = seq0 ->total;  PointArray = (CvPoint  *)malloc(count * sizeof(CvPoint)); 

 cvCvtSeqToArray(seq0,  PointArray, CV_WHOLE_SEQ); 

double area = fabs(cvContourArea(seq0));  

double perim = cvContourPerimeter(seq0);      

   if(area>50 && perim>50 && count >10)     { v4.push_back(PointArray);  k++;} }

 // здесь я пытаюсь обратиться к контуру

 PointArray = (CvPoint  *)malloc(count * sizeof(CvPoint));  

  PointArray=v4[0] ;   CvMat a; 

//на следующих строка программа вылетает.   

  a = cvMat(k, 1, CV_64FC1,PointArray); //или  

 a=cvCreateMat(k,2,CV_64FC1,v4[0]); 

//даже в этой строке ошибка 

int dims = cvGetDims( PointArray );

Подскажите мне, что я не так делаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

По поводу работы с контурами можете посмотреть здесь:

http://www.compvision.ru/forum/index.php?showtopic=6

Если кратко, то:

// Нах. контуры
cvFindContours( gray, storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
....
for(;contours!=0;contours = contours->h_next)
{
// Аппр. контуров полигонами
result = cvApproxPoly( contours, sizeof(CvContour), storage,CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.001, 0 );
....
// Объявление читалки точек
CvSeqReader reader;
// Инициализация читалки точек
cvStartReadSeq( result, &reader, 0 );
// Две точки
CvPoint pt[2];
....
// Достаем точки из хранилища точек и рисуем линии
for (int i=0;i<result->total-1;i++)
{
CV_READ_SEQ_ELEM( pt[0], reader );
CV_READ_SEQ_ELEM( pt[1], reader );
if(mt>0.5){cvLine(Grab,pt[0],pt[1],CV_RGB(255,0,0));}
else{cvLine(Grab,pt[0],pt[1],CV_RGB(0,255,0));}
}
}
....
}[/code]

Дальше точки можно и в матрицу записать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

возможность использовать vector<vector<Point>> появилась только начиная с какой то версии opencv >2 когда появился новый с++ интерфейс и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×