OpenCV jpeglib - eiichiromomma/CVMLAB GitHub Wiki

(OpenCV) jpeglib

cvLoadImageを使わないでjpegの画像を開く

目的

CLRのWindowsフォームアプリを作る際にhighguiを含むと面倒事が起きるので、jpegしか使わない場合に限定してjpeglibで済ませる。 (他の画像を含む場合はBitmap←→IplImageを使う)

jpeglib

Independent JPEG Group で配布されているライブラリを使用する。インストールや使い方はググれば出てくるのでパス。

ミソ

jpeg_read_scanlinesでライン毎にスキャンする時にimageDataへコピーする。

while (cinfo.output_scanline < cinfo.output_height) {
  jpeg_read_scanlines(&cinfo, buffer, 1);
  memcpy(src->imageData + (cinfo.output_scanline-1)*src->widthStep,
    buffer[0], row_stride);
}

※下のソースで示すrow_strideがwidthStepと必ず一致するかは確かめていないがBMPみたいな調整が入らなければ大丈夫な筈。

サンプル

殆どjpeglibのサンプル。例によってエラー処理は省略。

    #include <cv.h>
    #include <highgui.h>
    #include <jpeglib.h>

    int main(int argc, char** argv)
    {
      IplImage* src;
    #if 1
      //cvLoadImageを使わずにjpeg画像からIplImageのimageDataへ収納する方法
      FILE * infile;
      //jpeglibのお約束
      struct jpeg_decompress_struct cinfo;
      struct jpeg_error_mgr jerr;
      JSAMPARRAY buffer;		/* Output row buffer */
      int row_stride;		/* physical row width in output buffer */
      if ((infile = fopen(argv[1], "rb")) == NULL) {
        return -1;
      }
      cinfo.err = jpeg_std_error(&jerr);
      jpeg_create_decompress(&cinfo);
      jpeg_stdio_src(&cinfo, infile);
      jpeg_read_header(&cinfo, TRUE);
      jpeg_start_decompress(&cinfo);
      row_stride = cinfo.output_width * cinfo.output_components;
      buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
      //jpeglibのお約束ここまで
      //cinfoから画像サイズを取得
      src = cvCreateImage(cvSize(cinfo.image_width, cinfo.image_height), IPL_DEPTH_8U, cinfo.output_components);
      int id=0;
      //一行ずつ入れる
      while (cinfo.output_scanline < cinfo.output_height) {
        jpeg_read_scanlines(&cinfo, buffer, 1);
        memcpy(src->imageData + (cinfo.output_scanline-1)*src->widthStep,
          buffer[0], row_stride);
      }
      //bufferも開放してくれるらしい
      jpeg_finish_decompress(&cinfo);
      fclose(infile);
      //RGBなのでBGRに直す
      cvCvtColor(src,src,CV_RGB2BGR);
    #else
      src = cvLoadImage(argv[1], CV_LOAD_IMAGE_ANYCOLOR);
    #endif
      cvNamedWindow("src",CV_WINDOW_AUTOSIZE);
      cvShowImage("src",src);
      cvWaitKey(0);
      cvReleaseImage(&src);
      return 0;
    }
⚠️ **GitHub.com Fallback** ⚠️