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\n", 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\n", 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, width: %.2f, height: %.2f\n",
				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\n", 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

时间: 2024-12-09 18:25:43

OpenFace库(Tadas Baltrusaitis)中基于Haar Cascade Classifiers进行人脸检测的测试代码的相关文章

基于OpenCV读取摄像头进行人脸检测和人脸识别

前段时间使用OpenCV的库函数实现了人脸检测和人脸识别,笔者的实验环境为VS2010+OpenCV2.4.4,opencv的环境配置网上有很多,不再赘述.检测的代码网上很多,记不清楚从哪儿copy的了,识别的代码是从OpenCV官网上找到的:http://docs.opencv.org/trunk/modules/contrib/doc/facerec/facerec_api.html 需要注意的是,opencv的FaceRecogizer目前有三个类实现了它,特征脸和fisherface方法

基于QT和OpenCV的人脸检测识别系统(1)

人脸识别分为两大步骤 1.人脸检测 这个是首要实现的,你得实现人脸显示的时候把人脸框出来,当然算法很多,还有一些人眼检测鼻子检测什么的 主要用的是这个 const char *faceCascadeFilename = "haarcascade_frontalface_alt.xml"; detect_and_draw(IplImageBuffer,storage,cascade); 这个函数就是检测人脸的并画框效果如下 主要代码如下 void Chenaini::detect_and

python图工具中基于随机块模型动态网络社团检测

原文链接:http://tecdat.cn/?p=7602 这是“政治博客圈和2004年美国大选”中的政治博客网络图,但是边缘束是使用随机块模型确定的(注:下图与图相同(即,布局和数据相同)). Tiago论文中的5-我只是在上面放了一个黑色背景 . 边缘配色方案与Adamic和Glance的原始论文中的相同,即每个节点对应一个博客URL,颜色反映政治取向,红色代表保守派,蓝色代表自由派.橙色边从自由派博客到保守派博客,紫色边从保守派到自由派(参见Adamic和Glance中的图1). 颜色方案

spring boot2 基于百度云apiface实现人脸检测与认证2

接上一篇,上篇只实现了人脸的认证,接下来实现人脸的检测. 原理介绍: 把摄像头抓拍的图像上传到服务器,服务器把图像上传到百度云,百度云返回识别出的人脸的数量和位置,前端根据服务端的返回,在图像中画出人脸的位置. 主要代码: 前端: function face_check(){ context.drawImage(video, 0, 0, 200, 150); jQuery.post('faceCheck', { //指定发送图片到的servlet snapData: canvas.toDataU

Adaboost算法详解(haar人脸检测)

Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器).Adaboost算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值.将修改过权值的新数据集送给下层分类器进行训练,最后将每次得到的分类器最后融合起来,作为最后的决策分类器. 算法概述 1.先通过对N个训练样本的学习得到第一个弱分类器: 2.将分错的样本和其他的新数据

基于Haar特征的Adaboost级联人脸检测分类器

基于Haar特征的Adaboost级联人脸检测分类器,简称haar分类器.通过这个算法的名字,我们可以看到这个算法其实包含了几个关键点:Haar特征.Adaboost.级联.理解了这三个词对该算法基本就掌握了. 1        算法要点 Haar分类器 = Haar-like特征 + 积分图方法 + AdaBoost +级联: Haar分类器算法的要点如下: a)        使用Haar-like特征做检测. b)       使用积分图(IntegralImage)对Haar-like特

基于Boost方法的人脸检测(1):整体思路

先推荐大家看着两篇: [2] Viola P, Jones M J. Robust Real-Time Face Detection[J]. International Journal of Computer Vision, 2004, 57(2):137-154. [3] http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html [4] http://blog.csdn.net/xiaowei_cqu/article/details

浅析人脸检测之Haar分类器方法:Haar特征、积分图、 AdaBoost 、级联

浅析人脸检测之Haar分类器方法 一.Haar分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸检测也逐渐作为一个单独的研究方向发展起来. 目前的人脸检测方法主要有两大类:基于知识和基于统计. Ø  基于知识的方法:主要利用先验知识将人脸看作器官特征的组合,根据眼睛.眉毛.嘴巴.鼻子等器官的特征以及相互之间的几何位置关系来检测人脸. Ø  基于统计的方法:将人脸看作一个整体的模式——二维像素矩

浅谈人脸检测之Haar分类器方法

我们要探讨的Haar分类器实际上是Boosting算法(提升算法)的一个应用,Haar分类器用到了Boosting算法中的AdaBoost算法,只是把AdaBoost算法训练出的强分类器进行了级联,并且在底层的特征提取中采用了高效率的矩形特征和积分图方法,这里涉及到的几个名词接下来会具体讨论. 在2001年,Viola和Jones两位大牛发表了经典的<Rapid Object Detection using a Boosted Cascade of Simple Features>和<R