我需要将使用CImg 库加载的图像转换为可以在 OpenCV 中使用的图像格式。
问题是 CImg 创建了 uchar 数组,其中数据以下列方式存储(在 3 通道图像的情况下):
- 首先是红色通道的像素,
- 然后绿色通道的所有像素都跟随,
- 然后 - 蓝色通道。
它看起来像这样:RRRRRR .... GGGGGG ... BBBBB B ...
OpenCV 以不同的方式存储数据:BGRBGRBGRBG 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];
}
}
}
这段代码运行良好。OpenCV 格式的转换图像是原始图像的完整副本。
我用 valgrind 测试了这段代码。它说它会导致很多内存问题。我找不到这个内存问题的原因。
I will be grateful, if you have any ideas on this matter! Or may be you know another method, which can load image from buffer in OpenCV (not cvDecodeImage).