基于opencv3.0下的人脸检测和检测部分的高斯模糊处理
如题
这里将任务分解为三大部分:
1.录播放视频
2.人脸检测
3.部分高斯模糊
其中重点放在人脸检测和部分高斯模糊上
1.录播放视频(以opencv中的VideoCapture类进行实现)
首先罗列下操作环境:win10+vs2013+opencv3.0+单摄像头
opencv中提供了VideoCapture和CvCapture对视频进行操作
其中官方给出CvCapture的API为

实例化CvCapture对象的时候,需要调用cvCaptureFromCAM(int device)进行实例化。
博主的是单摄像头没有外接摄像头,根据API进行填写操作
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\core\core.hpp> int main(int argc, const char** argv)
{
CvCapture* capture;
capture = cvCaptureFromCAM();
IplImage* frame;
namedWindow("video", );
while (true)
{
frame = cvQueryFrame(capture);
cvShowImage("video",frame);
char c = cvWaitKey();
if (c == )break;//捕获Esc
}
destroyWindow("video");
cvReleaseCapture(&capture);
return ;
}
通过简单的进行捕获摄像头的图像,结果如下:

并没有捕获到摄像头的所采集的图像。查阅的相关资料,有个方法将cvCaptureFromCAM()中填入-1。很遗憾是同样的效果。感兴趣的童鞋可以研究下,提出解决方案,共同促进学习。
所以这里采用VideoCapture进行采集视频
首先定义一个视频采集器,一个视频写入器;
VideoCapture capture;
VideoWriter writer;
初始化
/******************************************************
函数名称: MyClass
函数功能: 初始化
传入参数:
返 回 值:
建立时间: 2018-05-13
修改时间:
建 立 人:
修 改 人:
其它说明:
******************************************************/
MyClass::MyClass()
{
if (!cascade.load(cascadeName))
{
cerr << "ERROR: Could not load classifier cascade" << endl;
exit();
}
capture = ;
string filepath = "test.avi";
//获得帧的宽高
int w = static_cast<int>(capture.get(CV_CAP_PROP_FRAME_WIDTH));
int h = static_cast<int>(capture.get(CV_CAP_PROP_FRAME_HEIGHT));
Size S(w, h);
//获得帧率
double r = capture.get(CV_CAP_PROP_FPS);
//打开视频文件,准备写入
writer.open(filepath, -, r, S, true);
//打开失败
if (!capture.isOpened())
{
exit();
}
}
开始显示并录制:
/******************************************************
函数名称: play
函数功能: 开始播放
传入参数:
返 回 值:
建立时间: 2018-05-13
修改时间:
建 立 人:
修 改 人:
其它说明:
******************************************************/
void MyClass::play(){
Mat image;
namedWindow("直播页面按Esc退出", );
while (true)
{
capture >> image;
if (image.empty())break;
imshow("直播页面按Esc退出", image);
writer.write(image);
char c = waitKey();
if (c == )break;
}
cvDestroyWindow("直播页面按Esc退出");
}
/******************************************************
下面是播放录制好的视频,校验原来是否成功录制:
/******************************************************
函数名称: replay
函数功能: 播放测试
传入参数:
返 回 值:
建立时间: 2018-05-13
修改时间:
建 立 人:
修 改 人:
其它说明:
******************************************************/
void replay()
{
char* path = "test.avi";
IplImage* frame;
CvCapture* capture=cvCreateFileCapture(path);
namedWindow("播放界面按Esc退出", );
while (true)
{
frame = cvQueryFrame(capture);
cvShowImage("播放界面按Esc退出", frame);
char c = waitKey();
if (c == )break;
} }
结果:

成功播放了^.^.
2.人脸识别(以opencv中CascadeClassifier类进行实现)
在opencv安装处"../opencv/sources/samples/cpp/facedetect.cpp",里面有示例代码。(示例代码有图片和视频的识别,但是这种方式识别精准度不是很好。)
其中示例代码的视频处理部分主要的思想就是将视频中的每一帧提出来,然后根据CascadeClassifier类和haarcascade_frontalface_alt.xml所生成的对象,将图片进行类比区分。
ps:haarcascade_frontalface_alt.xml存储在"../opencv/sources/data/haarcascades"中。
将"../opencv/sources/data"包拷到项目中去,开始人脸识别。
/******************************************************
函数名称: detectAndDraw
函数功能: 在人脸上绘制圆圈
传入参数:
返 回 值:
建立时间: 2018-05-13
修改时间:
建 立 人:
修 改 人:
其它说明:
******************************************************/
void MyClass::detectAndDraw(Mat& img,char* title)
{
Mat dog;
dog = imread("F:\\Pictures\\gdog.png",);
Mat tempdog;
double alpha = ; double beta = - alpha; double scale = ;
vector<Rect> faces;
Mat gray,smallImg(cvRound(img.rows / scale), cvRound(img.cols / scale), CV_8UC1);;
cvtColor(img, gray, COLOR_BGR2GRAY);
resize(gray, smallImg, smallImg.size(), , , INTER_LINEAR);
equalizeHist(smallImg, smallImg);
cascade.detectMultiScale( smallImg, faces,1.1,,|CASCADE_SCALE_IMAGE,Size(,));//匹配人脸
for (vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++){
Scalar color = colors[];//红色
int radius;
Point center;
double aspect_ratio = (double)r->width / r->height;
if (0.75 < aspect_ratio && aspect_ratio < 1.3)
{
center.x = cvRound((r->x + r->width*0.5)*scale);
center.y = cvRound((r->x + r->height*0.5)*scale);
radius = cvRound((r->width + r->height)*0.25*scale);
circle(img, center, radius, color, , , );
}
else
{
rectangle(img, CvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),
CvPoint(cvRound((r->x + r->width - )*scale), cvRound((r->y + r->height - )*scale)),
color, , , ); }
}
writer.write(img);
cv::imshow(title,img);
}
然后在采集的方法(void play())中调用这个方法即可实现人脸识别。这里不展示结果。
3.部分高斯模糊
部分高斯模糊的关键是找到ROI(感兴趣区域)
其中在人脸识别的时候已经找出ROI了,所以只要对找到ROI进行高斯模糊就可以了
/******************************************************
函数名称: detectAndDraw
函数功能: 绘制圆圈和高斯模糊
传入参数:
返 回 值:
建立时间: 2018-05-13
修改时间:
建 立 人:
修 改 人:
其它说明:
******************************************************/
void MyClass::detectAndDraw(Mat& img,char* title)
{
Mat dog;
dog = imread("F:\\Pictures\\gdog.png",);
Mat tempdog;
double alpha = ; double beta = - alpha; double scale = ;
vector<Rect> faces;
Mat gray,smallImg(cvRound(img.rows / scale), cvRound(img.cols / scale), CV_8UC1);;
cvtColor(img, gray, COLOR_BGR2GRAY);
resize(gray, smallImg, smallImg.size(), , , INTER_LINEAR);
equalizeHist(smallImg, smallImg);
cascade.detectMultiScale( smallImg, faces,1.1,,|CASCADE_SCALE_IMAGE,Size(,));//匹配人脸
for (vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++){
Scalar color = colors[];//红色
int radius;
Point center;
double aspect_ratio = (double)r->width / r->height;
if (0.75 < aspect_ratio && aspect_ratio < 1.3)
{
center.x = cvRound((r->x + r->width*0.5)*scale);
center.y = cvRound((r->x + r->height*0.5)*scale);
radius = cvRound((r->width + r->height)*0.25*scale);
circle(img, center, radius, color, , , );
Mat *imageROI=&img(Rect(r->x, r->y, * radius, * radius));//感兴趣区域
Mat temp = img(Rect(r->x, r->y, * radius, * radius));
cv::GaussianBlur(temp, temp, Size(, ), , );
cv::GaussianBlur(temp, temp, Size(, ), , );
}
else
{
rectangle(img, CvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),
CvPoint(cvRound((r->x + r->width - )*scale), cvRound((r->y + r->height - )*scale)),
color, , , ); }
}
writer.write(img);
cv::imshow(title,img);
}
结果:
:
成功生成人脸识别视频文件。
如需要源码请转移至码云:https://gitee.com/cjqbaba/MediaTest/tree/Face_Find进行源码克隆下载
如有问题请留言评论。转载请注明出处,谢谢。
基于opencv3.0下的人脸检测和检测部分的高斯模糊处理的更多相关文章
- 基于opencv3.0下的运动车辆识别
在opencv的初等应用上,对运动物体的识别主要有帧差或背景差两种方式. 帧差法主要的原理是当前帧与前一帧作差取绝对值: 背景差主要的原理是当前帧与背景帧作差取绝对值: 在识别运动车辆上主要需要以下9 ...
- [C#][Windows]]基于ArcFace2.0+红外双目摄像头的活体检测
废话不多说 直接上图 这个是demo中用到的双目摄像头,一个是红外的,一个是正常的rgb摄像头两个usb接口,在电脑上呈现两路摄像头通道程序检测RGB输出图像,当检测到有人脸时,用RGB人脸的位置到红 ...
- [Windows][C#][.NET][WPF]基于ArcFace2.0+红外双目摄像头的活体检测
废话不多说 直接上图这个是demo中用到的双目摄像头,一个是红外的,一个是正常的rgb摄像头两个usb接口,在电脑上呈现两路摄像头通道程序检测RGB输出图像,当检测到有人脸时,用RGB人脸的位置到红外 ...
- 基于opencv3.0和下的条形码与二维码识别
其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2 ...
- yolov2在CUDA8.0+cudnn8.0下安装、训练、检测经历
这次用yolov2做检测时遇到个大坑,折腾了我好几天,特以此文记录之. 一.安装cuda+cudnn 它们的版本必须要匹配,否则训练后检测不出目标! 1.下载cuda8.0.61_375.26_lin ...
- 使用dlib基于CNN(卷积神经网络)的人脸检测器来检测人脸
基于机器学习CNN方法来检测人脸比之前介绍的效率要慢很多 需要先下载一个训练好的模型数据: 地址点击下载 // dlib_cnn_facedetect.cpp: 定义控制台应用程序的入口点. // # ...
- 在opencv3中进行图片人脸检测
在opencv中,人脸检测用的是harr或LBP特征,分类算法用的是adaboost算法.这种算法需要提前训练大量的图片,非常耗时,因此opencv已经训练好了,把训练结果存放在一些xml文件里面.在 ...
- tensorflow下基于DNN实现实时分辨人脸微表情
参加学校的国创比赛的时候,我们小组的项目有一部分内容需要用到利用摄像头实现实时检测人脸的表情,因为最近都在看深度学习方面的相关知识,所以就自己动手实现了一下这个小Demo.参考网上的资料,发现大部分是 ...
- 关于运行“基于极限学习机ELM的人脸识别程序”代码犯下的一些错误
代码来源 基于极限学习机ELM的人脸识别程序 感谢文章主的分享 我的环境是 win10 anaconda Command line client (version 1.6.5)(conda 4.3.3 ...
随机推荐
- java 泛型: 通配符? 和 指定类型 T
1. T通常用于类后面和 方法修饰符(返回值前面)后面 ,所以在使用之前必须确定类型,即新建实例时要制定具体类型, 而?通配符通常用于变量 ,在使用时给定即可 ? extends A : 通配符上 ...
- python的数字图像处理学习(2)
图像的重定义大小,图像的缩扩,图像的旋转: from skimage import transform,data import matplotlib.pyplot as plt img = data. ...
- python学习 day6 (3月7日)
#__author : 'liuyang' #date : 2019/3/7 0007 a = ['a' , 'b' , 'c'] b = [] print(a is b ) # 空元组 可以 空列表 ...
- 利用Delphi-cross-socket 库提升kbmmw 跨平台开发
以前我写过了,通过httpsys 提升windows 下,delphi 多层应用.随着delphi 10.2 对linux 的支持,很多人也想在linux 下 发布kbmmw 服务器,但是官方仅通过i ...
- JavaScript函数和内置对象
一.函数 function f1(){ console.log("666"); } f1(); //调用函数 1.普通函数定义 function f1(a,b){ console. ...
- 特级教师总结的教育之33条(ZZ)
一位班主任发给家长的一则短信:“无论成绩好坏,请想想:每个孩子都是种子,只不过每个人的花期不同.有的花,一开始就灿烂绽放:有的花,需要漫长的等待.不要看着别人怒放了,自己的那棵还没有动静就着急,相信是 ...
- idea如何将项目以eclipse保存
会生成 提交到svn eclipse 导入 首先使用TortoiseSVN下载要导入的项目 导入 已经存在的maven 项目 clean install -DskipTests t ...
- spring+springMVC+mybatis+maven+mysql环境搭建(一)
环境搭建是最基础的,但是发现平时很多时候大家都是ctrl c+ctrl v,这样对于很多细节完全不清楚,来,一起深入了解下 一.准备工作 首先得准备好maven.mysql啥的,这些略... 并且my ...
- 百度图片http://img[0-9]\.imgtn.*?g此形式的链接图片下载方式
"""给出图片链接列表, 下载图片""" print(pic_urls) for pic_url in pic_urls: try: hos ...
- math.net 拟合
参考:http://blog.csdn.net/ztmsimon/article/details/50524392 在论坛中总看到有人在说Math.NET Iridium,查了一下,现在被整合到Mat ...