鉴于用caffe做实验的时候,里面牵扯到一个问题是必须将训练集和测试集都转成256*256的图像,而官网给出的代码又不会用,所以我用opencv转了。其实opencv只转一幅图会很简单,关键在于“批量”二字,因此本博客应运而生了。

本博客详细讲解了如何使用opencv批量处理图像,使某一个文件夹内全部图像都resize成256*256的。如果理解了本次博客内容,则不光可以对图像进行resize操作,还可以用来对图像做其它批处理操作。

1 先用opencv转一幅图像试试

 #include "cv.h"
#include "highgui.h"
#include "math.h"
#include <iostream>
using namespace std; void main()
{
IplImage *src;
IplImage *dst;
src=cvLoadImage("C:\\Users\\LJJ\\Desktop\\测试图\\caffe实验\\resize\\0101.jpg", );//载入源图像
dst=cvCreateImage(cvSize(,),src->depth,src->nChannels);//分配一个256*256的目标图像,resize后的结果将放在这里
if(src==)
{
printf("打开图片失败!");
exit();
}
cvNamedWindow("src",CV_WINDOW_AUTOSIZE);//分配一个用以承载图片的窗口
cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);//分配一个用以承载图片的窗口
cvShowImage("src",src);//显示src
cvShowImage("dst",dst);//显示dst
cvWaitKey(); //此处插入resize
cvResize(src,dst);
//此处插入resize
cvSaveImage("C:\\Users\\LJJ\\Desktop\\测试图\\caffe实验\\resize\\result\\0101.jpg",dst);//保存dst
cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);//分配一个用以承载图片的窗口
cvShowImage("dst",dst);//显示dst
cvWaitKey();
}

这一部分怎么来的太简单了就不多说了,直接翻一下opencv中的cvResize函数声明,需要什么参数就填什么。

【实验结果】

src:

dst:

2 FindFirstFile函数与FindNextFile函数

使用这两个函数可以遍历整个图像文件夹。以下例子来自于百度百科,按照自己理解注释了。

 #include <iostream>
#include <windows.h>
using namespace std; void main()
{
WIN32_FIND_DATA p; //p是一个用于保存文件信息的结构体
HANDLE h=FindFirstFile("C:\\Users\\LJJ\\Desktop\\测试图\\caffe实验\\resize\\*.jpg",&p); /*FindFirstFile的返回值是一个句柄,第二个参数p是采用引用的方式,也就是说当这句话执行完毕后p就指向该文件*.jpg*/ cout<<p.cFileName<<endl;//打印被找到的第一个*.jpg的文件名
while(FindNextFile(h,&p)) //p不断后移,寻找下一个、下下一个*.jpg
{
cout<<p.cFileName<<endl;
}
}

这一部分是用来遍历整个文件夹里全部jpg类型的图像的。为了方便观察,我们的p指针每指向一个新的jpg文件,都将文件名打印出来。

【实验结果】

3 批量resize一个文件夹里的所有图像

这一部分结合了以上两部分内容。除此之外还需要一点点C++的string类的知识,知道string类实例化出的对象能够方便地进行字符串的拼接。

3-1 string类对象的正确用法

需要注意的一点是如果用string类实例化出一个对象,那么这个对象不是字符串,因此像C中用来将字符串转成整数的函数atoi呀,以及字符串里填上全路径用作文件地址索引呀,都是不能直接用这个对象的。

以“字符串-整数转换”为例:

 string label;

 label_int=atoi(label); //错误用法

 label_int=atoi(label.c_str());//正确用法

同理在这里把string类实例化出的对象用作路径索引时,也是不能直接给一个对象,得给出“对象.c_str()”。

3-2 路径头+文件名=全路径

这里要谈到将一个文件夹内所有jpg文件批量处理的核心思想。即以下几步:

(1)在第2节中的结构体p仅能给出它索引到的jpg文件的文件名,而没有给出它们的路径。

这些文件名如第2节所述,使用p.cFileName即可获取。

(2)每一幅图像的路径是相同的,只有文件名不同,鉴于这一点,我们应该自行给出这些图像的路径头——即“全路径-文件名”。

例如对图像C:\Users\LJJ\Desktop\测试图\caffe实验\resize\0000.jpg,其中“0000.jpg”是它的文件名,“C:\Users\LJJ\Desktop\测试图\caffe实验\resize\”就是它的路径头。在写成字符串时,应该对反斜杠\进行转义字符处理(即写成\\):

”C:\\Users\\LJJ\\Desktop\\测试图\\caffe实验\\resize\\”

(3)如前述,string类对象可以方便地进行字符串拼接,如:

 string label1=”one”;

 string label2=”two”;

 string label=label1+label2; //如果cout<<label,则输出字符串”onetwo”

因此我们可以方便地完成对路径头和文件名的拼接。其中路径头是我们自己给的,文件名则由p.cFileName获取,随着指针p后移,将会索引该文件夹内全部的jpg文件。

3-3 批量resize代码清单

 #include "cv.h"
#include "highgui.h"
#include "math.h"
#include <iostream>
#include <string>
#include <windows.h>
using namespace std; void main()
{
IplImage *src;
IplImage *dst;
WIN32_FIND_DATA p; //指向一个用于保存文件信息的结构体
HANDLE h=FindFirstFile("C:\\Users\\LJJ\\Desktop\\测试图\\caffe实验\\resize\\*.jpg",&p); //FindFirstFile的返回值是一个句柄,第二个参数p是采用引用的方式,也就是说当这句话执行完毕后p就指向该文件*.jpg //由于p的成员变量只有文件名,而无文件路径,所以必须加上路径头
string src_route_head="C:\\Users\\LJJ\\Desktop\\测试图\\caffe实验\\resize\\"; //源图像的路径头
string dst_route_head="C:\\Users\\LJJ\\Desktop\\测试图\\caffe实验\\resize\\result\\";//目标图像的路径头
string SourceRoute=src_route_head+p.cFileName; //包含了路径头和文件名的全路径
string DestRoute=dst_route_head+p.cFileName; src=cvLoadImage(SourceRoute.c_str(), );//载入源图像
dst=cvCreateImage(cvSize(,),src->depth,src->nChannels);//分配一个256*256的目标图像,resize后的结果将放在这里 cvResize(src,dst);
cvSaveImage(DestRoute.c_str(),dst);//保存dst //到目前为止,我们就已经完成了对目标文件夹中第一幅图像的resize处理与保存,接下来让该文件夹中其余图像也被处理 while(FindNextFile(h,&p)) //p指针不断后移,寻找下一个、下下一个*.jpg
{
SourceRoute=src_route_head+p.cFileName;
src=cvLoadImage(SourceRoute.c_str(), );//载入源图像 cvResize(src,dst); DestRoute=dst_route_head+p.cFileName;
cvSaveImage(DestRoute.c_str(),dst);//保存dst
}
}

2016.5.11

by 悠望南山

OpenCV玩耍(一)批量resize一个文件夹里的所有图像的更多相关文章

  1. matlab批量读取一个文件夹里类似命名的mat文件

    参考网址: Matlab读取同一路径下多个txt或mat文件总结 matlab 批量读取数据文件.mat .dat 整理:matlab批量读入数据文件的方法 首先命名方式体现在只是名字里数字有变化,其 ...

  2. 使用everything把一个文件夹里(包含子目录)的所有图片拷贝到另一个文件夹

    最近在找数据集,想要预览数据集里面的全部图片,而因为一些数据集的数据存储方式使得图片都分布在若干层后的子文件里,所以就需要一个如题所示的功能. 找了一堆XCOPY命令的使用方法,差点要撸起袖子写代码干 ...

  3. 教你IO流来便利电脑磁盘所有文件,把图片放到一个文件夹里(会发现什么不可告人的密码)

    一.需求 我要把C盘下面的所有图片都拿出来,放到一个新文件夹中.今天小编一身正气,看看有没有什么意外发现!!学会看看自己的盘,悄悄的哦!!! 二.代码展示(运行时间可能有点长) import java ...

  4. java 把一个文件夹里图片复制到另一个文件夹里

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.ut ...

  5. Word中用VBA插入一个文件夹里的所有.jpg图片

    每四张图片放在一页,第一行为四张图片的文件名 插入图片调整尺寸参考 Sub final() Dim FN As String, N%, W#, H#, PW#, PH# With ActiveDocu ...

  6. eclipse中把多个项目放在一个文件夹里

    1..Package Explorer 可以在这里打开 2.选择Working sets 3.新建java working set 4.把文件夹显示出来 5.可以把项目移动到文件夹里面了,鼠标左键拖就 ...

  7. C++实现:把一个文件夹里的冗余文件(.txt)删除

    代码很简单,调用了MFC里的几个函数.这里的冗余判断,是要遍历文件内容,进行两两比较. 需要注意的地方有两点: 1.源文件里头文件<afx.h>必须放在最前面.这里是为了避免nafxcwd ...

  8. SQL扫描并执行文件夹里的sql脚本

    场景:项目数据库操作全部使用存储过程实现.每天都会有很多存储过程更新/增加,人工对测试环境中存储过程更新,会有一定概率出现遗漏,也麻烦!所以,需要一个工具将文件夹中所有存         储过程执行一 ...

  9. shell 批量压缩指定文件夹及子文件夹内图片

    shell 批量压缩指定文件夹及子文件夹内图片 用户上传的图片,一般都没有经过压缩,造成空间浪费.因此须要编写一个程序,查找文件夹及子文件夹的图片文件(jpg,gif,png),将大于某值的图片进行压 ...

随机推荐

  1. ylbtech_dbs_article_五大主流数据库模型

    ylbtech_dbs_article 摘要:什么是数据模型? 访问数据库中的数据取决于数据库实现的数据模型.数据模型会影响客户端通过API对数据的操作.不同的数据模型可能会提供或多或少的功能.一般而 ...

  2. django book用户认证学习

    用户与Authentication 通过session,我们可以在多次浏览器请求中保持数据, 接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们需要 ...

  3. C语言:宽字符集操作函数

    C语言:宽字符集操作函数 (unicode编码) 字符分类: 宽字符函数普通C函数描述 iswalnum() isalnum() 测试字符是否为数字或字母 iswalpha() isalpha() 测 ...

  4. 2017.7.10 (windows)redis的安装

    参考来自:http://www.runoob.com/redis/redis-install.html 1.下载地址 https://github.com/MSOpenTech/redis/relea ...

  5. Linux组件封装(四)使用RAII技术实现MutexLock自动化解锁

    我们不止一次写过这种代码: { mutex_.lock(); //XXX if(....) return; //XXX mutex_.unlock(); } 显然,这段代码中我们忘记了解锁.那么如何防 ...

  6. OpenStack二三事(1)

    更新系列不是教材,不说教,不讲道理,仅仅记录. OpenStack在云计算领域大热,没有理由不去了解它. 先说说我对OpenStack的感觉,开源.廉价.麻烦.大家都在用,在了解开发流程后.OpenS ...

  7. HDU4674 Trip Advisor

    Problem Description There is a strange country somewhere which its transportation network was built ...

  8. 把质量控制工作往前推进(1)——安装sonarqube

    曾经关注点一直在怎么提高应用程序的质量,没太在意代码级别的质量.近期由于某些因素的推动,须要关注到代码级别的质量去,把质量工作尽量往前推,也符合质量控制的原则.  试用了一下sonarqube(老版本 ...

  9. apk文件反编译

    apk文件的反编译,需要的工具apktool(反编译资源文件)和dex2jar-0.0.7.9-SNAPSHOT(反编译源码) 1.  下载相关软件 1)Apktool,下载地址:http://cod ...

  10. 计算机网络11--OSI參考模型

    本页内容 1.OSI參考模型简单介绍 2.OSI參考模型通信过程 3.OSI參考模型的数据封装 4.数据封装的意义 5.物理层 6.数据链路层 7.网络层 8.传输层 9.会话层 10.表示层 11. ...