femida1029 0 Жалоба Опубликовано February 25, 2012 Здравствуйте. Помогите, пожалуйста, разобраться. Мне необходимо векторизовать чертеж, я использую стандартную функцию: 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? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано February 29, 2012 См. opencv\samples\cpp\tutorial_code\ShapeDescriptors\pointPolygonTest_demo.cpp Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
femida1029 0 Жалоба Опубликовано March 8, 2012 Здравствуйте, 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 ); Подскажите мне, что я не так делаю. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 8, 2012 По поводу работы с контурами можете посмотреть здесь: 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] Дальше точки можно и в матрицу записать. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано March 11, 2012 возможность использовать vector<vector<Point>> появилась только начиная с какой то версии opencv >2 когда появился новый с++ интерфейс и т.д. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах