基于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 ...
随机推荐
- spring Springmvc mybatis maven整合
一.准备工作 1. 首先创建一个表: CREATE TABLE `t_user` ( `USER_ID` int(11) NOT NULL AUTO_INCREMENT, `USER_NAME` ch ...
- 9款原型设计工具与Sketch的强强组合,轻松构建交互原型!
原型设计的发展历史经历了纸上原型.静态线框设计.到现在的可交互式原型.作为设计过程中最初始的阶段,设计师们对原型设计的要求也越来越高.因此,如今的原型设计工具格局也发生了很大的变化. Sketch对于 ...
- C#动态显示时间
private void timer1_Tick(object sender, EventArgs e) { DateTime dt = DateTime.Now; label1.Text = dt. ...
- Go环境下,编译运行etcd与goreman集群管理(1)
Go环境下编译运行etcd与goreman管理 近几年了Go在比特币.区块链.云服务等相关重要领域贡献突出,作为IT行业的传承“活到老.学到光头”,保持学习心态. 周末放假,补充一二 主题:在Go环境 ...
- spring学习 十八 spring的声明事物
1.编程式事务: 1.1 由程序员编程事务控制代码.commit与rollback都需要程序员决定在哪里调用,例如jdbc中conn.setAutoCimmit(false),conn.commit( ...
- spring学习 十一 AspectJ-based的通知入门 不带参数的通知
AspectJ-Based方式的AOP,通知类不需要实现任何接口,且前置通知,后置通知,环绕通知,异常通知都可以写在一个类中,下面先实现一个简单的,不带参数的通知. 第一步定义通知类,通知类中的通知( ...
- Selenium+python入门
在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供 ActionChains 类提供了鼠标操作的常用方法: perform(): 执行所有 ActionCh ...
- docker使用自定义镜像zabbix服务
一.关闭firewall,永久关闭,使用iptables防火墙 systemctl stop firewalld.service #停止firewall systemctl disable firew ...
- Django的开始
一 浏览器相关知识 http:只有依赖一回,属于短链接,不会报错客户端的信息. 浏览器相当于一个客户端,客户端的链接 服务端:socket服务端,起服务监听客户端的请求. import socket ...
- java运行报错:nested exception is java.lang.NoSuchFieldError: INSTANCE,但使用@Test测试是好的
解决方法: 原因是,在tomcat里,同名不同版本的jar包,默认加载版本低的.我项目里有两个httpclient jar包.一个4.2.5 另一个是4.5.所以加载了4.2.5的,而我要用的是4. ...