gpt4 book ai didi

c++ - 错误 : insufficient memory opencv

转载 作者:太空宇宙 更新时间:2023-11-03 22:01:55 25 4
gpt4 key购买 nike

我正在尝试做一个项目,但我遇到了一个错误,所以请帮助我,错误是这样的:

OpenCV Error: Insufficient memory (Failed to allocate 3686404 bytes) in OutOfMemoryError, file /home/mario/OpenCV-2.2.0/modules/core/src/alloc.cpp, line 52
terminate called after throwing an instance of 'cv::Exception'
what(): /home/mario/OpenCV-2.2.0/modules/core/src/alloc.cpp:52: error: (-4) Failed to allocate 3686404 bytes in function OutOfMemoryError

我的代码是这样的:

#include <stdio.h>
#include <stdlib.h>
//#include "/usr/include/opencv/cv.h"
#include <cv.h>
#include <cvaux.h>
#include <highgui.h>
#include <math.h>
#include <iostream>
#define PI 3.1415926535898
double rads(double degs)
{
return (PI/180 * degs);
}
CvCapture *cap;
IplImage *img;
IplImage *frame;
IplImage *frame1;
IplImage *frame3;
IplImage *frame2;
IplImage *temp_image1;
IplImage *temp_image2;
IplImage *frame1_1C;
IplImage *frame2_1C;
IplImage *eig_image;
IplImage *temp_image;
IplImage *pyramid1 = NULL;
IplImage *pyramid2 = NULL;
char * mapx;
char * mapy;
int h;
int corner_count;
CvMat* M = cvCreateMat(3,3,CV_32FC1);
CvPoint p,q,_p,_q,l,s;
double hypotenuse;
double angle;
double angle1;

int line_thickness = 1, line_valid = 1, pos = 0;
CvScalar line_color;
CvScalar target_color[4] = { // in BGR order
{{ 0, 0, 255, 0 }}, // red
{{ 0, 255, 0, 0 }}, // green
{{ 255, 0, 0, 0 }}, // blue
{{ 0, 255, 255, 0 }} // yellow
};

inline static double square(int a)
{
return a * a;
}
char* IntToChar(int num){return NULL;}
/*{
char* retstr = static_cast<char*>(calloc(12, sizeof(char)));
if (sprintf(retstr, "%i", num) > 0)
{
return retstr;
}
else
{
return NULL;
}
}*/
inline static void allocateOnDemand( IplImage **img, CvSize size, int depth, int channels )
{
if ( *img != NULL ) return;

*img = cvCreateImage( size, depth, channels );
if ( *img == NULL )
{
fprintf(stderr, "Error: Couldn't allocate image. Out of memory?\n");
exit(-1);
}
}
void clearImage (IplImage *img)
{ for (int i=0; i<img->imageSize; i++)
img->imageData[i] = (char) 0;
}

int main()
{


/////////////////////////////////////////////////////////////////////////////////////////////
/* */
// Capturing from CAM or VIDEO //
/* */
/////////////////////////////////////////////////////////////////////////////////////////////

cap = cvCaptureFromCAM(0);

//cap = cvCaptureFromAVI("/home/saif/Desktop/NAO.. the project/jj/Test3.avi");


/////////////////////////////////////////////////////////////////////////////////////////////
/* */
// READING THE VIDEO'S FRAME SIZE //
/* */
/////////////////////////////////////////////////////////////////////////////////////////////


CvSize frame_size;

frame_size.height = (int) cvGetCaptureProperty( cap, CV_CAP_PROP_FRAME_HEIGHT );
frame_size.width = (int) cvGetCaptureProperty( cap, CV_CAP_PROP_FRAME_WIDTH );
cvNamedWindow("Optical Flow", CV_WINDOW_AUTOSIZE);
while(true)
{
frame = cvQueryFrame( cap );

if (frame == NULL)
{
fprintf(stderr, "Error: Hmm. The end came sooner than we thought.\n");
return -1;
}



/////////////////////////////////////////////////////////////////////////////////////////////
/* */
// ALLOCATING ANOTHER IMAGE IF IT IS NOT ALLOCATED ALREDAY //
/* */
/////////////////////////////////////////////////////////////////////////////////////////////


allocateOnDemand( &frame1_1C, frame_size, IPL_DEPTH_8U, 1 );
cvConvertImage(frame, frame1_1C, 0);
allocateOnDemand( &frame1, frame_size, IPL_DEPTH_8U, 3 );
cvConvertImage(frame, frame1, 0);

/////////////////////////////////////////////////////////////////////////////////////////////
/* */
// GET THE SECOND FRAME OF VIDEO //
/* */
/////////////////////////////////////////////////////////////////////////////////////////////


frame = cvQueryFrame( cap );
if (frame == NULL)
{
fprintf(stderr, "Error: Hmm. The end came sooner than we thought.\n");
return -1;
}

if(!frame)
{
printf("bad video \n");
exit(0);
}

allocateOnDemand( &frame2_1C, frame_size, IPL_DEPTH_8U, 1 );
cvConvertImage(frame, frame2_1C, 0);
allocateOnDemand( &frame2, frame_size, IPL_DEPTH_8U, 3 );
cvConvertImage(frame, frame2, 0);


CvSize optical_flow_window = cvSize(5,5);
eig_image = cvCreateImage( frame_size, IPL_DEPTH_32F, 1 );
temp_image = cvCreateImage( frame_size, IPL_DEPTH_32F, 1 );
CvTermCriteria optical_flow_termination_criteria = cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .3 );

/////////////////////////////////////////////////////////////////////////////////////////////
/* */
// Feature tracking //
/* */
/////////////////////////////////////////////////////////////////////////////////////////////

CvPoint2D32f frame1_features[20];
CvPoint2D32f frame2_features[20];
//cvCornerEigenValsAndVecs(eig_image, temp_image, 1 );
corner_count = 20;

cvGoodFeaturesToTrack(frame1_1C,eig_image , temp_image, frame1_features, &corner_count, 0.1, .01, NULL, 5, 1);

cvFindCornerSubPix( frame1_1C, frame1_features, corner_count,cvSize(5, 5) ,optical_flow_window , optical_flow_termination_criteria);
if ( corner_count <= 0 )

/****************** Printing out the detected number of features ********************/

printf( "\nNo features detected.\n" );
else

printf( "\nNumber of features found = %d\n", corner_count );

/////////////////////////////////////////////////////////////////////////////////////////////
/* */
// LUCAS-KANDE OPTICAL FLOW //
/* */
/////////////////////////////////////////////////////////////////////////////////////////////
char optical_flow_found_feature[20];
float optical_flow_feature_error[20];

allocateOnDemand( &pyramid1, frame_size, IPL_DEPTH_8U, 1 );
allocateOnDemand( &pyramid2, frame_size, IPL_DEPTH_8U, 1 );


cvCalcOpticalFlowPyrLK(frame1_1C, frame2_1C, pyramid1, pyramid2, frame1_features, frame2_features, corner_count, optical_flow_window, 5, optical_flow_found_feature, NULL, optical_flow_termination_criteria, NULL);






cvShowImage("Optical Flow", frame1);
cvWaitKey(50);
}

cvReleaseCapture(&cap);

//cvReleaseMat(&M);
cvDestroyWindow("cap");

return 0;
}

最佳答案

每次执行循环时,都会为 eig_imagetemp_image 创建新缓冲区,并泄漏旧缓冲区。

那些泄漏的缓冲区会不断累积,直到您用完内存。

关于c++ - 错误 : insufficient memory opencv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4663789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com