批量修改图片大小

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hujinglovekmg/article/details/79023315
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环境变量中增加如下内容:

    ;D:\program_file\opencv\build\x64\vc14\bin

    其中build前面的位置是安装opencv的目录。

  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目录,具体如下:

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

    D:\program_file\opencv\build\x86\vc11\lib

    其中x64目录表示是针对win64的,vc14表示是适用于VS2015的。

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

    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,所以只添加此库就好了。

    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 中配置关系

编码

#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目录下所有文件
阅读更多
换一批

没有更多推荐了,返回首页