使用OpenCV中的libjpeg将IplImage压缩为JPEG

时间:2011-03-27 11:34:57

标签: opencv libjpeg iplimage

所以我有这个问题。我有一个IplImage,我想压缩为JPEG并用它做一些事情。我使用libjpeg8b。当代码退出jpeg_start_compress()函数时出现错误“Bogus input colorspace”。这是我的代码。

#include "highgui.h"
#include <stdio.h>
#include "jpeglib.h"
#include "cv.h"
#include <iostream>
#include <fstream>
using namespace std;
using namespace cv;

#pragma comment(lib, "jpeglib.lib")


bool ipl2jpeg(IplImage *frame, unsigned char **outbuffer, unsigned long*outlen) 
{
    IplImage *img  = new IplImage;
    memcpy(img,frame,frame->nSize);
    unsigned char *outdata = (uchar *) img->imageData;
    struct jpeg_compress_struct cinfo = {0};
    struct jpeg_error_mgr jerr;
    JSAMPROW row_ptr[1];
    int row_stride;

    *outbuffer = NULL;
    *outlen = 0;

    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo);
    jpeg_mem_dest(&cinfo, outbuffer, outlen);

    cinfo.image_width = frame->width;
    cinfo.image_height = frame->height;
    cinfo.input_components = frame->nChannels;
    cinfo.in_color_space = JCS_RGB;

    jpeg_set_defaults(&cinfo);
    jpeg_start_compress(&cinfo, TRUE);
    system("pause");
    row_stride = frame->width * frame->nChannels;


    while (cinfo.next_scanline < cinfo.image_height)
    {
        row_ptr[0] = &outdata[cinfo.next_scanline * row_stride];
        jpeg_write_scanlines(&cinfo, row_ptr, 1);
    }

    jpeg_finish_compress(&cinfo);
    jpeg_destroy_compress(&cinfo);

    return true;

}


int main()
{
    ofstream fout("text.txt");
    unsigned char **buf;
    buf  = new unsigned char* [120];
    for(int i=0;i<500;i++)
    {
        buf[i] = new unsigned char[120];
    }

    for(int i=0;i< 120;i++)
    {
        for(int j=0;j<120;j++)
        {
            buf[i][j]  = 0;
        }
    }

    unsigned long *len = new unsigned long;
    *len = 120*120;
    Ptr<IplImage> img = cvLoadImage("test.jpg",CV_LOAD_IMAGE_GRAYSCALE);
    ipl2jpeg(img,buf,len);

    for(int i=0;i< 120;i++)
    {
        for(int j=0;j<120;j++)
        {
            fout<<buf[i][j]<<endl;
        }
    }

    return 0;
}

2 个答案:

答案 0 :(得分:1)

你有没有理由不使用opencv的原生JPEG支持?

cvSaveImage(frame, "frame.jpeg");

文档为here

修改

如果您坚持使用libjpeg,请查看此post

答案 1 :(得分:1)

我之前从未使用过libjpeg,但看起来你正在混合色彩空间。您将图像加载为灰度(CV_LOAD_IMAGE_GRAYSCALE),但告诉libjpeg它是RGB图像(JCS_RGB)。您是否尝试过更改行

cinfo.in_color_space = JCS_RGB;

cinfo.in_color_space = JCS_GRAYSCALE;