若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/106057214
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...(点击传送门)
上一篇:《OpenCV开发笔记(五十三):红胖子8分钟带你深入了解模板匹配识别(图文并茂+浅显易懂+程序源码)》
下一篇:《OpenCV开发笔记(五十五):红胖子8分钟带你深入了解Haar、LBP特征以及级联分类器识别过程(图文并茂+浅显易懂+程序源码)》
红胖子来也!!!
上一篇使用了模板匹配去识别人脸,本篇章使用OpenCV提供的级联分类器进行人脸识别。
人脸识别技术有两大类:
使用人脸组合的几何特征的方式识别人脸,人脸的几何特征:眼睛、眉毛、鼻子、脸颊、额头、嘴巴、下巴等等;
使用模式识别的方法实现特性人脸的训练,在进行相似度判断,如神经网络等分类方法。
Haar级联分类器就是基于Haar特征的级联分类器,涉及到两个概念:一个是Haar特征,一个是级联分类器。
本篇章Demo是基于Haar特征的,使用了openCV自带的Haar分类器初始化文件。
(关于具体的将会在后续的文章中解说)
级联分类器类的检测框架简而言之就是一个多尺度缩放+滑动窗口遍历搜索的框架。
级联分类器试讲若干个分类器进行连接,从而构成一种多项式的强分类方法,单个分类器可以由若干个弱分类器加权组成。
(关于具体的将会在后续的文章中解说)
OpenCV提供了CascadeClassifier用于检测物体的级联分类器,其使用过程是先需要读取加载一个文件读取分类器。
bool CascadeClassifier::load( const String& filename );
然后使用人脸检测函数,进行人脸检测。
(注意:有三个重载函数)
void CascadeClassifier::detectMultiScale( InputArray image,
std::vector& objects,
double scaleFactor = 1.1,
int minNeighbors = 3,
int flags = 0,
Size minSize = Size(),
Size maxSize = Size());
OpenCV操作视频,请查看博文:《OpenCV开发笔记(四):OpenCV图片和视频数据的读取与存储》
OpenCV绘制图形,请查看博文:《OpenCV开发笔记(七):OpenCV基础图形绘制》
void OpenCVManager::testCascadeClassifier()
{
cv::String windowName = _windowTitle.toStdString();
cvui::init(windowName);
cv::Mat windowMat = cv::Mat(cv::Size(520, 400),
CV_8UC3);
cv::VideoCapture videoCapture;
videoCapture.open("E:/testFile/4.avi");
// videoCapture.open("E:/testFile/4.mp4");
cv::Mat mat;
cv::Mat dstMat;
int currentIndex = 0;
// 级联人脸分类器
cv::CascadeClassifier cascadeClassifier;
cascadeClassifier.load("E:/qtProject/openCVDemo/openCVDemo/modules/openCVManager/data/haarcascades/haarcascade_frontalface_alt.xml");
while(true)
{
// 刷新全图黑色
windowMat = cv::Scalar(0, 0, 0);
currentIndex = videoCapture.get(cv::CAP_PROP_POS_FRAMES);
videoCapture >> mat;
if(!mat.empty())
{
dstMat = mat.clone();;
// 灰度变换
cv::Mat grayMat;
cv::cvtColor(dstMat, grayMat, CV_BGR2GRAY);
// 直方图均衡化
cv::Mat histMat;
cv::equalizeHist(grayMat, histMat);
// 多尺度人脸检测
std::vector faces;
cascadeClassifier.detectMultiScale(histMat,
faces,
1.1,
3,
0 | cv::CASCADE_SCALE_IMAGE,
cv::Size(10, 10));
qDebug() << __FILE__ << __LINE__ << "faces number:" << faces.size();
// 人脸检测结果判定
for(int index = 0; index < faces.size(); index++)
{
// 检测到人脸
cv::rectangle(dstMat, faces.at(index), cv::Scalar(0, 0, 255));
}
// 视频复制
mat = windowMat(cv::Range(0, 0 + dstMat.rows),
cv::Range(0, 0 + dstMat.cols));
cv::addWeighted(mat, 0.0f, dstMat, 1.0f, 0.0f, mat);
}
// 更新
cvui::update();
// 显示
cv::imshow(windowName, windowMat);
// esc键退出
int key = cv::waitKey(0);
switch (key) {
case 97: // 'a' 往前一帧
currentIndex--;
if(currentIndex < 0)
{
currentIndex = 0;
}
videoCapture.set(cv::CAP_PROP_POS_FRAMES, currentIndex);
break;
case 115: // ‘s’ 往后一帧
break;
default:
break;
}
if(key == 27)
{
break;
}
}
}
对应版本号v1.49.0
上一篇:《OpenCV开发笔记(五十三):红胖子8分钟带你深入了解模板匹配识别(图文并茂+浅显易懂+程序源码)》
下一篇:《OpenCV开发笔记(五十五):红胖子8分钟带你深入了解Haar、LBP特征以及级联分类器识别过程(图文并茂+浅显易懂+程序源码)》
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/106057214