简体   繁体   English

内存不足错误Opencv / c ++

[英]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 我在这里找到: OpenCV错误:内存不足

that findcontours function can cause this error but in my case i declared the vector> contours at the beginning of the code. findcontours函数可能导致此错误,但是在我的情况下,我在代码开头声明了vector> 轮廓

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. 而且您不应该首先使用IplImage。 This is old format that was replaced by Mat (which you used as well). 这是被Mat(您也使用过)替换的旧格式。 This situation wouldn't happen with Mat because it is a smart pointer and will release its own memory. Mat不会发生这种情况,因为它是一个智能指针,并且会释放自己的内存。

here's the culprit: 罪魁祸首:

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

you're loading 3000 IplImages and never release them... 您正在加载3000个IplImages,并且从不释放它们...

instead, you should use the c++ api: 相反,您应该使用c ++ api:

Mat image = imread(fileName,CV_LOAD_IMAGE_COLOR);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM