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

пример с cvPyrSegmentation не работает

Recommended Posts

Всем привет! Есть код:

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, какие же ей аргументы передовать?

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


Ссылка на сообщение
Поделиться на других сайтах
Всем привет! Есть код:

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

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


Ссылка на сообщение
Поделиться на других сайтах
Взял из книжки на строке с 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

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


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

Не понимать ((, переводчик не помог. Скажите пожалуйста по русски.

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


Ссылка на сообщение
Поделиться на других сайтах
Не понимать ((, переводчик не помог. Скажите пожалуйста по русски.

Я понял это так: Размер исходной картинки должен делиться на 2 столько раз, сколько ты имешь уровней в пирамиде, н-р, если 4 уровня, то 4 раза все должно делиться на 2. Иначе ты получишь ошибку, которую трудно диагностировать.

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


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

а как работает этот алгоритм на пальцах не объясните, что за пирамида?

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


Ссылка на сообщение
Поделиться на других сайтах
а как работает этот алгоритм на пальцах не объясните, что за пирамида?

Работает очень просто - уменьшает изображение число раз, кратное 2, затем увеличивает при помощи линейной интерполяции, получаем вот что:

PyrSeg.png

Гауссова пирамида - это пирамида из изображений от большего разрешения к меньшему, а Лаплассова пирамида наоборот.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×