基于opencv3.0下的人脸识别和识别部分的高斯模糊处理

如题

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

1.录播放视频

2.人脸识别

3.部分高斯模糊

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

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

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

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

其中官方给出CvCapture的API为

实例化CvCapture对象的时候,需要调用cvCaptureFromCAM(int device)进行实例化。

博主的是单摄像头没有外接摄像头,根据API进行填写操作

 1 #include<opencv2\highgui\highgui.hpp>
 2 #include<opencv2\imgproc\imgproc.hpp>
 3 #include<opencv2\core\core.hpp>
 4
 5 int main(int argc, const char** argv)
 6 {
 7     CvCapture* capture;
 8     capture = cvCaptureFromCAM(0);
 9     IplImage* frame;
10     namedWindow("video", 1);
11     while (true)
12     {
13         frame = cvQueryFrame(capture);
14         cvShowImage("video",frame);
15         char c = cvWaitKey(0);
16         if (c == 27)break;//捕获Esc
17     }
18     destroyWindow("video");
19     cvReleaseCapture(&capture);
20     return 0;
21 }

通过简单的进行捕获摄像头的图像,结果如下:

并没有捕获到摄像头的所采集的图像。查阅的相关资料,有个方法将cvCaptureFromCAM()中填入-1。很遗憾是同样的效果。感兴趣的童鞋可以研究下,提出解决方案,共同促进学习。

所以这里采用VideoCapture进行采集视频

首先定义一个视频采集器,一个视频写入器;

VideoCapture capture;
VideoWriter writer;

初始化

 1 /******************************************************
 2 函数名称: MyClass
 3 函数功能: 初始化
 4 传入参数:
 5 返 回 值:
 6 建立时间: 2018-05-13
 7 修改时间:
 8 建 立 人:
 9 修 改 人:
10 其它说明:
11 ******************************************************/
12 MyClass::MyClass()
13 {
14     if (!cascade.load(cascadeName))
15     {
16         cerr << "ERROR: Could not load classifier cascade" << endl;
17         exit(1);
18     }
19     capture = 0;
20     string filepath = "test.avi";
21     //获得帧的宽高
22     int w = static_cast<int>(capture.get(CV_CAP_PROP_FRAME_WIDTH));
23     int h = static_cast<int>(capture.get(CV_CAP_PROP_FRAME_HEIGHT));
24     Size S(w, h);
25     //获得帧率
26     double r = capture.get(CV_CAP_PROP_FPS);
27     //打开视频文件,准备写入
28     writer.open(filepath, -1, r, S, true);
29     //打开失败
30     if (!capture.isOpened())
31     {
32         exit(1);
33     }
34 }

开始显示并录制:

 1 /******************************************************
 2 函数名称: play
 3 函数功能: 开始播放
 4 传入参数:
 5 返 回 值:
 6 建立时间: 2018-05-13
 7 修改时间:
 8 建 立 人:
 9 修 改 人:
10 其它说明:
11 ******************************************************/
12 void MyClass::play(){
13     Mat image;
14     namedWindow("直播页面按Esc退出", 1);
15     while (true)
16     {
17         capture >> image;
18         if (image.empty())break;
19         imshow("直播页面按Esc退出", image);
20         writer.write(image);
21         char c = waitKey(30);
22         if (c == 27)break;
23     }
24     cvDestroyWindow("直播页面按Esc退出");
25 }
26 /******************************************************

下面是播放录制好的视频,校验原来是否成功录制:

 1 /******************************************************
 2 函数名称: replay
 3 函数功能: 播放测试
 4 传入参数:
 5 返 回 值:
 6 建立时间: 2018-05-13
 7 修改时间:
 8 建 立 人:
 9 修 改 人:
10 其它说明:
11 ******************************************************/
12 void replay()
13 {
14     char* path = "test.avi";
15     IplImage* frame;
16     CvCapture* capture=cvCreateFileCapture(path);
17     namedWindow("播放界面按Esc退出", 1);
18     while (true)
19     {
20         frame = cvQueryFrame(capture);
21         cvShowImage("播放界面按Esc退出", frame);
22         char c = waitKey(33);
23         if (c == 27)break;
24     }
25
26 }

结果:

成功播放了^.^.

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"包拷到项目中去,开始人脸识别。

 1 /******************************************************
 2 函数名称: detectAndDraw
 3 函数功能: 在人脸上绘制圆圈
 4 传入参数:
 5 返 回 值:
 6 建立时间: 2018-05-13
 7 修改时间:
 8 建 立 人:
 9 修 改 人:
10 其它说明:
11 ******************************************************/
12 void MyClass::detectAndDraw(Mat& img,char* title)
13 {
14     Mat dog;
15     dog = imread("F:\\Pictures\\gdog.png",1);
16     Mat tempdog;
17     double alpha = 1; double beta = 1 - alpha;
18
19     double scale = 1;
20     vector<Rect> faces;
21     Mat gray,smallImg(cvRound(img.rows / scale), cvRound(img.cols / scale), CV_8UC1);;
22     cvtColor(img, gray, COLOR_BGR2GRAY);
23     resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR);
24     equalizeHist(smallImg, smallImg);
25     cascade.detectMultiScale( smallImg, faces,1.1,2,0|CASCADE_SCALE_IMAGE,Size(30,30));//匹配人脸
26     for (vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++){
27         Scalar color = colors[6];//红色
28         int radius;
29         Point center;
30         double aspect_ratio = (double)r->width / r->height;
31         if (0.75 < aspect_ratio && aspect_ratio < 1.3)
32         {
33             center.x = cvRound((r->x + r->width*0.5)*scale);
34             center.y = cvRound((r->x + r->height*0.5)*scale);
35             radius = cvRound((r->width + r->height)*0.25*scale);
36             circle(img, center, radius, color, 3, 8, 0);
37         }
38         else
39         {
40             rectangle(img, CvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),
41                 CvPoint(cvRound((r->x + r->width - 1)*scale), cvRound((r->y + r->height - 1)*scale)),
42                 color, 3, 8, 0);
43
44         }
45     }
46     writer.write(img);
47     cv::imshow(title,img);
48 }

然后在采集的方法(void play())中调用这个方法即可实现人脸识别。这里不展示结果。

3.部分高斯模糊

部分高斯模糊的关键是找到ROI(感兴趣区域)

其中在人脸识别的时候已经找出ROI了,所以只要对找到ROI进行高斯模糊就可以了

 1 /******************************************************
 2 函数名称: detectAndDraw
 3 函数功能: 绘制圆圈和高斯模糊
 4 传入参数:
 5 返 回 值:
 6 建立时间: 2018-05-13
 7 修改时间:
 8 建 立 人: 范泽华
 9 修 改 人:
10 其它说明:
11 ******************************************************/
12 void MyClass::detectAndDraw(Mat& img,char* title)
13 {
14     Mat dog;
15     dog = imread("F:\\Pictures\\gdog.png",1);
16     Mat tempdog;
17     double alpha = 1; double beta = 1 - alpha;
18
19     double scale = 1;
20     vector<Rect> faces;
21     Mat gray,smallImg(cvRound(img.rows / scale), cvRound(img.cols / scale), CV_8UC1);;
22     cvtColor(img, gray, COLOR_BGR2GRAY);
23     resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR);
24     equalizeHist(smallImg, smallImg);
25     cascade.detectMultiScale( smallImg, faces,1.1,2,0|CASCADE_SCALE_IMAGE,Size(30,30));//匹配人脸
26     for (vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++){
27         Scalar color = colors[6];//红色
28         int radius;
29         Point center;
30         double aspect_ratio = (double)r->width / r->height;
31         if (0.75 < aspect_ratio && aspect_ratio < 1.3)
32         {
33             center.x = cvRound((r->x + r->width*0.5)*scale);
34             center.y = cvRound((r->x + r->height*0.5)*scale);
35             radius = cvRound((r->width + r->height)*0.25*scale);
36             circle(img, center, radius, color, 3, 8, 0);
37             Mat *imageROI=&img(Rect(r->x, r->y, 2 * radius, 2 * radius));//感兴趣区域
38             Mat temp = img(Rect(r->x, r->y, 2 * radius, 2 * radius));
39             cv::GaussianBlur(temp, temp, Size(21, 21), 3, 3);
40             cv::GaussianBlur(temp, temp, Size(21, 21), 3, 3);
41         }
42         else
43         {
44             rectangle(img, CvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),
45                 CvPoint(cvRound((r->x + r->width - 1)*scale), cvRound((r->y + r->height - 1)*scale)),
46                 color, 3, 8, 0);
47
48         }
49     }
50     writer.write(img);
51     cv::imshow(title,img);
52 }

结果:

成功生成人脸识别视频文件。

如需要源码请转移至码云:https://gitee.com/cjqbaba/MediaTest/tree/Face_Find进行源码克隆下载

如有问题请留言评论。转载请注明出处,谢谢。

原文地址:https://www.cnblogs.com/cjqbaba/p/9033994.html

时间: 2024-07-29 05:04:31

基于opencv3.0下的人脸识别和识别部分的高斯模糊处理的相关文章

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

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

基于QT和OpenCV的人脸检測识别系统(1)

人脸识别分为两大步骤 1.人脸检測 这个是首要实现的.你得实现人脸显示的时候把人脸框出来,当然算法非常多,另一些人眼检測鼻子检測什么的 主要用的是这个 const char *faceCascadeFilename = "haarcascade_frontalface_alt.xml"; detect_and_draw(IplImageBuffer,storage,cascade); 这个函数就是检測人脸的并画框效果例如以下 watermark/2/text/aHR0cDovL2Jsb

基于OpenCv的人脸检测、识别系统学习制作笔记之三

1.在windows下编写人脸检测.识别系统.目前已完成:可利用摄像头提取图像,并将人脸检测出来,未进行识别. 2.在linux下进行编译在windows环境下已经能运行的代码. 为此进行了linux系统下OpenCv的安装. 在linux中安装OpenCv遇到了很多问题,已经解决,但是花费了不少时间.目前:可以在linux下编译OpenCv项目,但是运行生成的程序时出现问题.初步认定为采用了虚拟机而导致运行内存不足,程序直接崩溃,将继续解决这个问题. 花费较多时间安装OpenCv是有必要的,为

【OpenCV】opencv3.0中的SVM训练 mnist 手写字体识别

前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的ml包含了很多的ML框架接口,就试试了. 详细的OpenCV文档:http://docs.opencv.org/3.0-beta/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html mnist数据下载:http://yann.l

vs13 opencv3.0 人脸检测

背景:使用opencv3.0进行人脸识别的第一步:完成人脸的检测 环境:vs2013,opencv3.0 alpha版 代码:由/source/samples/cpp/facedetect.cpp下更改而来 #include "opencv2/objdetect.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/videoio.hpp" #include "opencv2/h

人工智能之基于face_recognition的人脸检测与识别

不久乘高铁出行,看见高铁火车站已经实现了"刷脸进站",而且效率很高,很感兴趣,今天抽时间研究一下,其实没那么复杂. 我基本上是基于https://github.com/ageitgey/face_recognition上的资料和源码做一些尝试和试验. 首先,需要配置我们的python环境,我悬着的python27(比较稳定),具体过程不多说了. 然后,需要安装这次的主角face_recognition库,这个的安装花了我不少时间,需要注意一下几点(按照本人的环境): 1,首先,安装vi

简述人脸特异性识别&amp;&amp;一个基于LBP和SVM的人脸识别小例子

原谅我用图片,MAC在Safari里给文章进行图文排版太麻烦啦~ 本文适合初入计算机视觉和模式识别方向的同学们观看~ 文章写得匆忙,加上博主所知甚少,有不妥和勘误请指出并多多包涵. 本文Demo的代码由HZK编写,特征点由月神和YK选择和训练. 转载请注明 copyleft by sciencefans, 2014 为了方便大家学习,附上高维LBP的核心代码 1 ################################################### 2 # 3 # 4 # NO

基于QT和OpenCV的人脸识别系统

1 系统方案设计 1.1 引言 人脸是一个常见而复杂的视觉模式,人脸所反映的视觉信息在人与人的交流和交往中有着重 要的作用和意义,对人脸进行处理和分析在视频监控.出入口控制.视频会议以及人机交互等领 域都有着广泛的应用前景,因此是模式识别和计算机视觉领域持续的研究热点. 本系统在 FriendlyARM Tiny6410 开发板基础上,利用 OpenCV 计算机视觉库和 QT 图形库,通 过普通的 USB 摄像头实现了自动人脸识别,准确率较高,方便易用. 1.2 系统总体架构 "人脸识别&quo

基于OpenCV读取摄像头进行人脸检测和人脸识别

前段时间使用OpenCV的库函数实现了人脸检测和人脸识别,笔者的实验环境为VS2010+OpenCV2.4.4,opencv的环境配置网上有很多,不再赘述.检测的代码网上很多,记不清楚从哪儿copy的了,识别的代码是从OpenCV官网上找到的:http://docs.opencv.org/trunk/modules/contrib/doc/facerec/facerec_api.html 需要注意的是,opencv的FaceRecogizer目前有三个类实现了它,特征脸和fisherface方法