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 ...
随机推荐
- HDU1711 Number Sequence(KMP模板题)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 解决git仓库从http转为ssh所要处理的问题
https://www.cnblogs.com/lusecond/p/7607198.html 为了方便,一般我们克隆仓库的时候会选择http或者https协议 git clone https://g ...
- [颜色知识] 潘通色卡、CMYK、RGB、 ARGB...
潘通色卡C结尾的色号都是RGB色系的,而CMYK是印刷系的,两者不能通用的,所以,不能完全对等进行转换 Pantone Colors [色卡]PANTONE潘通色卡C面颜色http://blog.si ...
- python的selenium
from selenium import webdriverChromeDriver="C:\Program Files (x86)\Google\Chrome\Application\ch ...
- C. 【UNR #2】黎明前的巧克力
题解: 不会FWT,只能水40分了 首先,要观察出的性质就是: 选出的集合要满足所有数亦或等于0,而在其中任选子集都可以满足条件,答案就等于sigma(2^size(s)) 这样dp一波显然就可以O( ...
- BZOJ1293 [SCOI2009]生日礼物 离散化
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1293 题意概括 彩珠有N个,分为K种.每一个彩珠有一个对应的坐标.坐标上可以没有彩珠,多个彩珠也可 ...
- 利用IntelliJ IDEA 创建第一个项目
1.创建项目 打开后点击第一个按钮
- Python 中常见错误总结
IndentationError: unexpected indent Python 中强制缩进,, IndentationError: unexpected indent 缩进错误 这类错误非常常见 ...
- JavaScript开发区块链只需200行代码
用JavaScript开发实现一个简单区块链.通过这一开发过程,你将理解区块链技术是什么:区块链就是一个分布式数据库,存储结构是一个不断增长的链表,链表中包含着许多有序的记录. 然而,在通常情况下,当 ...
- 爬虫之Resquests模块的使用(二)
Requests Requests模块 Requests模块是一个用于网络访问的模块,其实类似的模块有很多,比如urllib,urllib2,httplib,httplib2,他们基本都提供相似的功能 ...