如题

这里将任务分解为三大部分:

1.录播放视频

2.人脸检测

3.部分高斯模糊

其中重点放在人脸检测和部分高斯模糊上

1.录播放视频(以opencv中的VideoCapture类进行实现)

首先罗列下操作环境:win10+vs2013+opencv3.0+单摄像头

opencv中提供了VideoCaptureCvCapture对视频进行操作

其中官方给出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下的人脸检测和检测部分的高斯模糊处理的更多相关文章

  1. 基于opencv3.0下的运动车辆识别

    在opencv的初等应用上,对运动物体的识别主要有帧差或背景差两种方式. 帧差法主要的原理是当前帧与前一帧作差取绝对值: 背景差主要的原理是当前帧与背景帧作差取绝对值: 在识别运动车辆上主要需要以下9 ...

  2. [C#][Windows]]基于ArcFace2.0+红外双目摄像头的活体检测

    废话不多说 直接上图 这个是demo中用到的双目摄像头,一个是红外的,一个是正常的rgb摄像头两个usb接口,在电脑上呈现两路摄像头通道程序检测RGB输出图像,当检测到有人脸时,用RGB人脸的位置到红 ...

  3. [Windows][C#][.NET][WPF]基于ArcFace2.0+红外双目摄像头的活体检测

    废话不多说 直接上图这个是demo中用到的双目摄像头,一个是红外的,一个是正常的rgb摄像头两个usb接口,在电脑上呈现两路摄像头通道程序检测RGB输出图像,当检测到有人脸时,用RGB人脸的位置到红外 ...

  4. 基于opencv3.0和下的条形码与二维码识别

    其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2 ...

  5. yolov2在CUDA8.0+cudnn8.0下安装、训练、检测经历

    这次用yolov2做检测时遇到个大坑,折腾了我好几天,特以此文记录之. 一.安装cuda+cudnn 它们的版本必须要匹配,否则训练后检测不出目标! 1.下载cuda8.0.61_375.26_lin ...

  6. 使用dlib基于CNN(卷积神经网络)的人脸检测器来检测人脸

    基于机器学习CNN方法来检测人脸比之前介绍的效率要慢很多 需要先下载一个训练好的模型数据: 地址点击下载 // dlib_cnn_facedetect.cpp: 定义控制台应用程序的入口点. // # ...

  7. 在opencv3中进行图片人脸检测

    在opencv中,人脸检测用的是harr或LBP特征,分类算法用的是adaboost算法.这种算法需要提前训练大量的图片,非常耗时,因此opencv已经训练好了,把训练结果存放在一些xml文件里面.在 ...

  8. tensorflow下基于DNN实现实时分辨人脸微表情

    参加学校的国创比赛的时候,我们小组的项目有一部分内容需要用到利用摄像头实现实时检测人脸的表情,因为最近都在看深度学习方面的相关知识,所以就自己动手实现了一下这个小Demo.参考网上的资料,发现大部分是 ...

  9. 关于运行“基于极限学习机ELM的人脸识别程序”代码犯下的一些错误

    代码来源 基于极限学习机ELM的人脸识别程序 感谢文章主的分享 我的环境是 win10 anaconda Command line client (version 1.6.5)(conda 4.3.3 ...

随机推荐

  1. ajax异步请求该嵌套还是并列?

    因为要查询两个数据库表才能确定我所需要的数据范围,所以前台js得发两次ajax请求.问题就是,这两个请求是嵌套着写:{发,接{发,接}}:还是并列着写:{发,接},{发,接} 好? 答案:如果2次aj ...

  2. Sliding Window Median LT480

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  3. system v 共享内存

    #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> ...

  4. Django 自定义模板标签TemplateTags

    创建自定义的模板标签(template tags) Django提供了以下帮助函数(functions)来允许你以一种简单的方式创建自己的模板标签(template tags): simple_tag ...

  5. OPNET仿真软件资料合集

    1. OPEN中国代理商业 http://www.credit-top.com/page/Default.asp?pageID=105

  6. 20155312张竞予 20170510实践一:在IDEA中以TDD的方式对String类和Arrays类进行学习

    实践题目 在IDEA中以TDD的方式对String类和Arrays类进行学习 测试相关方法的正常,错误和边界情况 String类 charAt split Arrays类 sort binarySea ...

  7. delphi 中的win32 以外到平台的字符串处理一定慢吗?(转载)

    原始连接:http://rvelthuis.blogspot.tw/2018/01/strings-on-other-platforms-than-32-bit.html Strings too sl ...

  8. 41.App 框架的搭建思路以及代码的规范

    本链接  引用别人文章https://www.jianshu.com/p/d553096914ff

  9. zend studio导入外部项目乱码怎么解决

    在zendstudio ide中,导入一个工程后,发现工程里面很多的文件都打上了红色的叉叉,打开这些文件一看,发现只要是有汉字存在的文件,都出现了乱码.按住alt+enter发现,该文件的编码默认为g ...

  10. windows下mongodb安装与使用图文教程(整理)

    一.首先安装mongodb 1.下载地址:http://www.mongodb.org/downloads 2.解压缩到自己想要安装的目录,比如d:\mongodb 3.创建文件夹d:\mongodb ...