OpenCV jpeglib - eiichiromomma/CVMLAB GitHub Wiki
(OpenCV) jpeglib
cvLoadImageを使わないでjpegの画像を開く
CLRのWindowsフォームアプリを作る際にhighguiを含むと面倒事が起きるので、jpegしか使わない場合に限定してjpeglibで済ませる。 (他の画像を含む場合はBitmap←→IplImageを使う)
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;
}