OpenCV中的HAAR与LBP数据
HAAR特征数据 参看 haarcascade_frontalface_alt.xml 各标签
LBP特征数据 参看 lbpcascade_frontalface.xml 各标签
数据格式XML
HAAR与LBP的区别:
HAAR特征是浮点数计算
LBP特征是整数计算
LBP训练需要的样本数量要比HAAR大
同样的样本空间, HAAR训练出来的数据检测结果要比LBP准确
扩大LBP的样本数据,训练结果可以跟HAAR一样
LBP的速度一般可以比HAAR快几倍
代码: haar特征检测与lbp特征检测对比
#include "../common/common.hpp"
static CascadeClassifier haar_cascader;
static CascadeClassifier lbp_cascader;
static String haarfile = "project/workspace_vs/OpenCV310Sources_contrib/install/etc/haarcascades/haarcascade_frontalface_alt.xml"; // haar特征训练数据
static String lbpfile = "project/workspace_vs/OpenCV310Sources_contrib/install/etc/lbpcascades/lbpcascade_frontalface.xml"; // lbp特征训练数据
void main(int argc, char** argv) {
haar_cascader.load(getCVImagesPath(haarfile));
lbp_cascader.load(getCVImagesPath(lbpfile));
Mat src_haar = imread(getCVImagesPath("images/test1_3.png"), IMREAD_COLOR);
Mat src_lbp, gray;
src_haar.copyTo(src_lbp);
imshow("src4-4", src_haar);
vector<Rect> faces;
cvtColor(src_haar, gray, COLOR_BGR2GRAY);
equalizeHist(gray, gray);
double st = getTickCount();
haar_cascader.detectMultiScale(gray, faces, 1.1, 3, 0, Size(30, 30)); // haar特征与lbp特征检测时间对比
double et = (getTickCount() - st) / getTickFrequency();
cout << "haar time consume : " << et << ", faces.size=" << faces.size() << endl; // haar time consume : 0.753811, faces.size=1
for (size_t t = 0; t < faces.size(); t++) {
rectangle(src_haar, faces[t], Scalar(255, 0, 0), 2, 8, 0);
}
imshow("src_haar", src_haar);
st = getTickCount();
// haar是浮点数计算,lbp是整型,所以lbp比haar识别快(可快一倍),建议优先使用lbp检测
lbp_cascader.detectMultiScale(gray, faces, 1.1, 3, 0, Size(30, 30));
et = (getTickCount() - st) / getTickFrequency();
cout << "lbp time consume : " << et << ", faces.size=" << faces.size() << endl; // lbp time consume : 0.547446, faces.size = 1
for (size_t t = 0; t < faces.size(); t++) {
rectangle(src_lbp, faces[t], Scalar(255, 0, 0), 2, 8, 0);
}
imshow("src_lbp", src_lbp);
waitKey(0);
}
效果图
代码: 视频读取
#include "../common/common.hpp"
static CascadeClassifier haar_cascader;
static CascadeClassifier lbp_cascader;
static String haarfile = "project/workspace_vs/OpenCV310Sources_contrib/install/etc/haarcascades/haarcascade_frontalface_alt.xml"; // haar特征训练数据
static String lbpfile = "project/workspace_vs/OpenCV310Sources_contrib/install/etc/lbpcascades/lbpcascade_frontalface.xml"; // lbp特征训练数据
void main(int argc, char** argv)
{
haar_cascader.load(getCVImagesPath(haarfile));
lbp_cascader.load(getCVImagesPath(lbpfile));
VideoCapture capture;
Mat frame;
Mat gray;
vector<Rect> faces;
capture.open(getCVImagesPath("images/sample.mp4")); // 打开本地视频文件
double st, et;
while (capture.read(frame)) // 读取视频中每一帧
{
cvtColor(frame, gray, COLOR_BGR2GRAY);
st = getTickCount();
equalizeHist(gray, gray);
// 不管是haar还是lbp检测,都是第一次检测很慢,后续的检测时间会快一个数量级。 lbp检测比haar检测快将近一倍
lbp_cascader.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30, 30));
et = (getTickCount() - st) / getTickFrequency();
cout << "lbp time consume : " << et << ", faces.size=" << faces.size() << endl;
for (size_t t = 0; t < faces.size(); t++)
{
rectangle(frame, faces[t], Scalar(255, 0, 0), 2, 8, 0);
}
imshow("video detect", frame);
if (waitKey(40) == 27) break; // ESC,视频是 25frame/s
}
capture.release(); // 释放资源
waitKey(0);
}
效果图