Проблема переполнения памяти - OpenCV - PullRequest
1 голос
/ 02 сентября 2010

Я написал алгоритм отслеживания BLOB-объектов в VC ++. Я запустил его в консольной программе, он просто блестяще работал.

Теперь я хотел написать остальную часть своего приложения на c #, поэтому я сделал dll из кода VC ++. И я вызываю эту DLL из кода C #.

Теперь в C # после запуска в течение примерно 2 минут приложение выдает ошибку;

Insufficient memory (Out of memory)
in function cvAlloc, .\cxalloc.cpp(111)

Я не где-то в коде, выделяя память с помощью cvAlloc, так что мне просто интересно, что заставляет его выдавать эту ошибку. Более того, один и тот же код выполняется часами, когда я запускаю его в консоли, не делая его dll.

Может кто-нибудь, пожалуйста, помогите мне в том, что вызывает это?

Спасибо.

Код:

int NumberBlob = 0, PosX = 0, PosY = 0;

    IplImage  *img = 0;
    IplImage  *gray_img = 0;
    IplImage  *thres_img = 0;
    IplImage  *blobs_img = 0;
    int key = 0;


    /* Always check if the program can find a device */
    if ( !capture ) 
    {
     data->status = 0;
     return;
    }

    CBlobResult blobs;
    CBlob *currentBlob;
    CvRect rect;

    int frame_count = 0;
    int i = 0;

    int screen_x = GetSystemMetrics(SM_CXSCREEN);
    int screen_y = GetSystemMetrics(SM_CYSCREEN);
    int mouse_x,mouse_y;
    double x=0;
    double y=0;

    if( frame_count == 0 )
    {
        /* Obtain a frame from the device */
        img = cvQueryFrame( capture );

        /* Always check if the device returns a frame */
        if( !img ) 
    {
          data->status = 1;
          return;
        }

        gray_img  = cvCreateImage( cvGetSize(img), img->depth, 1);
        thres_img = cvCreateImage( cvGetSize(img), img->depth, 1);
        blobs_img = cvCreateImage( cvGetSize(img), img->depth, 3);
    }


        /* Obtain a frame from the device */
        img = cvQueryFrame( capture );

        /* Always check if the device returns a frame */
        if( !img ) 
        {
         data->status=2;
         return;
        }

        frame_count = frame_count + 1;

        /* Flip image once, after blob processing it is flipped back */
        cvFlip(img,img,NULL);

        /* Convert image from Color to grayscale and 
                   then to binary (thresholded at 180) */
        cvCvtColor(img,gray_img,CV_RGB2GRAY);
        cvThreshold(gray_img,thres_img,200,255,CV_THRESH_BINARY);

        /* Find Blobs that are White, Hence 'uchar backgroundColor = 0' (Black) */
        blobs = CBlobResult(thres_img, NULL,0);

        /* Remove blobs if it does not cover minimum area specified below */
        blobs.Filter( blobs, B_EXCLUDE, CBlobGetArea(),B_LESS,5,50);

        /* Number of blobs */
        NumberBlob = blobs.GetNumBlobs();


        /* 'i' points to blob 0, i.e., first blob */
        /* If some blobs are detected then find the first blob */
        if(i==0 && blobs.GetNumBlobs()>i)
        {
         currentBlocb = blobs.GetBlob(i);
         rect = currentBlob->GetBoundingBox();
         PosX = currentBlob->MinX();
         PosY = currentBlob->MinY();

         currentBlob->FillBlob( blobs_img, CV_RGB(255,0,0));
        }

        cvZero(blobs_img);

        data->X=PosX;
        data->Y=PosY;
        data->status=1;
        return;

Это все, что я делаю. Эта логика прекрасно работает, когда я запускаю код в независимом консольном приложении, но не работает, когда я оборачиваю его в dll и вызываю из c #.

Кроме этого, у меня тоже есть структура

struct resultData
 {
     int X, Y, status;
     char* error;
 };

но мне интересно, будет ли генерироваться исключение OpenCV, если оно есть.

1 Ответ

1 голос
/ 03 сентября 2010

А как насчет утечек памяти?Не похоже, что вы освобождаете все ресурсы, такие как указатели на изображения и капли.Это должно быть вашей главной заботой.И cvAlloc () является внутренней функцией, которую OpenCV использует для выделения памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...