zoukankan      html  css  js  c++  java
  • 图像处理程序的序列化和反序列化

    图像处理程序的序列化和反序列化
           所谓序列化,就是讲内存数据保存为磁盘数据的过程,反序列化就是反过来理解。对于图像处理程序来说,最主要的变量是图片,然后还有相关的参数或运算结果。
     opencv本身提供了FileStorage的序列化保存方法,这对于保存参数来说非常适合;但是如果用来保存图片,会将原始图片的体积多倍增大,速度也比较慢。Mfc本身也提供了序列化的操作,但是使用起来需要修改的地方比较多。
           我们最终想要通过保存得到,并且能够被图像处理程序读取的,是一个单一的文件。这个文件不仅包含了图片数据,而且包括相关的参数和运算结果,同时这个文件不能太大。所以我想到采用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,this);
    if(dlg.DoModal()==IDOK){
    FilePathName=dlg.GetPathName();
    }
    HZIP hz = OpenZip(FilePathName,"GreenOpen");
    ZIPENTRY ze; GetZipItem(hz,-1,&ze); int numitems=ze.index;
    if (numitems <=0)
    {
    AfxMessageBox("文件读取错误!");
    return;
    }
    for (int i=0; i<numitems; i++)
    GetZipItem(hz,i,&ze);
    UnzipItem(hz,i,ze.name);
    }
    CloseZip(hz);
    AfxMessageBox("数据解压缩成功");
    m_fimage = imread("m_fimage.jpg");
    if (m_fimage.rows <=0 )
    {
    AfxMessageBox("文件读取错误!");
    return;
    }
    string filename = "params.xml";
    FileStorage fs(filename, FileStorage::READ);
    fs["str1"]>>s1;
    fs["str2"]>>s2;
    fs["str3"]>>s3;
     
    SetDlgItemText(IDC_EDIT1,s1.c_str());
    SetDlgItemText(IDC_EDIT2,s2.c_str());
    SetDlgItemText(IDC_EDIT3,s3.c_str());
    AfxMessageBox("数据反序列成功");
    SOURSHOW;
    }
     





  • 相关阅读:
    HTTP——Web服务器、代理、缓存
    nginx配置文件详解2
    nginx配置文件详解
    shell笔记2
    django笔记
    python 发请求,urllib,urllib2
    nginx配置
    python os模块学习
    mac 终端命令小结
    mac常用命令笔记
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/5907438.html
Copyright © 2011-2022 走看看