OpenCV学习代码记录——人脸检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录。
代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest
效果

代码
我是直接使用OpenCV自带的分类器。如果有数据,可以自己训练得到。
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/imgproc.hpp>
#include <cstdio>
// g++ face.cpp -o face -std=c++11 -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_objdetect
// 文件在opencv的安装目录下有
static const char* cascade_name = "D:\\OpenCV\\share\\OpenCV\\haarcascades\\"
"haarcascade_frontalface_alt2.xml";
// http://wiki.opencv.org.cn/index.php/%E4%BA%BA%E8%84%B8%E6%A3%80%E6%B5%8B
void frameFaceDetection(cv::Mat& src, cv::CascadeClassifier& cascade,
const char* showWindowName);
int FaceDetection(int c,char**v)
{
//cv::Mat src,gray; // 源图像,灰度图像
cv::VideoCapture capture; // 视频捕获对象
cv::Mat frame; // 视频帧
cv::CascadeClassifier cascade; //级联分类器
/**
// 加载源图像
const char* picpath = "../Image/sisy.jpg";
if (c > 1) { picpath = v[1]; }
src = cv::imread(picpath);
if (src.empty()) {
puts("图片加载失败!!!");
return -1;
}
*/
// 打开视频文件
if (!capture.open("../Image/video.mov")) {
puts("打开视频文件失败!!!");
return -1;
}
// 加载人脸识别级联分类器文件
if (!cascade.load(cascade_name)){
puts("人脸识别级联分类器文件加载失败!!!");
return 0;
}
// 创建显示窗口
cv::namedWindow("src");
cv::Mat src_scale;
src_scale.create(cv::Size(480, 320), CV_8SC3);
// 循环取帧并显示
while (capture.read(frame)) {
// 进行缩放
cv::resize(frame, src_scale, src_scale.size());
// 检测并显示
frameFaceDetection(src_scale, cascade, "src");
// 等待按键事件
// 此处等待也为显示图像函数提供足够的时间完成显示
// 等待事件可以按照CPU速度进行调节
if (cv::waitKey(1) >= 0) {
break; // 按键就退出
}
}
//cv::waitKey();
cv::destroyAllWindows();
return 0;
}
void frameFaceDetection(cv::Mat& src,
cv::CascadeClassifier& cascade,
const char* showWindowName)
{
std::vector<cv::Rect> faces;
cv::Mat gray;
// 获取源图像的灰度图像
gray.create(src.size(), CV_8UC1);
cv::cvtColor(src, gray, CV_BGR2GRAY);
// 使灰度图象直方图均衡化
cv::equalizeHist(gray, gray);
// 获取初步检测结果
cascade.detectMultiScale(
gray/*源图像*/,
faces/*检测出的物体边缘(得到被检测物体的矩形框向量组)*/,
1.1/*每一个图像尺度中的尺度参数,默认值为1.1*/,
2/*每一个级联矩形应该保留的邻近个数*/,
CV_HAAR_SCALE_IMAGE,
cv::Size(30, 30)/*最小可能的对象的大小,小于的对象将被忽略*/);
// 将检测得到的结果,绘制到原图像上
for (auto face : faces) {
// 绘制红色矩形
cv::rectangle(src, face, cv::Scalar(0, 0, 255), 3);
}
// 显示图像
cv::imshow(showWindowName, src);
}
OpenCV学习代码记录——人脸检测的更多相关文章
- OpenCV 学习笔记 05 人脸检测和识别
本节将介绍 Haar 级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配. 本章将考虑如何将多个 Haar 级联分类器构成一个层次结构,即一个分类器能识别整体区域(如人脸) ...
- OpenCV学习代码记录——轮廓(contour)检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- OpenCV学习代码记录——Hough线段检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- OpenCV学习代码记录—— Snake轮廓
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- OpenCV 学习笔记 05 人脸检测和识别 AttributeError: module 'cv2' has no attribute 'face'
1 环境设置: win10 python 3.6.8 opencv 4.0.1 2 尝试的方法 在学习人脸识别中,遇到了没有 cv2 中没有 face 属性.在网上找了几个方法,均没有成功解决掉该问题 ...
- OpenCV学习代码记录——canny边缘检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- OpenCV 学习笔记 07 目标检测与识别
目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...
- 30行Python代码实现人脸检测
参考OpenCV自带的例子,30行Python代码实现人脸检测,不得不说,Python这个语言的优势太明显了,几乎把所有复杂的细节都屏蔽了,虽然效率较差,不过在调用OpenCV的模块时,因为模块都是C ...
- cvSmooth函数 和 OpenCV自带的人脸检测
记录cvSmooth函数的用法和 OpenCV自带的人脸检测. (1)cvSmooth函数 void cvSmooth( const CvArr* src, CvArr* dst,int smooth ...
随机推荐
- 2018-2019 2 20165203 《网络对抗技术》 Exp4 恶意代码分析
2018-2019 2 20165203 <网络对抗技术> Exp4 恶意代码分析 实验要求 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析Exp2或Exp ...
- Windows任务计划 & Linux crontab定时自动任务
如何在windows服务器上面创建定时任务https://blog.csdn.net/shiyong1949/article/details/52779359 Windows 10系统下如何设置计划任 ...
- 【AtCoder】AGC019
A - Ice Tea Store 算一下每种零售最少的钱就行,然后优先买2,零头买1 #include <bits/stdc++.h> #define fi first #define ...
- python全栈开发day15-递归函数、二分查找
1.昨日内容回顾 主要内置函数: map(func,iter1):返回迭代器 filter(func,iter1):返回迭代器 sorted(iter,key=,reverse=):返回列表 reve ...
- Smali语法
看阿里巴巴的<深入探索Android热修复>,里面的代码看不懂,一查才知道是Smali语法,百度了语法,转载如下 转载自smali 语言语法 1.smali apk文件通过apktool反 ...
- hdu-1754 I Hate It【线段树】(求区间最大值)
<题目链接> I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- Angular 个人深究(四)【生命周期钩子】
Angular 个人深究(四)[生命周期钩子] 定义: 每个组件都有一个被 Angular 管理的生命周期. Angular 创建它,渲染它,创建并渲染它的子组件,在它被绑定的属性发生变化时检查它,并 ...
- 一次webapck4 配置文件无效的解决历程
前言 升级webpack4,一定要去看文档,特别是更新说明,不要自持用过原本webpack就自己开始折腾.折腾到后面,可能就默默流下眼泪了. webpack4的变化 webpack-cli抽离 web ...
- 算法进阶面试题05——树形dp解决步骤、返回最大搜索二叉子树的大小、二叉树最远两节点的距离、晚会最大活跃度、手撕缓存结构LRU
接着第四课的内容,加入部分第五课的内容,主要介绍树形dp和LRU 第一题: 给定一棵二叉树的头节点head,请返回最大搜索二叉子树的大小 二叉树的套路 统一处理逻辑:假设以每个节点为头的这棵树,他的最 ...
- String、StringBuffer和StringBulder
String:不可改变的Unicode字符序列. 池化思想,把需要共享的数据放在池中,用一个存储区域来存放一些公用资源以减少存储空间的开销. 在String类中,以字面值创建时,会到Java方法空间的 ...