OpenCV-C++-级联分类器训练与使用(1、人脸检测)

OpenCv中已经有训练好的人脸数据集,所以我们直接就可以拿过来进行检测。还有一些其余的训练好的数据:
在这里插入图片描述
具体路径:D:\OpenCv-3.4.1\opencv\build\etc\haarcascades

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

using namespace cv;
using namespace std;

//读进来训练的人脸检测文件
String fileName = "D:/OpenCv-3.4.1/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml";
CascadeClassifier casca_classifier;

/*---------图片人脸检测------------*/
int main(int argc, char ** argv)
{
	if (!casca_classifier.load(fileName))
	{
		cout << "人脸训练数据未找到!" << endl;
		return -1;
	}
	Mat src = imread("D:/test/girl.png");
	Mat gray_src;
	if (src.empty())
	{
		cout << "待检测图片未找到!" << endl;
		return -1;

	}
	cvtColor(src, gray_src, CV_BGR2GRAY);
	equalizeHist(gray_src, gray_src);//直方图均衡化

	vector<Rect> rect;
	//分类器在不同的人脸尺度空间上计算并将结果返回到rect矩形数组中
	casca_classifier.detectMultiScale(gray_src, rect, 1.1, 3, 0, Size(25, 25));

	for (size_t t = 0; t < rect.size(); t++)
	{
		rectangle(src, rect[static_cast<int>(t)], Scalar(0, 0, 255), 2, 8, 0);
	}
	imshow("face detect result", src);

	waitKey(0);
	return 0;
}

运行结果:
在这里插入图片描述

换一张图片:
在这里插入图片描述
可以看到,效果还是不错的,至少全部检测出来了。

我们也可以检测人的眼部位置,OpenCv中也有训练好的眼部数据集,只不过精度不是很高,现在我们在原来的代码上增加几条代码,源代码如下:

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

using namespace cv;
using namespace std;

//读进来训练的人脸检测文件
String facefileName = "D:/OpenCv-3.4.1/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml";
//读进来训练的眼部检测文件
String eyefileName = "D:/OpenCv-3.4.1/opencv/build/etc/haarcascades/haarcascade_eye.xml";
CascadeClassifier face_classifier,eye_classifier;

/*---------图片人脸检测------------*/
int main(int argc, char ** argv)
{
	if (!face_classifier.load(facefileName))
	{
		cout << "人脸训练数据未找到!" << endl;
		return -1;
	}
	if (!eye_classifier.load(eyefileName))
	{
		cout << "眼部训练数据未找到!" << endl;
		return -1;
	}
	Mat src = imread("D:/test/girl.png");
	Mat gray_src;
	if (src.empty())
	{
		cout << "待检测图片未找到!" << endl;
		return -1;

	}
	cvtColor(src, gray_src, CV_BGR2GRAY);
	equalizeHist(gray_src, gray_src);//直方图均衡化

	vector<Rect> rect;
	//分类器在不同的人脸尺度空间上计算并将结果返回到rect矩形数组中
	face_classifier.detectMultiScale(gray_src, rect, 1.1, 3, 0, Size(20, 20));
	vector<Rect>eyes;
	for (size_t t = 0; t < rect.size(); t++)
	{   //分类器在不同的眼部尺度空间上计算并将结果返回到rect矩形数组中
		eye_classifier.detectMultiScale(gray_src, eyes, 1.1, 3, 0, Size(15, 15));
		for (size_t i = 0; i < eyes.size(); i++)
		{
			rectangle(src, eyes[static_cast<int>(i)], Scalar(0, 255, 0), 2, 8, 0);
		}
		rectangle(src, rect[static_cast<int>(t)], Scalar(0, 0, 255), 2, 8, 0);
	}
	imshow("face detect result", src);

	waitKey(0);
	return 0;
}

运行结果:
在这里插入图片描述
但是,对于一张很多人的图片来说,要检测眼部位置确实不容易,比如:
在这里插入图片描述
这样一张比较模糊且眼部遮挡的图就无法全部检测到。

OpenCV是一个用于计算机视觉和机器学习的开源库,其中包含了许多功能强大的算法和工具。级联分类器是其中的一个重要功能,它可以用于目标检测和识别。 在训练级联分类器时,我们需要准备正样本。正样本是包含我们所关注目标的图像,比如人脸、车辆、文字等等。为了训练级联分类器,我们需要大量的正样本图像,这样才能让分类器具备更好的泛化能力。 训练级联分类器的过程可以分为以下几个步骤: 1. 收集正样本图像:我们可以通过各种方式来收集正样本图像,比如在网上下载、自己标注、从已有的数据集中提取等等。收集的正样本图像应该尽可能多样化,包含不同的姿势、光照条件、背景等等,以提高分类器的鲁棒性。 2. 创建样本描述文件:在训练级联分类器时,我们需要提供一个样本描述文件,用于描述每个样本图像的位置和标签。这个描述文件可以是一个XML文件,其中包含了每个样本图像的文件路径、位置和标签信息。 3. 训练级联分类器:在训练过程中,我们需要提供正样本图像和对应的样本描述文件,以及一些训练参数。通过迭代的方式,级联分类器会学习到目标的特征,并不断优化自身的分类能力。训练的过程通常需要较长的时间,特别是当样本数量较多时。 4. 评估和调优:在训练完成后,我们需要对训练得到的级联分类器进行评估。可以使用一部分已经标注好的测试图像来评估分类器的性能,计算准确率、召回率等指标。如果分类器的性能不理想,我们可以调整训练参数,或者增加更多的正样本进行训练,以提高分类器的性能。 通过以上步骤,我们可以利用OpenCV训练级联分类器,用于目标检测和识别任务。随着训练的迭代次数增加,分类器会逐渐提高自身的准确性和鲁棒性,从而更好地适应各种实际场景中的目标检测需求。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值