文件夹下图片批处理(图片名不要求连续,批量旋转)
工程上為提高人臉識別后期的效率,多采用批處理快速矯正法而不是讓圖片迭代收斂到矯正狀態。
人臉數據庫多有成千上萬張圖片,若圖片名不連續,則不能用格式化的路徑傳入法去批處理,而應采用文件的方法去批處理。
假設要將F:\face_recognition_database\testset路徑下的圖片批量旋轉矯正,處理后的圖像再以相同文件名批量存入F:\face_recognition_database\batch_testset文件夾。
1.準備工作:創建待批處理圖片文件名的.txt文件
在運行窗口輸入cmd打開命令提示符窗口,輸入命令行cd F:\face_recognition_database\testset進入到指定目錄,再輸入F:按回車即可看到當前所在路徑,再輸入dir /b/s/p/w *.png>inputimage.txt生成包含testset文件夾下所有圖片文件名的文本文件(inputimage為該文本文件的文件名),如下圖。
2.opencv處理
可以看到.txt中各圖片的具體路徑中都是單個的反斜杠\,但C++中識別路徑時只認雙反斜杠\\,故在使用文件時要用string類的find和insert函數作相應處理。本例中以圖片中心為旋轉中心,所有圖片順時針旋轉20度,大小縮放為原來的0.75倍。實際上做人臉矯正時需根據需要旋轉不同的角度,設置不同的縮放因子,博主將在后期補上更完善的人臉矯正批處理。為了讓讀取過程在控制臺可見,處理過程中額外添加了cout,讀者若不需要可刪除。全過程代碼如下。
#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include<iostream> #include<fstream> #include<cstring> #define IMAGE_LIST_FILE "F:\\face_recognition_database\\testset\\inputimage.txt" using namespace cv; using namespace std; int main() {ifstream inFile;string src,dst;char str[] = "testset";string str2 = "batch_testset";Mat images,rotate_dst;Mat rot_mat(2, 3, CV_32FC1);inFile.open(IMAGE_LIST_FILE);//按行處理路徑getline(inFile, src); cout << src << endl;while (inFile.good()){//C++路徑名默認為'\\',故在每一個'\'后再插入一個'\'int t=src.find('\\', 0); while (t != string::npos){src=src.insert(t+1,1,'\\');cout << src << endl;t = src.find('\\', t+2);}images = imread(src);// 計算旋轉中心點Point center = Point(images.cols / 2, images.rows / 2);//正值為逆時針旋轉,負值為順時針旋轉double angle = -20; double scale = 0.75;//求得旋轉矩陣rot_mat = getRotationMatrix2D(center, angle, scale);//旋轉圖片warpAffine(images, rotate_dst, rot_mat, images.size());//指定批處理后的保存路徑int t2 = src.find(str, 0);dst=src.erase(t2, strlen(str));dst=dst.insert(t2, str2);imwrite(dst, rotate_dst);getline(inFile, src);}inFile.close();return 0; }運行過程如下,可看到圖片正在批處理
處理速度尚可,不到10s,可看到最終在F:\face_recognition_database\batch_testset下成功生成了旋轉后的圖片。
3.后續工作
因本例中旋轉中心,旋轉角度以及縮放因子都是固定的,故在人臉矯正的工程應用上尚不合理。如何自適應的進行人臉矯正博主將在后續更新。
總結
以上是生活随笔為你收集整理的文件夹下图片批处理(图片名不要求连续,批量旋转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 力扣【25】K个一组翻转链表(字节跳动面
- 下一篇: windows版本的docker安装es