1. 程式人生 > >批量修改圖片大小

批量修改圖片大小

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資料夾上右擊,選擇儲存,該屬性表就儲存好了。

編碼

#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

參考