我从uEye工业相机中提取数据,并通过相机的应用程序接口检索图像。
我的代码看起来像这样:
bool get_image(char*& img)
{
void *pMemVoid; //pointer to where the image is stored
// Takes an image from the camera. If successful, returns true, otherwise
// returns false
if (is_GetImageMem(hCam, &pMemVoid) == IS_SUCCESS){
img = (char*) pMemVoid;
pMemVoid = NULL;
return true;
}
else
return false;
}我正在检索一个图像数据,如果检索成功,则返回true,否则返回false。
问题是我相信我正在使用img = (char*) pMemVoid泄漏内存,因为我反复调用这个函数,并且没有释放这个数据。如何释放分配给img的内存?
编辑:
我在一个使用is_AllocImageMem的函数中初始化摄像头:
// Global variables for camera functions
HIDS hCam = 0;
char* ppcImgMem;
int pid;
/* Initializes the uEye camera. If camera initialization is successful, it
* returns true, otherwise returns false */
bool init_camera()
{
int nRet = is_InitCamera (&hCam, NULL);
is_AllocImageMem(hCam,752, 480, 1 ,&ppcImgMem, &pid);
is_SetImageMem(hCam, ppcImgMem, pid);
is_SetDisplayMode (hCam, IS_SET_DM_DIB);
is_SetColorMode (hCam, IS_CM_MONO8);
int pnCol , pnColMode;
is_GetColorDepth(hCam, &pnCol , &pnColMode);
is_CaptureVideo(hCam, IS_WAIT);
if (nRet != IS_SUCCESS)
{
if (nRet == IS_STARTER_FW_UPLOAD_NEEDED)
{
hCam = hCam | IS_ALLOW_STARTER_FW_UPLOAD;
nRet = is_InitCamera (&hCam, NULL);
}
cout << "camera failed to initialize " << endl;
return false;
}
else
return true;
}发布于 2014-01-07 22:11:46
The API Documentation似乎暗示有一个相应的is_FreeImageMem函数。你试过吗?
编辑:看起来is_GetImageMem可能不会分配内存。从它的描述来看:
is_GetImageMem()返回上次用于图像捕获的图像内存的起始地址。
你要给is_AllocImageMem anywhere打电话吗?
发布于 2014-01-08 00:36:12
我在代码上运行valgrind,输出可能丢失了大约16,000,000字节,间接丢失了大约20,000,000字节。
从get_image检索图像并将其分配给img时,img被作为数据分配给OpenCV IplImage,如下所示:
IplImage* src = cvCreateImage(cvSize(752,480), IPL_DEPTH_8U, 1);
src -> imageData = img;IplImage被保留了下来,所以我不得不对存储在内存中的IplImage调用cvReleaseImage。现在valgrind报告间接损失为0,可能损失约160万。仍然没有解释160万,但我认为IplImage是内存泄漏的主要原因
https://stackoverflow.com/questions/20973737
复制相似问题