批量修改图片尺寸

基于opencv读取目录下图片文件,实现批量修改图片尺寸…

windows+visual studio2015+opencv 3.4.0+c++

批量修改图片

配置opencv

  1. 下载opencv。build:已经编译好的库文件和可执行文件,source: 未编译的源文件
  2. 添加环境变量。在build目录下,x64目录下面包含了64位程序所需dll文件。在这个两个目录下,有vc14,vc15两个文件夹,分别是针对vs2015,vs2017。将目录下的和VS版本对应的文件夹下的bin目录都加入PATH变量中。所以在PATH环境变量中增加如下内容,其中build前面的位置是安装opencv的目录:

    1
    ;D:\program_file\opencv\build\x64\vc14\bin
  3. 生成独立的opencv配置属性表
    通过操作生成一个单独的OpenCV配置属性表,然后将其导出保存起来,将来在需要用到OpenCV的程序中,直接导入这个保存的属性表即可
    下面都是在vs开发环境中:

  4. 创建一个空项目,文件->新建->项目->vc++->常规->空项目。通过视图->其他窗口->属性管理器找到属性管理器页面。每个项目都可以有四个编译情况,分别是:Debug|win32、Release|win32、Debug|x64、Release|x64,基本步骤都类似,下面针对Debug|win32来说。
  5. 在Debug|x64文件夹上右击,选择添加新项目属性表,在弹出的对话框里,给这个表取名为OpenCV_Debug_32.props,然后点击添加。
  6. 双击新建的属性表,弹出属性页
  7. 在属性页上,点击C/C++->常规->附加库包含目录,在这里添加OpenCV安装路径下的include目录,具体如下:

    1
    D:\program_file\opencv\build\include
  8. 在属性页上,点击链接器->常规->附加库目录,在这里添加OpenCV安装路径下的lib目录。注意:对不同编译情况和不同版本的VS,lib文件夹目录不同。对于VS2012下面的Debug|win32模式,lib文件夹目录为,其中x64目录表示是针对win64的,vc14表示是适用于VS2015的:

    1
    D:\program_file\opencv\build\x86\vc11\lib
  9. 在属性页上,点击链接器->输入->附加依赖项,在里面添加附加依赖的lib文件:
    这是2.4版本的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    opencv_imgproc340d.lib
    opencv_calib3d340d.lib
    opencv_contrib340d.lib
    opencv_core340d.lib
    opencv_features2d340d.lib
    opencv_flann340d.lib
    opencv_gpu340d.lib
    opencv_highgui340d.lib
    opencv_legacy340d.lib
    opencv_ml340d.lib
    opencv_nonfree340d.lib
    opencv_objdetect340d.lib
    opencv_ocl340d.lib
    opencv_photo340d.lib
    opencv_stitching340d.lib
    opencv_superres340d.lib
    opencv_ts340d.lib
    opencv_video340d.lib
    opencv_videostab340d.lib

    注意:1、340对应OpenCV3.4.0,其他版本做对应修改。
    2、后缀d代表Debug模式,如果是Release模式去掉d。
    我下载3.4.0版本,lib只有opencv_world340d.lib,所以只添加此库就好了。

    1
    opencv_world340d.lib
  10. 添加好之后,点击属性页面板右下角的应用,确定。

  11. 在Debug|x64文件夹上右击,选择保存,该属性表就保存好了。
  12. 在该项目目录下面找到这个属性表,保存到一个安全的地方,下次在要用OpenCV的工程里,找出属性管理器,右键,选择添加现有属性表即可。
    参考:在Visual Studio中使用OpenCV
    How to build applications with OpenCV inside the Microsoft Visual Studio
    VS配置OpenCV开发环境(c++):How & Why
    openvc一次配置永久使用
    Working with Project Properties
    VS项目属性页 Property page 与属性管理器 Property manager 中配置关系

编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <io.h>
#include <iostream>
#include <algorithm>
#include <string>
#include <opencv2\opencv.hpp>

using namespace std;
using namespace cv;

//读取指定目录下所有图片文件,目前只读取当前目录不读取下一级目录
vector<string> readfile(string srcpath) {
vector<string> flist; //文件+文件名
try {
for (int i = 0; i < srcpath.size(); i++) {
if (srcpath[i] == '\\')
{
srcpath.insert(i, "\\");
i++;
}
}
cout << srcpath;
const char *filepath = srcpath.c_str();
intptr_t hFile;
size_t n;//无符号整型
string p, t;
struct _finddata_t fileinfo;
//_findfirst失败返回-1
if ((hFile = _findfirst(p.assign(filepath).append("\\*").c_str(), &fileinfo)) != -1) {
do {
if (!(fileinfo.attrib & _A_SUBDIR)) {
p.assign(filepath).append("\\").append(fileinfo.name);
flist.push_back(p);//先放入文件
flist.push_back(fileinfo.name);//在放入文件名
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
catch (std::exception &e) {
cout << e.what() << endl;
}
return flist;
}

//修改图片大小,并保存在指定位置
void myresize(vector<string> flist,Size dst_size,string dst_dir) {
int n = flist.size();
for (int i = 0;i < n;i = i+2)
{
Mat iimg = imread(flist[i]);
Mat oimg;
if (iimg.empty())
{
cout << "读取文件" << flist[i] << "失败" << endl;
break;
}
resize(iimg, oimg, dst_size); //重定义目标图片大小

imwrite(dst_dir+"\\"+ flist[i+1], oimg); //保存图片
}
}

int main(int arg,char ** argv)
{
//输入说明 srcdir width height dst_dir,无法对gif处理
//srcdir:形如C:\Users\hujing\Desktop\srcimage
//width,height 整数
//dst_dir:形如 C:\Users\hujing\Desktop\srcimage

int width, height;
string src_dir, dst_dir;
cin >> src_dir >> width >> height >> dst_dir;
Size dst_size(width,height);
vector<string> flist = readfile(src_dir);
myresize(flist,dst_size,dst_dir);
return 0;
}

问题

  1. vs属性窗口不显示内容
    原因:位置找错了,属性管理器在view->otherwindow->property manage
    属性窗口不显示内容,尝试重启vs.

  2. 无法打开文件“LNK 1104;opencv_imgproc340d.lib”
    错误原因:lib库文件里面没有上面的lib,打开一看只有opencv_world340d.lib
    解决办法:在属性页链接器->输入->附加依赖项,将依赖项改为opencv_world340d.lib
    参考:配置OpenCV无法打开文件opencv_calib3d300d.lib

参考

  1. 在Visual Studio中使用OpenCV
  2. opencv教程-读取修改保存图像
  3. 读取windows目录下所有文件
-------------本文结束感谢您的阅读-------------
鼓励鼓励!