本博客在上一篇博客基础上添加了批量处理图片的功能,上一篇博客:
作者提供的程序是读取摄像头视频,而我需要读取图片,且利用txt文件批量读取图片,分别对每一张图片进行人脸检测和人脸关键点检测,并保存检测结果(也可以显示每张图片效果图)。
使用时,替换原来的main.cpp即可。
主要知识点:流处理,opencv图片读取,显示和保存。
流处理:添加头文件: #include <fstream> , 打开txt文件逐行读取,最后关闭;
opencv三个函数: imread(),imshow(),imwrite()。
txt文件内容形式:
002.jpg 090.jpg 1_30000.jpg 1_56000.jpg test1.jpg test10.jpg test11.jpg test12.jpg test13.jpg test14.jpg test15.jpg test16.jpg test2.jpg test21.jpg test23.jpg test25.jpg test26.jpg test27.jpg test3.jpg test36.jpg test37.jpg test4.jpg test50.jpg test6.jpg test7.jpg test8.jpg test9.jpg
源代码:
#include <iostream> #include <fstream> #include <string> #include "MTCNN.h" #include "opencv2/opencv.hpp" using namespace std; using namespace cv; int main() { vector<string> model_file = { "./MTCNN/model/det1.prototxt", "./MTCNN/model/det2.prototxt", "./MTCNN/model/det3.prototxt" // "./MTCNN/model/det4.prototxt" }; vector<string> trained_file = { "./MTCNN/model/det1.caffemodel", "./MTCNN/model/det2.caffemodel", "./MTCNN/model/det3.caffemodel" // "./MTCNN/model/det4.caffemodel" }; string a; ifstream infile; //使用流,逐行读取txt中图片名。 infile.open("./MTCNN/result/fd-test/name.txt"); string img_path = "./MTCNN/result/fd-test/"; MTCNN mtcnn(model_file, trained_file); while (infile) { infile >> a; string img_dir = img_path + a; //string字符串拼接,得到完成图片路径 cout << img_dir << endl; Mat img = imread(img_dir); vector<Rect> rectangles; vector<float> confidences; std::vector<std::vector<cv::Point>> alignment; mtcnn.detection(img, rectangles, confidences, alignment); for (int i = 0; i < rectangles.size(); i++) { rectangle(img, rectangles[i], cv::Scalar(255, 0, 0), 2); for (int j = 0; j < alignment[i].size(); j++) { cv::circle(img, alignment[i][j], 5, cv::Scalar(255, 255, 0), 2); } } string save_dir = "./MTCNN/result/fd-result/" + a; imwrite(save_dir, img); //保存图片 //imshow("image", img); //waitKey(0.5); } infile.close(); std::cout << "Hello, World!" << std::endl; return 0; }