图像处理程序的序列化和反序列化

      所谓序列化,就是讲内存数据保存为磁盘数据的过程,反序列化就是反过来理解。对于图像处理程序来说,最主要的变量是图片,然后还有相关的参数或运算结果。这里区分4个部分、由简单到复杂,分享一下自己的研究成果,希望能够给需要的工程师提供一些帮助。
  
一、基本操作
        OpenCV本身提供了FileStorage的序列化保存方法,这对于保存参数来说非常适合;但是如果用来保存图片,会将原始图片的体积多倍增大,速度也比较慢。Mfc本身也提供了序列化的操作,但是使用起来的话,需要注意的地方比较多,比不上OpenCV来的直接。
        我们最终想要通过保存得到,并且能够被图像处理程序读取的,是一个单一的文件。这个文件不仅包含了图片数据,而且包括相关的参数和运算结果,同时这个文件不能太大。所以我想到采用zip压缩/解压的方式来打包原始图片和运算结果。实验证明,效果是能够符合要求的。
        在打包代码的选择上,找到了比较好的实现。zip.c++/unzip.c++中提供了稳定并且便于使用的压缩解压过程(具体使用参考对应的.h文件,压缩文件可以设定密码)。实际使用中,保存的时候参数保存为.xml文件,图片保存为.jpg图片,而后统一压缩成.go文件;读取的时候反过来操作。
        为了说明问题,编写例程。现在把使用说明一下,具体细节可以参考代码。
1、点击读取图片,可以读入jpg或bmp图片,同时手工设置参数一到三
2、点击保存,保存为.go文件
3、点击打开,打开相应的.go文件,同时解压缩后,图片和参数分别显示出来。
        本例程主要展现的是“图像处理程序的序列化和反序列化”,而后结合实际使用过程中发现的问题进行衍生。希望能够有类似需求的工程师提供一些帮助。
    
主要代码: //保存序列化结果
void CGOsaveView : : OnButtonSave()
{
    CString str1;string s1;
    CString str2;string s2;
    CString str3;string s3;

    CString szFilters = _T( "go(*.go)|*.go|*(*.*)|*.*||" );
    CString FilePathName = "" ;
    CFileDialog dlg(FALSE,NULL,NULL, 0 ,szFilters, this );
    if (dlg.DoModal() == IDOK){
        FilePathName = dlg.GetPathName();
    }   

    if (m_fimage.rows < = 0 )
    {
        AfxMessageBox( "m_fimage为空!" );
        return ;
    }
   
    GetDlgItemText(IDC_EDIT1,str1);
    GetDlgItemText(IDC_EDIT2,str2);
    GetDlgItemText(IDC_EDIT3,str3);
    s1 = str1.GetBuffer( 0 );
    s2 = str2.GetBuffer( 0 );
    s3 = str3.GetBuffer( 0 );

    string filename = "params.xml" ;
    FileStorage fs(filename, FileStorage : : WRITE);
    fs << "str1" << s1;
    fs << "str2" << s2;
    fs << "str3" << s3;
    fs.release();

    imwrite( "m_fimage.jpg" ,m_fimage);

    AfxMessageBox( "数据保存成功!" );


    HZIP hz = CreateZip(FilePathName, "GreenOpen" ); //可以设定密码
    ZipAdd(hz, "params.xml" , "params.xml" );
    ZipAdd(hz, "m_fimage.jpg" , "m_fimage.jpg" );
    CloseZip(hz);
    AfxMessageBox( "数据压缩成功!" );

  
}

//打开序列化结果
void CGOsaveView : : OnButtonOpen()
{
    string s1;
    string s2;
    string s3;

    CString szFilters = _T( "*(*.*)|*.*|go(*.go)|*.go||" );
    CString FilePathName = "" ;
    CFileDialog dlg(TRUE,NULL,NULL, 0 ,szFilters,
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值