1

CImg ライブラリで読み込まれた画像を、OpenCV で使用できる画像の形式に変換する必要があります。

問題は、CImg が uchar 配列を作成し、データが次の方法で格納されることです (3 チャネル画像の場合)。

  1. 最初に赤チャンネルのピクセルがあり、
  2. 次に、緑チャネルのすべてのピクセルが続きます。
  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 ではない) のバッファから画像をロードできる別の方法を知っているかもしれません。

4

1 に答える 1

0

問題は私のコードにはありませんでした。私が知ったように、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
于 2013-01-23T13:50:15.927 に答える