批量修改圖片大小
windows+visual studio2015+opencv 3.4.0+c++
批量修改圖片
配置opencv
- 下載opencv。build:已經編譯好的庫檔案和可執行檔案,source: 未編譯的原始檔
新增環境變數。在build目錄下,x64目錄下面包含了64位程式所需dll檔案。在這個兩個目錄下,有vc14,vc15兩個資料夾,分別是針對vs2015,vs2017。將目錄下的和VS版本對應的資料夾下的bin目錄都加入PATH變數中。所以在PATH環境變數中增加如下內容:
;D:\program_file\opencv\build\x64\vc14\bin
其中build前面的位置是安裝opencv的目錄。
- 生成獨立的opencv配置屬性表
通過操作生成一個單獨的OpenCV配置屬性表,然後將其匯出儲存起來,將來在需要用到OpenCV的程式中,直接匯入這個儲存的屬性表即可
下面都是在vs開發環境中: - 建立一個空專案,檔案->新建->專案->vc++->常規->空專案。通過檢視->其他視窗->屬性管理器找到屬性管理器頁面。每個專案都可以有四個編譯情況,分別是:Debug|win32、Release|win32、Debug|x64、Release|x64,基本步驟都類似,下面針對Debug|win32來說。
- 在Debug|x64資料夾上右擊,選擇新增新專案屬性表,在彈出的對話方塊裡,給這個表取名為OpenCV_Debug_32.props,然後點選新增。
- 雙擊新建的屬性表,彈出屬性頁
在屬性頁上,點選C/C++->常規->附加庫包含目錄,在這裡新增OpenCV安裝路徑下的include目錄,具體如下:
D:\program_file\opencv\build\include
在屬性頁上,點選連結器->常規->附加庫目錄,在這裡新增OpenCV安裝路徑下的lib目錄。注意:對不同編譯情況和不同版本的VS,lib資料夾目錄不同。對於VS2012下面的Debug|win32模式,lib資料夾目錄為:
D:\program_file\opencv\build\x86\vc11\lib
其中x64目錄表示是針對win64的,vc14表示是適用於VS2015的。
在屬性頁上,點選連結器->輸入->附加依賴項,在裡面新增附加依賴的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
新增好之後,點選屬性頁面板右下角的應用,確定。
- 在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;
}
問題
vs屬性視窗不顯示內容
原因:位置找錯了,屬性管理器在view->otherwindow->property manage
屬性視窗不顯示內容,嘗試重啟vs.無法開啟檔案“LNK 1104;opencv_imgproc340d.lib”
錯誤原因:lib庫檔案裡面沒有上面的lib,開啟一看只有opencv_world340d.lib
解決辦法:在屬性頁連結器->輸入->附加依賴項,將依賴項改為opencv_world340d.lib
參考:配置OpenCV無法開啟檔案opencv_calib3d300d.lib