OpenCV实践之路——人脸识别之一数据收集和预处理

本文由@星沉阁冰不语出品,转载请注明作者和出处。

文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/51386949

微博:http://weibo.com/xingchenbing 

前段时间对人脸检测和人脸标记进行了一些尝试:人脸检测(C++/Python)用Dlib库进行人脸检测和人脸标记。但是检测和识别是不同的,检测解决的问题是图片中有没有人脸;而识别解决的问题是,如果一张图片中有人脸,这是谁的脸。人脸检测可以利用opencv自带的分类器,但是人脸识别就需要自己收集数据,自己训练分类器了。opencv给出的有人脸识别的教程:Face
Recognition with OpenCV
。网上也可以找到中文版本的。

正所谓自己动手丰衣足食。站在巨人的肩膀上,参考前辈们的经验,终于能够识别出自己了。由于感觉内容较多,而且没有时间一次性写完,所以准备分阶段来写。每一篇博客是一个阶段的工作。初步设想分为数据收集和预处理、训练模型和人脸识别三个部分。今天先写第一部分。

一、背景数据集

本次用的数据集市opencv给出的教程里面的第一个数据集:The AT&T Facedatabase。又称ORL人脸数据库,40个人,每人10张照片。照片在不同时间、不同光照、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集。所有的图像都在一个黑暗均匀的背景下采集的,正面竖直人脸(有些有有轻微旋转)。

下载下来之后是这样的:

可以看到每个人一个文件夹,每个文件夹下是这个人的十张照片,但是不是我们熟悉的BMP或者是PNG或者是JPEG格式的,而是PGM格式的。windows7自带的照片查看器和画图软件都不能打开这种格式的图片。不过好在我昨天刚对imread()函数研究过:使用imread()函数读取图片的六种正确姿势。所以记得opencv文档里有这样的描述:

imread()还是很强大的,所以写个程序看看那这些人是什么样吧。

二、自己的人脸数据集

1.拍照程序

想要识别自己,单有别人的数据集还是不行的,还需要自己人脸的照片才行。这就需要我们收集自己的照片,然后和上面的那个数据集一起来训练模型。在拿着手机自拍的过程中我想到,问什么不写一个程序用电脑的摄像头自拍呢,随便还能研究下怎么用opencv实现拍照的功能。经过一番实验(其实还是费了好长时间),终于写了一个拍照程序。

程序的功能就是打开电脑摄像头,当P键按下(P是拍照的首字母?还是Photo的首字母?还是Picture的首字母?)的时候,保存当前帧的图像。简单到没朋友(竟然耗费了那么久!)。

while (1)
		{
			char key = waitKey(100);
			cap >> frame;
			imshow("frame", frame);
			string filename = format("D:\\pic\\pic%d.jpg", i);

			switch (key)
			{
			case'p':
				i++;
				imwrite(filename, frame);
				imshow("photo", frame);
				waitKey(500);
				destroyWindow("photo");
				break;
			default:
				break;
			}
		}
</pre><p></p><pre>

然后我们就可以运行程序,不停地按下p键对自己一通狂拍了。

2.预处理

在得到自己的人脸照片之后,还需要对这些照片进行一些预处理才能拿去训练模型。所谓预处理,其实就是检测并分割出人脸,并改变人脸的大小与下载的数据集中图片大小一致。

人脸检测在之前的博客中已经做了介绍,这里就不再赘述。详情参考:OpenCV实践之路——人脸检测(C++/Python)。用ROI分割即可。

检测出人脸之后改变大小使之与ORL人脸数据库人脸大小一致。通过加断点在Locals里面或者是ImageWatch可以看到ORL人脸数据库人脸的大小是92
x 112。

这里只需要对检测后得到的ROI做一次resize即可。

这两步的代码如下:

			std::vector<Rect> faces;
			Mat img_gray;

			cvtColor(img, img_gray, COLOR_BGR2GRAY);
			equalizeHist(img_gray, img_gray);

			//-- Detect faces
			face_cascade.detectMultiScale(img_gray, faces, 1.1, 3, CV_HAAR_DO_ROUGH_SEARCH, Size(50, 50));

			for (size_t j = 0; j < faces.size(); j++)
			{
				Mat faceROI = img(faces[j]);
				Mat MyFace;
				if (faceROI.cols > 100)
				{
					resize(faceROI, MyFace, Size(92, 112));
					string  str = format("D:\\MyFaces\\MyFcae%d.jpg", i);
					imwrite(str, MyFace);
					imshow("ii", MyFace);
				}
				waitKey(10);
			}

至此,我们就得到和ORL人脸数据库人脸大小一致的自己的人脸数据集。然后我们把自己的作为第41个人,在我们下载的人脸文件夹下建立一个s41的子文件夹,把自己的人脸数据放进去。就成了这样下面这样,最后一个文件夹里面是我自己的头像照片:

最后那个at.txt放到下一次再说,训练模型就靠它了。

这里有一点值得注意:我这里保存的图像格式是*.jpg的,而不是跟原数据集一样是*.pgm的。经测试仍然可以训练出可以正确识别我自己人脸的模型来。但是如果大小不一致会报错。

之后的内容放到下一次记录。未完待续......

时间: 2024-10-09 19:59:57

OpenCV实践之路——人脸识别之一数据收集和预处理的相关文章

OpenCV实践之路——人脸检测(C++/Python) 【转】

转自:http://blog.csdn.net/xingchenbingbuyu/article/details/51105159 版权声明:本文为博主原创文章,转载请联系作者取得授权. 本文由@星沉阁冰不语出品,转载请注明作者和出处. 文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/51105159 微博:http://weibo.com/xingchenbing  之前一直觉得人脸检测是非常麻烦的,即使是用OpenCV,麻

OpenCV实践之路——人脸检测(C++/Python)

之前一直觉得人脸检测是非常麻烦的,即使是用opencv,麻烦到我都不敢去碰.这两天仔细看了下,如果只是调用opencv自带的分类器和函数的话,简直是简单.这不,正好最近也在学习Python,索性就用C++和Python两种语言都实现一下.当然,我现在这个是最简单的版本. 步骤: 调用opencv训练好的分类器和自带的检测函数检测人脸人眼等的步骤简单直接: 1.加载分类器,当然分类器事先要放在工程目录中去.分类器本来的位置是在*\opencv\sources\data\haarcascades(h

OpenCV实践之路——MFC与OpenCV联合打开摄像头

在之前的一篇博客中已经记录了如何打开一张图片,能打开图片之后,自然就是尝试打开摄像头.在之前打开图片的时候已经知道了怎么应用按钮控件和图片控件,虽然都没记录...最最重要的是,知道了怎么让MFC与OpenCV的数据交互--Mat与CImage相互转换.有了之前的基础,打开摄像头就可以得心应手了.还是直接上代码,然后再说问题: void CMFCtestDlg::OnBnClickedButton1() { // TODO: Add your control notification handle

利用face_recognition,dlib与OpenCV调用摄像头进行人脸识别

用已经搭建好 face_recognition,dlib 环境来进行人脸识别 未搭建好环境请参考:https://www.cnblogs.com/guihua-pingting/p/12201077.html 使用OpenCV 调用摄像头 import face_recognition import cv2 video_capture = cv2.VideoCapture(0) # VideoCapture打开摄像头,0为笔记本内置摄像头,1为外USB摄像头,或写入视频路径 mayun_img

opencv+python3.4的人脸识别----2017-7-19

opencv3.1  +  python3.4 第一回合(抄代码,可实现):人脸识别涉及一个级联表,目前能力还无法理解. 流程:1.读取图像---2.转换为灰度图---3.创建级联表---4.对灰度图使用级联表方法过滤---5.迭代得到的结果依次标记出来---6.保存图像 完整代码: import cv2 #读取图片 img = cv2.imread('5.jpg') #转化为灰度图 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #特征级联表 face_

ios OpenCv的配置和人脸识别技术

作为一个好奇心非常重的人,面对未知的世界都想去一探到底. 于是做了个人脸识别的demo. 眼下国内的关于opencv技术文章非常少.都是互相抄袭.关键是抄个一小部分还不全.时间又是非常久之前的了,和如今的一些东西对不上. 没事,我是个实在人,啥也不多说,直接上開始.期间參考了国内很多opencv的文章,代码部分參考http://m.blog.csdn.net/blog/u013810454/27868973.大家能够查看.只是他那个项目下载下来有问题. 我这个融合了全部的长处,更加全面.从配置到

java+opencv+intellij idea实现人脸识别

首先当然是需要安装opencv了,我用的是opencv2.4.13.下载完之后就可以直接安装了,安装过程也很简单,直接下一步下一步就好,我就不上图了. 接下来在opencv下找到jar包,比如我直接安装在c盘,我的jar包在C:\opencv\build\java中. 然后将jar包拷贝到lib目录中,并且在idea中配置 接着在opencv的路径下找到lbpcascade_frontalface.xml.比如我的就是C:\opencv\sources\data\lbpcascades.然后将其

OpenCV实践之路——Python的安装和使用

本文由@星沉阁冰不语出品,转载请注明作者和出处. 文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/50936076 微博:http://weibo.com/xingchenbing  因为下一步要開始研究下深度学习.而深度学习领域非常多的算法和应用都是用Python来实现的,把Python转成C++代码耗时太多,不如直接学习下Python直接医用Python的代码. 搭建Python环境的过程是非常耗时的,可是如今回头来看又认

OpenCV学习之路——车牌识别之车牌定位

去年七月份因为学校项目需要开始接触图像处理,但那时候只是到网上找车牌识别代码,然后加入到自己的项目中,不清楚细节原理. 现在自己重新一步步实现车牌识别. 高斯模糊: 1 Mat Gaussian(Mat &img) { 2 Mat out; 3 GaussianBlur(img, out, Size(3, 3), 4 0, 0, BORDER_DEFAULT); 5 return out; 6 7 } 灰度化: 1 Mat Grayscale(Mat &img) { 2 Mat out;