Cascade级联分类器是一种快速简单的分类方法,opencv2和opencv3中提供了完整的cascade分类器的训练和检测方法,本篇主要介绍下级联分类器的检测方法。
opencv中用于级联分类的类是cv::CascadeClassifier,下面以人脸识别为例,简单介绍下这个类的使用方法。
代码如下:
//定义级联分类器
cv::CascadeClassifier face_detector;
//加在分类器
face_detector.load("haarcascade_frontalface_default.xml");
//判断分类器是否加载成功
if (face_detector.empty())
{
std::cerr << "load detector failed!!!" << std::endl;
return;
}
//获取训练集的原始尺寸,作为分类器的最小尺寸,这样能得到最佳的检测效果(不是必须的)
cv::Size original_size = face_detector.getOriginalWindowSize();
cv::Mat image = cv::imread("image.png", cv::IMREAD_COLOR);
cv::Mat image_gray;
cv::cvtColor(image, image_gray, cv::COLOR_BGR2GRAY);
//用于保存检测到的目标窗口
std::vector<cv::Rect> faces;
//进行多尺度人脸检测
face_detector.detectMultiScale(image_gray, faces, 1.1, 3, 0 | cv::CASCADE_SCALE_IMAGE, original_size);
//将检测到的目标窗口逐个绘制到原图上
for (size_t i = 0; i < faces.size(); i++)
{
cv::rectangle(image, faces[i], cv::Scalar(0, 0, 255), 2, 8, 0);
}
cv::imshow("detect result", image);
cv::waitKey(0);
opencv3安装目录下有个etc文件夹,这个文件夹下有两个文件夹,分别保存了基于haar特征和lbp特征训练得到的多种目标检测的分类器的xml文件,其中就有人脸检测的分类器,可以拿过来直接用。当然我们也可以使用训练集,训练自己的分类器。这里我们就选择一个基于haar特征的人脸分类器来进行测试和说明。
cv::CascadeClassifier通过load()成员函数读取分类器,然后就可以使用detectMultiScale()成员函数进行多尺度的级联分类检测。detectMultiScale()的调用方法如下:
cv::CascadeClassifier::detectMultiScale(
const cv::Mat& image, // 输入待检测的图像(灰度)
vector<cv::Rect>& objects, // 输出的目标窗口
double scaleFactor = 1.1, // 尺度系数
int minNeighbors = 3, // 需要的邻域数
int flags = 0, // flag (旧风格的cascades)
cv::Size minSize = cv::Size(), // 最小检测窗口
cv::Size maxSize = cv::Size() // 最大检测窗口
);
检测结果:
2017.04.12