繁体   English   中英

内存不足错误Opencv / c ++

[英]Insufficient memory error Opencv/c++

当我运行此代码时,它会给出“内存不足错误”

#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();
    }
}

我在这里找到: OpenCV错误:内存不足

findcontours函数可能导致此错误,但是在我的情况下,我在代码开头声明了vector> 轮廓

错误是“内存不足”,因为您没有足够的内存...您有内存泄漏。 您正在从磁盘读取图像,但从未释放它们使用的内存。

而且您不应该首先使用IplImage。 这是被Mat(您也使用过)替换的旧格式。 Mat不会发生这种情况,因为它是一个智能指针,并且会释放自己的内存。

罪魁祸首:

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

您正在加载3000个IplImages,并且从不释放它们...

相反,您应该使用c ++ api:

Mat image = imread(fileName,CV_LOAD_IMAGE_COLOR);

暂无
暂无

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

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