您的位置:首页 > 运维架构

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中了。



现在对例程程序进行一些修改,代码如下

/*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



再稍微修改下,加上上一幅,下一幅控制,便可以做出一个简单的图片浏览器

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: