RinOS 16 Жалоба Опубликовано August 17, 2009 Всем привет! Есть код: void PyrSegment( IplImage* src, IplImage* dst ) { CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* comp = NULL; cvPyrSegmentation( src, dst, storage, &comp, 4, 200, 50 ); int n_comp = comp->total; for( int i=0; i<n_comp; i++ ) { CvConnectedComp* cc = (CvConnectedComp*) cvGetSeqElem( comp, i ); do_something_with( cc ); } cvReleaseMemStorage( &storage ); } ... IplImage *image = cvLoadImage("1.jpg"); IplImage *out = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels); PyrSegment(image, out); Взял из книжки на строке с cvPyrSegmentation выдает ошибку has a bad argument, какие же ей аргументы передовать? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 17, 2009 Всем привет! Есть код: void PyrSegment( IplImage* src, IplImage* dst ) { CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* comp = NULL; cvPyrSegmentation( src, dst, storage, &comp, 4, 200, 50 ); int n_comp = comp->total; for( int i=0; i<n_comp; i++ ) { CvConnectedComp* cc = (CvConnectedComp*) cvGetSeqElem( comp, i ); do_something_with( cc ); } cvReleaseMemStorage( &storage ); } ... IplImage *image = cvLoadImage("1.jpg"); IplImage *out = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels); PyrSegment(image, out);[/code] Взял из книжки на строке с cvPyrSegmentation выдает ошибку has a bad argument, какие же ей аргументы передовать? Вот работающий пример сегментации из папки opencv/examples/c: [code]#ifdef _CH_ #pragma package <opencv> #endif #ifndef _EiC #include "cv.h" #include "highgui.h" #include <math.h> #endif IplImage* image[2] = { 0, 0 }, *image0 = 0, *image1 = 0; CvSize size; int w0, h0,i; int threshold1, threshold2; int l,level = 4; int sthreshold1, sthreshold2; int l_comp; int block_size = 1000; float parameter; double threshold; double rezult, min_rezult; CvFilter filter = CV_GAUSSIAN_5x5; CvConnectedComp *cur_comp, min_comp; CvSeq *comp; CvMemStorage *storage; CvPoint pt1, pt2; void ON_SEGMENT(int a) { cvPyrSegmentation(image0, image1, storage, &comp, level, threshold1+1, threshold2+1); /*l_comp = comp->total; i = 0; min_comp.value = cvScalarAll(0); while(i<l_comp) { cur_comp = (CvConnectedComp*)cvGetSeqElem ( comp, i ); if(fabs(255- min_comp.value.val[0])> fabs(255- cur_comp->value.val[0]) && fabs(min_comp.value.val[1])> fabs(cur_comp->value.val[1]) && fabs(min_comp.value.val[2])> fabs(cur_comp->value.val[2]) ) min_comp = *cur_comp; i++; }*/ cvShowImage("Segmentation", image1); } int main( int argc, char** argv ) { char* filename = argc == 2 ? argv[1] : (char*)"fruits.jpg"; if( (image[0] = cvLoadImage( filename, 1)) == 0 ) return -1; cvNamedWindow("Source", 0); cvShowImage("Source", image[0]); cvNamedWindow("Segmentation", 0); storage = cvCreateMemStorage ( block_size ); image[0]->width &= -(1<<level); image[0]->height &= -(1<<level); image0 = cvCloneImage( image[0] ); image1 = cvCloneImage( image[0] ); // segmentation of the color image l = 1; threshold1 =255; threshold2 =30; ON_SEGMENT(1); sthreshold1 = cvCreateTrackbar("Threshold1", "Segmentation", &threshold1, 255, ON_SEGMENT); sthreshold2 = cvCreateTrackbar("Threshold2", "Segmentation", &threshold2, 255, ON_SEGMENT); cvShowImage("Segmentation", image1); cvWaitKey(0); cvDestroyWindow("Segmentation"); cvDestroyWindow("Source"); cvReleaseMemStorage(&storage ); cvReleaseImage(&image[0]); cvReleaseImage(&image0); cvReleaseImage(&image1); return 0; } #ifdef _EiC main(1,"pyramid_segmentation.c"); #endif Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Vicul 0 Жалоба Опубликовано August 18, 2009 Взял из книжки на строке с cvPyrSegmentation выдает ошибку has a bad argument, какие же ей аргументы передовать? В книге есть также следующая ссылка One important word of warning about src and dst: because all levels of the image pyramid must have integer sizes in both dimensions, the starting images must be divisible by two as many times as there are levels in the pyramid. For example, for a four-level pyramid, a height or width of 80 (2 × 2 × 2 × 5) would be acceptable, but a value of 90 (2 × 3 × 3 × 5) would not.* *Heed this warning! Otherwise, you will get a totally useless error message and probably waste hours trying to fi gure out what’s going on Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
RinOS 16 Жалоба Опубликовано August 18, 2009 В книге есть также следующая ссылка Не понимать ((, переводчик не помог. Скажите пожалуйста по русски. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Vicul 0 Жалоба Опубликовано August 18, 2009 Не понимать ((, переводчик не помог. Скажите пожалуйста по русски. Я понял это так: Размер исходной картинки должен делиться на 2 столько раз, сколько ты имешь уровней в пирамиде, н-р, если 4 уровня, то 4 раза все должно делиться на 2. Иначе ты получишь ошибку, которую трудно диагностировать. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kris 0 Жалоба Опубликовано November 14, 2009 а как работает этот алгоритм на пальцах не объясните, что за пирамида? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано November 14, 2009 а как работает этот алгоритм на пальцах не объясните, что за пирамида? Работает очень просто - уменьшает изображение число раз, кратное 2, затем увеличивает при помощи линейной интерполяции, получаем вот что: Гауссова пирамида - это пирамида из изображений от большего разрешения к меньшему, а Лаплассова пирамида наоборот. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах