Opencv 例程讲解8 --- 扩展, 基于图片列表的简易浏览器
2014-01-22 19:07
591 查看
上次例程中,介绍了Opencv例程中FileStorage 的基本用法,包括自定义类型的读写操作。这里做一个扩展,介绍Opencv中另外一个例程(EXAMPLE) imagelist_creator,它通过FileStorage 实现文件夹中图片的扫描,创建一个xml的文件列表,这个功能对于需要遍历读取一个文件夹中的所有图片文件十分管用,使用也相当方便。
我们先来看下例程中的程序如何使用。
可以看出如果直接使用例程中的程序,我们需要手动一个一个文件名输入,这将会很麻烦,特别是当图片量很大时,这是个不可能的工作。观察源代码中操作可以发现,FileStorage其实是通过main函数的av参数传递文件名,那如果我们有一个文件事先存储了图片文件名,要输入到FileStorage中就会十分方便,利用ifstream读一个文件名,在利用FileStorage写一个文件名,则这个例程的第二个参数可以换成一个存储了图片文件名的文本文件。那么如何生成这样的一个txt文件呢?幸运地是,dos命令提供了这样的操作。
输入以上命令,并可以在目录找到一个txt文件,打开如下图所示,F:\image_set文件夹下所有的图片文件名都保存到test.txt中了。
现在对例程程序进行一些修改,代码如下
打开imagelist.yaml,如下图所示
可以看出,这种方法是有效。不过还是会觉得有点繁琐,因为需要在cmd中先,输入命令生成一个txt的文件,再利用imagelistcreate程序对其处理,生成FileStorage风格的文件存储,有没有什么方法让这个过程更加简单吗?答案是有的,由于整个过程我们只需要输入命令行操作,很容易的,我们可以通过批处理来简化我们的操作。
具体命令如下:
再稍微修改下,加上上一幅,下一幅控制,便可以做出一个简单的图片浏览器
我们先来看下例程中的程序如何使用。
可以看出如果直接使用例程中的程序,我们需要手动一个一个文件名输入,这将会很麻烦,特别是当图片量很大时,这是个不可能的工作。观察源代码中操作可以发现,FileStorage其实是通过main函数的av参数传递文件名,那如果我们有一个文件事先存储了图片文件名,要输入到FileStorage中就会十分方便,利用ifstream读一个文件名,在利用FileStorage写一个文件名,则这个例程的第二个参数可以换成一个存储了图片文件名的文本文件。那么如何生成这样的一个txt文件呢?幸运地是,dos命令提供了这样的操作。
输入以上命令,并可以在目录找到一个txt文件,打开如下图所示,F:\image_set文件夹下所有的图片文件名都保存到test.txt中了。
现在对例程程序进行一些修改,代码如下
/*this creates a yaml or xml list of files from the command line args */ #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include <string> #include <iostream> #include <fstream> using std::string; using std::cout; using std::endl; using namespace cv; static void help(char** av) { cout << "\nThis creates a yaml or xml list of files from the command line args\n" "usage:\n./" << av[0] << " imagelist.yaml *.txt\n" << "Try using different extensions.(e.g. yaml yml xml xml.gz etc...)\n" << "This will serialize this list of images or whatever with opencv's FileStorage framework" << endl; } int main(int ac, char** av) { if (ac != 3) { help(av); return 1; } string outputname = av[1]; Mat m = imread(outputname); //check if the output is an image - prevent overwrites! if(!m.empty()){ std::cerr << "fail! Please specify an output file, don't want to overwrite you images!" << endl; help(av); return 1; } string filename = av[2]; // txt文件名 std::ifstream fstr(filename); // 利用ifstream对文件中的字符串进行读取 if(!fstr.is_open()) { std::cerr<<"failed to open an input file"<<endl; return 1; } string imagename; FileStorage fs(outputname, FileStorage::WRITE); fs << "images" << "["; while(fstr>>imagename){ // 读入一个文件名 fs << imagename; //写入到FileStorage风格的xml,yaml等格式中 } fs << "]"; return 0; }下面测试下效果,在cmd输入如下命令
打开imagelist.yaml,如下图所示
可以看出,这种方法是有效。不过还是会觉得有点繁琐,因为需要在cmd中先,输入命令生成一个txt的文件,再利用imagelistcreate程序对其处理,生成FileStorage风格的文件存储,有没有什么方法让这个过程更加简单吗?答案是有的,由于整个过程我们只需要输入命令行操作,很容易的,我们可以通过批处理来简化我们的操作。
具体命令如下:
@echo off dir /b F:\image_set\*.jpg >>imagelist.txt F:\opencvbuild\op248\build\bin\Debug\cpp-example-imagelist_creator imagelist.xml imagelist.txt这里使用imagelistcreate的绝对路径,这样可以在任意目录下运行,并在该目录下生成yaml格式的文件。如果需要生成其他文件夹的图片列表,只需改下文件夹的路径就可以。另外,如果只需要文件夹中的一部分文件而不是全部文件,比如left开头的一系列文件,那要怎么做呢?这个也简单,只需要更改dir 命令即可,
dir /b F:\image_set\left*.jpg >>imagelist.txt
再稍微修改下,加上上一幅,下一幅控制,便可以做出一个简单的图片浏览器
相关文章推荐
- 图片扩展---基于opencv-python实现
- Opencv 例程讲解 6 ---- 图片融合 addWeighted到底有多快?
- Opencv 例程讲解1 ----如何载入并显示图片
- Opencv 例程讲解 4 ----图片容器Mat
- 基于OpenCV的视频图像组态 (11): CEF浏览器与C++通信
- [译]在启用浏览器功能的INFOPATH表单中实现基于SQL SERVER的多级联动的下拉式列表
- 15款基于浏览器扩展的WEB开发工具
- Android图片加载神器之Fresco,基于各种使用场景的讲解
- 【Python_OpenCv】笔记1:基于Python和OpenCv的图片的加载,显示和图片的保存
- 基于OpenCV批量处理文件夹中的图片的方法
- 基于asp.net + easyui框架,js实现上传图片之前判断图片格式,同时实现预览,兼容各种浏览器+下载
- 15款基于浏览器扩展的WEB开发工具
- 简易图片浏览器
- Android 图片加载开源框架Fresco,基于各种使用场景的讲解
- 基于OpenCV3实现一个窗口显示若干张图片
- Python实现将照片变成卡通图片的方法【基于opencv】
- [转]图片中的字符分割提取(基于opencv)
- MPBrowser简易图片浏览器 v1.0
- 详细讲解Android图片下载框架UniversialImageLoader之内存缓存扩展(四)
- 一款基于jquery的鼠标经过图片列表特效