利用haar实现人脸检测
vs2015+opencv4.0配置如下:
编译时需要的lib:
运行时需要的dll
找到源码路径“...\opencv\sources\data\haarcascades”目录下的haar特征文件“haarcascade_frontalface_alt.xml”
如图:
代码:
#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;
}
运行结果:
1.这个检测有点慢,一般在1-2秒之间,所以程序中对大图缩放,所有图检测速度在0.4s左右
2.似乎是从opencv3.2以后,一般程序除了常用3个lib外,
还需要添加"opencv_imgcodecs*.lib"(从highgui模块分离出来的,专门用于图像 读写)
3.另外,有点疑惑:
为什么运行时的dll比编译时需要的lib要多好几个?
用opencv_world*.lib的朋友请忽略第2、3点