Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV库的内存问题_C++_Opencv_Memory Leaks_Type Conversion_Cimg - Fatal编程技术网

C++ OpenCV库的内存问题

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

我需要将加载的图像转换为可以在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(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)