如题

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

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. ApplicationContext(七)Message 源

    ApplicationContext(七)Message 源 本节则是初始化消息资源池,对国际化的支持.暂时先略过. 每天用心记录一点点.内容也许不重要,但习惯很重要!

  2. 解决linux ubuntu不能识别华为手机的问题--升级内核

    敝人手中有一个华为mate8,但是debian, ubuntu及一系列衍生版均不能识别.只能识别出一个华为手机助手,但是无法使用华为的内置存贮. 在fedora上是可以完美使用的. 归根到底的原因,是 ...

  3. java基本知识归集

    类中可以有几种东西:属性,方法,构造器,初始化块 new创建对象时, 1.类属性和类初始化块分配空间. 2.执行默认初始化 如有父类,先为父类执行父类自己的1和2步骤,再执行上面的1和2. 一个类执行 ...

  4. 使用vmware安装ubuntu不能上网

    桌面版的话,进入桌面后还可以配置,服务版,我是在安装过程中提示的网络配置时候按照下面的方法手动配置的 安装虚拟机时候要安装网络服务,有的虚拟机在安装过程中可能已经安装好了,主机保持VMware NAT ...

  5. JS closure

    闭包的概念 闭包,不同于一般的函数,它允许一个函数在立即词法作用域外调用时,仍可访问非本地变量. --维基百科 闭包就是能够读取其他函数内部变量的函数. --阮一峰 由于在Javascript语言中, ...

  6. Python内置logging模块

    最近调试Python代码比较多,发现logging模块很好用. 我的用法如下: import logging logging.basicConfig(level=logging.INFO, forma ...

  7. springMVC学习 四 请求的中文乱码解决

    在使用SpringMVC时,同样有前端向后端发送请求,请求参数中有中文,需要解决中文乱码问题,在Spring中也是向java web中一样,通过一个过滤器来解决中文乱码. 这个过滤器在spring-w ...

  8. 别人的Linux私房菜(2)Linux简介

    同一操作系统无法在不同硬件平台上运行.架构. Bell实验室和麻省理工学院MIT和通用电气公司GE发起了Multics计划,分时兼容系统,300以上多终端连接主机. Unics 由Multics中的人 ...

  9. kbmmw 中JSON 操作入门

    现在各种系统中JSON 用的越来越多.delphi 也自身支持JSON 处理. 今天简要说一下kbmmw 内部如何使用和操作JSON. kbmmw 中json的操作是以TkbmMWJSONStream ...

  10. JavaScript基础数据类型

    一.数值 1.JavaScript不区分整型和浮点型,就只有一种数字类型 2.还有一种NaN,表示不是一个数字(Not a Number) eg: parseInt("ABC")  ...