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

图像处理程序的序列化和反序列化
       所谓序列化,就是讲内存数据保存为磁盘数据的过程,反序列化就是反过来理解。对于图像处理程序来说,最主要的变量是图片,然后还有相关的参数或运算结果。
 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;
}
 





目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/649558

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。