OpenCV内存不足 我在Visual C++ 2008和OpenCV 2.1上运行以下代码。它工作一段时间(比如3分钟),然后中止,并显示一个错误
未知函数中的内存不足(分配92610字节失败),文件……。\ocv\opencv\src\cxcore\cxalloc.cpp,第52行 一定有一些内存泄漏的地方(可能与图像创建),但我似乎无法得到它OpenCV内存不足 我在Visual C++ 2008和OpenCV 2.1上运行以下代码。它工作一段时间(比如3分钟),然后中止,并显示一个错误,c++,memory,opencv,memory-leaks,C++,Memory,Opencv,Memory Leaks,未知函数中的内存不足(分配92610字节失败),文件……。\ocv\opencv\src\cxcore\cxalloc.cpp,第52行 一定有一些内存泄漏的地方(可能与图像创建),但我似乎无法得到它 #include "cv.h" #include "highgui.h" #include <stdio.h> #include <iostream> #include <math.h> using namespace std; void main() {
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
void main()
{
int i, j;
int **arr = new int*[480], blob[6][8]={0};
int max, maxi=-10, maxj=-10, div=80;
int xmax=480, ymax=640;
int frameH, frameW, fps, numFrames;
double hue, sat, lum;
int maxcolor, mincolor, maxcolval, mincolval;
char key='a';
CvScalar pix, destpix, destpix2, destpix3;
IplImage *img, *dest, *hsv;
for(i=0; i<480; i++)
arr[i] = new int[640];
CvCapture *capture = cvCaptureFromCAM(0);
if(!capture)
{
cout<<"Cannot read video!!!!";
exit(0);
}
frameH = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
frameW = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
printf("Width=%d Height=%d FPS=%d Count=%d\n", frameH, frameW, fps, numFrames);
cvNamedWindow("win1", CV_WINDOW_AUTOSIZE);
cvMoveWindow("win1", 10, 10);
cvNamedWindow("win2", CV_WINDOW_AUTOSIZE);
cvMoveWindow("win2", 600, 300);
destpix.val[0]=0;
destpix.val[1]=255;
destpix.val[2]=0;
destpix2.val[0]=0;
destpix2.val[1]=0;
destpix2.val[2]=0;
destpix3.val[0]=255;
destpix3.val[1]=255;
destpix3.val[2]=255;
while(key != 'q')
{
max=0;
maxi=-10;
maxj=-10;
img = cvQueryFrame(capture);
if(img == 0)break;
dest = cvCloneImage(img);
hsv = cvCloneImage(img);
cvCvtColor(img, hsv, CV_BGR2HSV);
for(i=0; i<xmax; i++)
for(j=0; j<ymax; j++)
{
arr[i][j]=0;
blob[i/div][j/div]=0;
}
cout<<endl<<cvGet2D(hsv, 5, 5).val[0];
//Looping through each pixel
for(i=0; i<xmax; i++)
{
for(j=0; j<ymax; j++)
{
//Getting the current pixel (i, j)
pix = cvGet2D(hsv, i, j);
//Setting all pixels to black
cvSet2D(dest, i, j, destpix2);
hue = pix.val[0];
sat = pix.val[1];
lum = pix.val[2];
//Looking for color red
if((hue<5 || hue>177) && sat>120 && lum>60)
{
arr[i][j] = 1;
cvSet2D(dest, i, j, destpix);
}
/*//Looking for color green
if((hue>90 && hue<100) && sat>120 && lum>60)
{
arr[i][j] = 1;
cvSet2D(dest, i, j, destpix);
}*/
/*//Looking for color blue
if((hue>100 && hue<110) && sat>120 && lum>60)
{
arr[i][j] = 1;
cvSet2D(dest, i, j, destpix);
}*/
/*//Looking for color yellow
if((hue>30 && hue<40) && sat>120 && lum>60)
{
arr[i][j] = 1;
cvSet2D(dest, i, j, destpix);
}*/
}
}
//Counting the blobs in each grid
for(i=0; i<xmax; i++)
{
for(j=0; j<ymax; j++)
{
if(arr[i][j])
{
blob[i/div][j/div]++;
}
}
}
//Finding the grid with the largest blob
for(i=0; i<xmax/div; i++)
for(j=0; j<ymax/div; j++)
if(blob[i][j]>max)
{
max=blob[i][j];
maxi=i;
maxj=j;
}
if(max>200)
{
//Borders
for(i=maxi*div; i<maxi*div+2; i++)
for(j=maxj*div; j<maxj*div+div; j++)
cvSet2D(dest, i, j, destpix3);
for(i=maxi*div+div-2; i<maxi*div+div; i++)
for(j=maxj*div; j<maxj*div+div; j++)
cvSet2D(dest, i, j, destpix3);
for(i=maxi*div; i<maxi*div+div; i++)
for(j=maxj*div; j<maxj*div+2; j++)
cvSet2D(dest, i, j, destpix3);
for(i=maxi*div; i<maxi*div+div; i++)
for(j=maxj*div+div-2; j<maxj*div+div; j++)
cvSet2D(dest, i, j, destpix3);
//Center
for(i=maxi*div+(div/2)-5; i<maxi*div+(div/2)+5; i++)
for(j=maxj*div+(div/2)-5; j<maxj*div+(div/2)+5; j++)
cvSet2D(dest, i, j, destpix3);
}
//Creating Windows
//cvCvtColor(fin, dest, CV_HSV2BGR);
key = cvWaitKey(20);
cvShowImage("win1", dest);
cvShowImage("win2", img);
}
cvWaitKey(0);
cvReleaseCapture(&capture);
cvReleaseImage(&dest);
cvDestroyWindow("win1");
cvDestroyWindow("win2");
}
#包括“cv.h”
#包括“highgui.h”
#包括
#包括
#包括
使用名称空间std;
void main()
{
int i,j;
int**arr=newint*[480],blob[6][8]={0};
int max,maxi=-10,maxj=-10,div=80;
int xmax=480,ymax=640;
int frameH、frameW、fps、numFrames;
双色调,色温,亮度;
int maxcolor、mincolor、maxcolval、mincolval;
char key='a';
CVPix、destpix、destpix2、destpix3;
IplImage*img、*dest、*hsv;
对于(i=0;i“内存不足”实际上是指“当我试图分配内存时出错”
很有可能您确实在某个地方损坏了某些内容,而不是实际耗尽了内存,尤其是使用这种类型的代码。“内存不足”实际上是指“我试图分配内存时出错”
很有可能您实际上在某个地方损坏了某些内容,而不是实际耗尽了内存,尤其是使用这种类型的代码。IplImage*img,*dest,*hsv
在将上述指针分配给新值之前,请检查文档,看看您是否负责释放这些指针。IplImage*img、*dest、*hsv
在将上述指针分配给新值之前,请检查文档,看看您是否负责释放这些指针。克隆图像的文档中说:
制作图像的完整副本
IplImage*cvCloneImage(常数
IplImage*图像)
形象
原始图像
函数cvCloneImage生成一个完整的
包括标题的图像副本,
投资回报率和数据
您正在每个循环中创建一个深度副本,并使用相同的指针保存它。每个循环都会丢失对previos分配的跟踪,而不会释放内存
编辑
此功能可帮助您:
释放图像
释放标题和图像数据
无效cvReleaseImage(IplImage**图像
))
形象
指向解除分配映像的标头的双指针
函数cvReleaseImage释放
标题和图像数据。此
call是
if( *image )
{
cvReleaseData( *image );
cvReleaseImageHeader( image );
}
尝试在while循环结束时释放内存。克隆图像的文档说明:
制作图像的完整副本
IplImage*cvCloneImage(常数
IplImage*图像)
形象
原始图像
函数cvCloneImage生成一个完整的
包括标题的图像副本,
投资回报率和数据
您正在每个循环中创建一个深度副本,并使用相同的指针保存它。每个循环都会丢失对previos分配的跟踪,而不会释放内存
编辑
此功能可帮助您:
释放图像
释放标题和图像数据
无效cvReleaseImage(IplImage**图像
))
形象
指向解除分配映像的标头的双指针
函数cvReleaseImage释放
标题和图像数据。此
call是
if( *image )
{
cvReleaseData( *image );
cvReleaseImageHeader( image );
}
试着在while循环结束时释放内存。以前的帖子,但这个问题最近确实让我头疼…
我也遇到了同样的问题,我只是在使用普通绘图函数。在这里,您基本上希望在每次迭代中复制一个图像。目前的情况是:dest=cvCloneImage(img)
将分配内存,将整个映像克隆到其中,并将指针返回到此新内存,因此您将丢失以前使用的指针值dest
。因此,如果那时您尚未使用cvreleasemage(img)
释放内存,您将出现内存泄漏。
必须有更简单的方法,而且确实有:
/* Copies source array to destination array */
CVAPI(void) cvCopy( const CvArr* src, CvArr* dst,
const CvArr* mask CV_DEFAULT(NULL) );
所以你只需要使用cvCopy(img,dest);
dest中的内容将被覆盖=>没有内存泄漏以前的帖子,但这个问题最近确实让我头疼…
我也遇到了同样的问题,我只是在使用普通绘图函数。在这里,您基本上希望在每次迭代中复制一个图像。目前的情况是:dest=cvCloneImage(img)
将分配内存,将整个映像克隆到其中,并将指针返回到此新内存,因此您将丢失以前使用的指针值dest
。因此,如果那时您尚未使用cvreleasemage(img)
释放内存,您将出现内存泄漏。
必须有更简单的方法,而且确实有: /* Copies source array to destination array */
CVAPI(void) cvCopy( const CvArr* src, CvArr* dst,
const CvArr* mask CV_DEFAULT(NULL) );
所以你只需要使用
cvCopy(img,dest)
dest中的内容将被覆盖=>无内存泄漏我不知道OpenCV,但我希望您需要在每个循环中释放img、dest和hsv。我不知道OpenCV,但我希望您需要在每个循环中释放img、dest和hsv。是的,他应该运行他的程序并在任务管理器中查看内存使用情况以进行检查。是的,我在tas时也遇到了这个错误k管理器没有超过85%的内存。问题是我的程序在大约一周前执行得很好,但现在在没有做任何更改后,突然出现了这个错误。是的,他应该运行他的程序,并在任务管理器中查看内存使用情况以进行检查。是的,我也遇到了这个错误,而任务管理器的内存没有超过85%。问题是我的p大约一周前,rogram执行得很好,但现在在没有做任何更改之后,它突然出现了这个错误。