zoukankan      html  css  js  c++  java
  • OpenFace库(Tadas Baltrusaitis)中基于Haar Cascade Classifiers进行人脸检測的測试代码

    Tadas Baltrusaitis的OpenFace是一个开源的面部行为分析工具,它的源代码能够从 https://github.com/TadasBaltrusaitis/OpenFace 下载。OpenFace主要包含面部关键点检測(facial landmard detection)、头部姿势预计(head pose estimation)、面部动作单元识别(facial action unit recognition)、人眼视线方向预计(eye gaze estimation)。
    编译Tadas Baltrusaitis的OpenFace须要依赖开源库boost、dlib、TBB、OpenCV。

    下面是基于Haar Cascade Classifiers方法的人脸检測的測试代码:

    #include "funset.hpp"
    #include <vector>
    #include <string>
    #include <fstream>
    
    #include <filesystem.hpp>
    #include <filesystem/fstream.hpp>
    #include <dlib/image_processing/frontal_face_detector.h>
    #include <tbb/tbb.h>
    #include <opencv2/opencv.hpp>
    
    #include <LandmarkCoreIncludes.h>
    #include <FaceAnalyser.h>
    #include <GazeEstimation.h>
    
    #define CONFIG_DIR "E:/GitCode/Face_Test/src/TadasBaltrusaitis_OpenFace/lib/local/LandmarkDetector/"
    
    int test_FaceDetect_HaarCascade()
    {
    	std::vector<std::string> arguments{ "", "-wild", "-fdir", "E:/GitCode/Face_Test/testdata/",
    		"-ofdir", "E:/GitCode/Face_Test/testdata/ret1/", "-oidir", "E:/GitCode/Face_Test/testdata/ret2/" };
    
    	std::vector<std::string> files, depth_files, output_images, output_landmark_locations, output_pose_locations;
    	std::vector<cv::Rect_<double> > bounding_boxes; // Bounding boxes for a face in each image (optional)
    
    	LandmarkDetector::get_image_input_output_params(files, depth_files, output_landmark_locations, output_pose_locations, output_images, bounding_boxes, arguments);
    	LandmarkDetector::FaceModelParameters det_parameters(arguments);
    
    	cv::CascadeClassifier classifier(det_parameters.face_detector_location);
    
    	for (auto file : files) {
    		cv::Mat grayscale_image = cv::imread(file, 0);
    		if (grayscale_image.empty()) {
    			fprintf(stderr, "Could not read the input image: %s
    ", file.c_str());
    			return -1;
    		}
    
    		int pos = file.find_last_of("\");
    		std::string image_name = file.substr(pos + 1);
    		std::vector<cv::Rect_<double> > face_detections; // Detect faces in an image
    		LandmarkDetector::DetectFaces(face_detections, grayscale_image, classifier);
    
    		std::string image_path = file.substr(0, pos);
    		std::string save_result = image_path + "/ret2/_" + image_name;
    		cv::Mat bgr = cv::imread(file, 1);
    
    		fprintf(stderr, "%s face count: %d
    ", image_name.c_str(), face_detections.size());
    		for (int i = 0; i < face_detections.size(); ++i) {
    			cv::Rect_<double> rect{ face_detections[i] };
    			fprintf(stderr, "    x: %.2f, y: %.2f,  %.2f, height: %.2f
    ",
    				rect.x, rect.y, rect.width, rect.height);
    
    			cv::rectangle(bgr, cv::Rect(rect.x, rect.y, rect.width, rect.height), cv::Scalar(0, 255, 0), 2);
    		}
    
    		cv::imwrite(save_result, bgr);
    	}
    
    	int width = 200;
    	int height = 200;
    	cv::Mat dst(height * 5, width * 4, CV_8UC3);
    	int pos = files[0].find_last_of("\");
    	std::string image_path = files[0].substr(0, pos);
    	for (int i = 0; i < files.size(); i++) {
    		std::string image_name = files[i].substr(pos + 1);
    		std::string input_image = image_path + "/ret2/_" + image_name;
    
    		cv::Mat src = cv::imread(input_image, 1);
    		if (src.empty()) {
    			fprintf(stderr, "read image error: %s
    ", input_image.c_str());
    			return -1;
    		}
    
    		cv::resize(src, src, cv::Size(width, height), 0, 0, 4);
    		int x = (i * width) % (width * 4);
    		int y = (i / 4) * height;
    		cv::Mat part = dst(cv::Rect(x, y, width, height));
    		src.copyTo(part);
    	}
    	std::string output_image = image_path + "/ret2/result.png";
    	cv::imwrite(output_image, dst);
    
    	return 0;
    }
    运行结果例如以下图:


    人脸检測结果例如以下:


    GitHubhttps://github.com/fengbingchun/Face_Test

  • 相关阅读:
    bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊(分块算法)
    hdu 3652 "B-number"(数位DP)
    数位DP+其他
    hdu 4352 "XHXJ's LIS"(数位DP+状压DP+LIS)
    CodeForces 55D "Beautiful numbers"(数位DP+离散化处理)
    洛谷 P1163"银行贷款"(二分)
    ZOJ-3872-Beauty of Array-思维
    洛谷P3951 小凯的疑惑
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7344134.html
Copyright © 2011-2022 走看看