Fadwa
Fadwa

Reputation: 1931

Insufficient memory error Opencv/c++

When i run this code it give "insufficient memory error"

#include "stdafx.h"
#include "PixelProcess.h"
#include "ContourProcess.h"

using namespace std;
using namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{

    int width = 480, height = 640, N = 3000, framesToLearn = 500, i, w, h, carCounter, PixelCounter, R, G, B, MyResult, c;
    float circularity;
    String fileName; 
    IplImage* image;
    Mat Output  = Mat::zeros(width, height,CV_8UC1);
    Mat Draw = Mat::zeros(width, height,CV_8UC3);
    vector<vector<Point> > contours;
    vector<Point> hull;
    vector<Point>  keys;
    vector<Vec4i> hierarchy;
    vector<Point> polygonRegion;
    Point centroid;
    GaussianMex *F = new GaussianMex[480*640];

    int Y[5] = {35,35,360,360,35};
    int X[5] = {223,340,590,1,223};

    clock_t begin = 0,end = 0;

    for(i = 1; i <= N ; i++){
        if (i>framesToLearn){begin = clock();}
        carCounter = 0;
        PixelCounter = 0;
        fileName = intToStr(i,"D:/Datasets/Elda2ry1/(");
        image = cvLoadImage(fileName.c_str(),CV_LOAD_IMAGE_COLOR);
        // Update the pixel gaussian model
        for(w = 0; w < width ; w++)
            for(h = 0; h < height ; h++)
            {
                R = uchar((image->imageData+w*image->widthStep)[h*image->nChannels+0]);
                G = uchar((image->imageData+w*image->widthStep)[h*image->nChannels+1]);
                B = uchar((image->imageData+w*image->widthStep)[h*image->nChannels+2]);
                MyResult = F[PixelCounter].Process(R,G,B);
                Output.row(w).col(h) = MyResult*255;
                PixelCounter ++;
            }
            if(i>framesToLearn){ //Extract Cars
                //Output dilation
                dilate(Output,Output,Mat());
                //Matrix to draw on
                cvtColor(Output,Draw,CV_GRAY2RGB);
                polygonRegion = DrawRegionOfInterest(Draw,X,Y,5);
                findContours(Output,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE,Point (0,0));

                for(c = 0; c< contours.size(); c++ )//for each contour
                {
                    //get convex hull and it's centroid
                    convexHull(contours[c],hull,false);
                    centroid = GetCentroidOfConvexHull(hull);
                    //check if the centroid is within the region of interest
                    if (pointPolygonTest(polygonRegion,centroid,false) >=0 )
                        // Check area and Solidity of the convex hull
                        if( contourArea(hull) > 800 && contourArea(contours[c])/contourArea(hull) > 0.7)
                        {
                            circularity = GetCircularity(hull,contourArea(hull),centroid);
                            // Check circularity wrt the hull position
                            if((centroid.y < width/3 && circularity <= 0.42)||(centroid.y > width/3 && (circularity >= 0.33) && (circularity <= 0.4)))
                            {

                                // Crop the car and save it
                                fileName = "D:\\Dataset\\F" + itos(i) + "C" + itos(carCounter) + ".jpg";
                                Rect myRect = cropMyImage(hull,image,fileName);
                            }
                        }
                }
            }
            clrscr();
    }
}

I found here : OpenCV Error: Insufficient memory

that findcontours function can cause this error but in my case i declared the vector> contours at the beginning of the code.

Upvotes: 1

Views: 6607

Answers (2)

berak
berak

Reputation: 39806

here's the culprit:

image = cvLoadImage(fileName.c_str(),CV_LOAD_IMAGE_COLOR);

you're loading 3000 IplImages and never release them...

instead, you should use the c++ api:

Mat image = imread(fileName,CV_LOAD_IMAGE_COLOR);

Upvotes: 3

Michael Burdinov
Michael Burdinov

Reputation: 4448

The error is "Insufficient memory" because you don't have enough memory... You have memory leak. You are reading images from the disk but you never releasing the memory they use.

And you shouldn't use IplImage in the first place. This is old format that was replaced by Mat (which you used as well). This situation wouldn't happen with Mat because it is a smart pointer and will release its own memory.

Upvotes: 4

Related Questions