利用haar实现人脸检测

vs2015+opencv4.0配置如下:

编译时需要的lib:

利用haar实现人脸检测

 运行时需要的dll

利用haar实现人脸检测

找到源码路径“...\opencv\sources\data\haarcascades”目录下的haar特征文件“haarcascade_frontalface_alt.xml”

如图:

利用haar实现人脸检测

代码:

#include <iostream>
#include "opencv2/opencv.hpp"


using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	double t1 = (double)getTickCount();

	//读取haar文件数据
	String cascadeFilePath = "E:/data/haarcascade_frontalface_alt.xml";
	CascadeClassifier face_cascade;
	if (!face_cascade.load(cascadeFilePath))
	{
		printf("could not load haar data...\n");
		return -1;
	}
	//读取图像
	Mat src, gray_src;
	src = imread(argv[1]);  //命令行参数
	if (src.empty())
	{
		cout << "Load image error..." << endl;
		return  -1;
	}

	//缩小图像,加快检测速度
	int cols = src.cols, rows = src.rows;
	float fRate= 1.0f;
	if (rows > 1000)
		fRate = rows *1.0f/ 800;
	resize(src,src,Size(src.cols/int(fRate),src.rows/ int(fRate)));

	//预处理
	cvtColor(src, gray_src, COLOR_BGR2GRAY);
	equalizeHist(gray_src, gray_src);  //直方图均衡化
	imshow("input image", src);

	//检测人脸
	vector<Rect> faces;
	face_cascade.detectMultiScale(gray_src, faces, 1.1, 2, 0, Size(30, 30));
	size_t vsize = faces.size();
	if (vsize < 1)
		return 0;

	//人脸画矩形
	for (size_t t = 0; t < faces.size(); t++) 
		rectangle(src, faces[t], Scalar(0, 0, 255), 2, 8, 0);

	//耗时计算
	double t2 = (double)getTickCount();
	double t = (t2 - t1) / getTickFrequency();
	cout << "spend time:"<<t << endl;
	
	imshow("output", src);
	waitKey(0);

	return 0;
}

运行结果:

利用haar实现人脸检测

1.这个检测有点慢,一般在1-2秒之间,所以程序中对大图缩放,所有图检测速度在0.4s左右

2.似乎是从opencv3.2以后,一般程序除了常用3个lib外,

   还需要添加"opencv_imgcodecs*.lib"(从highgui模块分离出来的,专门用于图像 读写)

3.另外,有点疑惑:

   为什么运行时的dll比编译时需要的lib要多好几个?

 

用opencv_world*.lib的朋友请忽略第2、3点