基本理论
使用基于Haar特征的级联分类器进行对象检测是Paul Viola和Michael Jones在2001年的论文"使用简单特征的增强级联的快速对象检测"中提出的一种有效的对象检测方法。这是一种基于机器学习的方法,其中级联函数是从许多正负图像中训练的。然后,它用于检测其他图像中的对象。
C++代码
使用 cv::CascadeClassifier 类来检测视频流中的对象。具体而言,我们将使用以下函数:
cv::CascadeClassifier::load 以加载.xml分类器文件。它可以是 Haar 或 LBP 分类器
cv::CascadeClassifier::detMultiScale 来执行检测。
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
#include<opencv2/objdetect.hpp>//对象检测头文件
void main()
{
VideoCapture cap(0);
Mat img;
time_t start, end;
char str[20];
while(true)
{
time(&start);
cap.read(img);
CascadeClassifier faceCascade;/*用于对象检测的级联分类器类*/
faceCascade.load("D:\\QT\\Opencv\\Resources\\haarcascade_frontalface_default.xml");//从文件加载分类器(已经训练好的模型)
if(faceCascade.empty()) cout<<"XML file is empty"<<endl;
vector<Rect> faces;// save Rect vector
faceCascade.detectMultiScale(img, faces, 1.1, 10);//在输入图像中检测不同大小的对象。检测到的对象将以矩形列表的形式返回。
for(int i=0; i<faces.size(); i++)
{
rectangle(img, faces[i].tl(), faces[i].br(), Scalar(255,255,0), 3);//绘制矩形
}
time(&end);
double seconds = difftime (end, start);
auto fps = 1 / seconds;
string FPSstring("FPS:");
sprintf_s(str, "%.2f", fps);
FPSstring += str;
putText(img, FPSstring, Point(5,20),FONT_HERSHEY_SIMPLEX,0.5,Scalar(255,0,0));
imshow("Image", img);
waitKey(1);//增加延时
}