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 でテストしました。多くのメモリの問題を引き起こすと言われています。このメモリの問題の原因がわかりません。
この件について何かアイデアがあれば、よろしくお願いします!または、OpenCV (cvDecodeImage ではない) のバッファから画像をロードできる別の方法を知っているかもしれません。