C++ OpenCV库的内存问题
我需要将加载的图像转换为可以在OpenCV中使用的图像格式 问题在于,CImg创建了uchar阵列,其中数据以以下方式存储(对于3通道图像):C++ OpenCV库的内存问题,c++,opencv,memory-leaks,type-conversion,cimg,C++,Opencv,Memory Leaks,Type Conversion,Cimg,我需要将加载的图像转换为可以在OpenCV中使用的图像格式 问题在于,CImg创建了uchar阵列,其中数据以以下方式存储(对于3通道图像): 首先是红色通道的像素 然后绿色通道的所有像素跟随 然后是蓝色通道 它看起来是这样的:R。。。。G G G G G。。。B B B B B B B OpenCV以不同的方式存储数据:B G R B G R B G R 以下是我从CImg转换为IplImage的代码: CImg<uint8_t> src; src.load_jpeg_buffer
CImg<uint8_t> src;
src.load_jpeg_buffer(srcData, size);
size_t width = src._width;
size_t height = src._height;
size_t nChannels = src._spectrum;
size_t depth = 8;
IplImage* m_image = cvCreateImage(cvSize(width, height), depth, nChannels);
for(size_t i = 0; i < height; i++)
{
for(size_t j = 0; j < width;j++)
{
for(size_t k = 0; k < nChannels; k++)
{
((m_image->imageData + i * m_image->widthStep))[j * nChannels + nChannels - 1 - k] =
src._data[k * src.size() / 3 + k + (i * m_image->widthStep + j * nChannels) / 3];
}
}
}
cimgsrc;
src.load\u jpeg\u缓冲区(srcData,size);
尺寸\u t宽度=src.\u宽度;
尺寸高度=钢筋混凝土高度;
通道尺寸=src.\u谱;
尺寸和深度=8;
IplImage*m_image=cvCreateImage(cvSize(宽度、高度)、深度、通道);
对于(尺寸i=0;i<高度;i++)
{
对于(尺寸j=0;jimageData+i*m_image->widthStep))[j*n通道+n通道-1-k]=
src._数据[k*src.size()/3+k+(i*m_图像->宽度步长+j*nChannels)/3];
}
}
}
这个代码运行良好。OpenCV格式的转换图像是原始图像的完整副本
我用valgrind测试了这段代码。它说它会导致很多内存问题。我找不到此内存问题的原因。
如果你对此事有任何想法,我将不胜感激!
或者您可能知道另一种方法,它可以从OpenCV中的缓冲区加载图像(不是cvDecodeImage)。问题不在我的代码中。正如我发现的那样,OpenCV库函数会导致内存问题。valgrind的消息示例如下:
Use of uninitialised value of size 8
==16460== at 0x6500539: void cv::CvtColorLoop<cv::RGB2Gray<unsigned char> >(cv::Mat const&, cv::Mat&, cv::RGB2Gray<unsigned char> const&) (in /usr/local/lib/libopencv_imgproc.so.2.4.2)
==16488== 151,812 bytes in 1 blocks are possibly lost in loss record 3,419 of 3,425
==16488== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==16488== by 0x56A2470: cv::fastMalloc(unsigned long) (in /usr/local/lib/libopencv_core.so.2.4.2)
==16488== LEAK SUMMARY:
==16488== definitely lost: 19,988 bytes in 171 blocks
==16488== indirectly lost: 15,201,012 bytes in 311 blocks
==16488== possibly lost: 1,202,769 bytes in 3,618 blocks
==16488== still reachable: 693,651 bytes in 3,733 blocks
==16488== suppressed: 0 bytes in 0 blocks
使用大小为8的未初始化值
==16460==0x6500539:void cv::CvtColorLoop(cv::Mat const&,cv::Mat&,cv::RGB2Gray const&)(在/usr/local/lib/libopencv_imgproc.so.2.4.2中)
==16488==1个块中的151812字节可能在3425的丢失记录3419中丢失
==16488==at 0x4C2B6CD:malloc(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==16488==by 0x56A2470:cv::fastMalloc(无符号长)(in/usr/local/lib/libopencv_core.so.2.4.2)
==16488==泄漏汇总:
==16488==肯定丢失:171个块中有19988个字节
==16488==间接丢失:311个块中的15201012字节
==16488==可能丢失:3618个块中的1202769字节
==16488==仍可访问:3733个块中的693651字节
==16488==抑制:0个块中有0个字节
我建议您使用OpenCV的C++包装器,它易于从我的视图中使用,并且可以避免使用指针,这将帮助您避免内存泄漏。无论如何,在这部分代码之后,您是否释放了m_image?也许OpenCV有这样一个功能,比如CvFree…每次使用image之后,我都会使用cvReleaseImage(&image)