多语言展示
当前在线:1211今日阅读:176今日分享:34

为OpenCV1.0添加cvJpeg2Ipl函数

为OpenCV1.0添加cvJpeg2Ipl函数,将JPEG数据转换为OpenCV对应的IPL对象数据。
方法/步骤
1

由于在OpenCV1.0中只提供了从硬盘打开JPEG图像进行解码,有些时候如果JPEG的图像数据是从内存载入的,就无法使用这些曾经很方便高效的接口。

2

为了实现这个目的,我们通过修改OpenCV1.0源码,在其源码包中添加函数,实现把jpeg数据从内存复制到IplImage结构中,这为我们进行相应处理会方便很多,实现过程如下:

3

修改源码包目录下的otherlibs/highgui目录下的如下源码文件:

4

1、highgui.h,在其中添加函数的声明:

5

CVAPI(IplImage*) cvJpeg2Ipl(char *jpegData, int jpegSize);

6

2、grfmt_jpeg.cpp,在其中添加函数的实现:

7

1)、添加头文件:

8

#include 'jpeglib.h'

9

2)、添加源代码:

10

void mem_init_source(j_decompress_ptr cinfo)           {               //  cinfo->src->bytes_in_buffer = g_buf_len;               //  cinfo->src->next_input_byte = (unsigned char*)g_buf;           }           boolean mem_fill_input_buffer(j_decompress_ptr cinfo)           {                 return true;           }           void mem_skip_input_data(j_decompress_ptr cinfo, long num_bytes)          {                cinfo->src->bytes_in_buffer -= num_bytes;                cinfo->src->next_input_byte += num_bytes;          }          boolean mem_resync_to_restart(j_decompress_ptr cinfo, int desired)          {                 return jpeg_resync_to_restart(cinfo, desired);          }         void mem_term_source(j_decompress_ptr cinfo)         {         }         // @jpegData: 内存中的JPEG图像数据流         // @jpegSize:数据流大小         CV_IMPL IplImage*         cvJpeg2Ipl(char *jpegData, int jpegSize)        {             IplImage *_pImg = 0;              jpeg_source_mgr jmgr;             struct jpeg_error_mgr jerr;             struct jpeg_decompress_struct cinfo;              cinfo.err = jpeg_std_error(&jerr);             jpeg_create_decompress(&cinfo);              jmgr.init_source = mem_init_source;             jmgr.fill_input_buffer = mem_fill_input_buffer;             jmgr.skip_input_data = mem_skip_input_data;             jmgr.resync_to_restart = mem_resync_to_restart;             jmgr.term_source = mem_term_source;             jmgr.next_input_byte = (unsigned char*)jpegData;             jmgr.bytes_in_buffer = jpegSize;             cinfo.src = &jmgr;             jpeg_read_header(&cinfo, TRUE);             jpeg_start_decompress(&cinfo);             int nRowSize = cinfo.output_width * cinfo.output_components;             int w =cinfo.output_width;             int h =cinfo.output_height;             char *bmpBuffer=new char[h*w*3];            JSAMPARRAY pBuffer = (*cinfo.mem->alloc_sarray)            ((j_common_ptr) &cinfo, 1, nRowSize, 1);           while(cinfo.output_scanline < cinfo.output_height)           {                jpeg_read_scanlines(&cinfo, pBuffer, 1);                 int start=nRowSize*(cinfo.output_scanline-1);                for(int i=0;iheight; h++)          {              for (w=0; w<_pImg->widthStep; w+=3)             {                  *(_pImg->imageData+h*_pImg->widthStep+w+0)=*(bmpBuffer+h*_pImg->widthStep+w+2);                  *(_pImg->imageData+h*_pImg->widthStep+w+1)=*(bmpBuffer+h*_pImg->widthStep+w+1);                  *(_pImg->imageData+h*_pImg->widthStep+w+2)=*(bmpBuffer+h*_pImg->widthStep+w+0);             }         }          delete bmpBuffer;         bmpBuffer=NULL;         return _pImg;     }

11

修改完成后得新编译安装OpenCV包即可,接下来就可以在程序中包含highgui.h头文件,然后就可以使用cvJpeg2Ipl函数了。END

推荐信息