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 ...
随机推荐
- python全栈开发day31-操作系统介绍,异步、同步、阻塞、非阻塞,进程
一.网络编程内容回顾 1.arp协议 #交换机 #广播.单播 2.ip协议 3.tcp和udp协议 tcp:可靠的,面向连接的,字节流传输,长连接 三次握手:一方发送请求,另一方确认请求同时发送请求, ...
- java.lang.NumberFormatException: multiple points问题
一般这种问题主要是因为SimpleDateFormat在多线程环境下,是线程不安全的,所以如果你在多线程环境中共享了SimpleDateFormat的实例,比如你在类似日期类中定义了一个全局的Simp ...
- jquery 中remove()与detach()的区别
remove()与detach()方法都是从dom中删除所有的元素 两者的共同之处在于都不会把匹配的元素从jQuery对象中删除. 不同之处在于用remove()删除的元素,除了元素被保留,其他的在这 ...
- MQ确认机制之事务机制----confirm串行
一:介绍 1.说明原理 A:生产者将信道设置成confirm模式,一旦信道进到confirm模式,所有该信道上发布的消息都会被指派一个唯一的ID(从1开始). 一旦消息被投递到所有匹配的队列后,bro ...
- UVA 11426 (欧拉函数&&递推)
题意:给你一个数N,求N以内和N的最大公约数的和 解题思路: 一开始直接想暴力做,4000000的数据量肯定超时.之后学习了一些新的操作. 题目中所要我们求的是N内gcd之和,设s[n]=s[n-1] ...
- Vscode下Python的用户界面介绍
Visual Studio Code的核心是代码编辑器.与许多其他代码编辑器一样,VS Code在左侧采用通用用户界面和浏览器布局,显示您可以访问的所有文件和文件夹,右侧显示编辑器,显示已打开文件的内 ...
- hdu1698 Just a Hook 【区间修改】(模板题)
题目链接:https://vjudge.net/contest/182746#problem/E 题目大意: 一段线段由n条小线段组成,每次操作把一个区间的小线段变成金银铜之一(金的价值为3,银为2, ...
- loj#2574. 「TJOI2018」智力竞赛 (路径覆盖)
目录 题目链接 题解 代码 题目链接 loj#2574. 「TJOI2018」智力竞赛 题解 就是求可重路径覆盖之后最大化剩余点的最小权值 二分答案后就是一个可重复路径覆盖 处理出可达点做二分图匹配就 ...
- 潭州课堂25班:Ph201805201 爬虫高级 第五课 sclapy 框架 日志和 settings 配置 模拟登录(课堂笔记)
当要对一个页面进行多次请求时, 设 dont_filter = True 忽略去重 在 scrapy 框架中模拟登录 创建项目 创建运行文件 设请求头 # -*- coding: utf-8 ...
- [BZOJ4987]Tree
题目大意: 给定一棵\(n(n\le3000)\)个点的带边权的树,找出\(k\)个点\(A_{1\sim k}\)使得\(\sum_{1\le i<k} dis(A_i,A_i+1)\)最小. ...