1.前言
今天老师来实验室转了一圈,分配了实验室的主机,分配完了之后发现,我现在在用的这台联想ubuntu系统的主机,不是给我用的!说是给我用的是荣欣的ubuntu主机,然后给我分配个服务器的账号,让我在服务器上跑数据。
我一想,既然是在服务器上跑数据,那我电脑本身啥配置就不太重要了啊。用新主机还得重新配置环境啥的,况且linux本身就容易出毛病,我也是被liunx折腾怕了,就和老师说不用了,我还是用自己的笔记本电脑吧。于是,我又重新投入了windows的怀抱。
本来准备过两天等我买的摄像头到了再开始录制照片,生成训练数据集的,但是既然是用我自己的垃圾笔记本电脑,那就可以很容易的调用笔记本电脑自带的摄像头了啊,于是,准备今天先继续学习机器学习,tensorflow基础知识的我,准备现在就开始用matlab制作自己的数据集了。
2.opencv+python打开电脑自带摄像头,并隔一段时间保存一帧图片到本地,以便于后面的图像预处理。
既然是要获取照片,那我们首先要做的肯定是打开摄像头啊
代码及注释如下(ps:运行环境为anaconda下的pycharm集成平台,在anaconda里搭建了tensorlow虚拟环境,整个项目主要用到了opencv3,tensorflow , matplotlib , scipy , numpy等开发包,另外,本篇文章还用了matlab这款软件,毕竟最后要把预处理好的图像全部都转化成matlab中的.mat文件)
# 打开摄像头并灰度化显示
import cv2
capture = cv2.VideoCapture(0) # 使用cv2.VideoCapture(0)创建VideoCapture对象,
# 参数:0指的是摄像头的编号。
# 如果你电脑上有两个摄像头的话,访问第2个摄像头就可以传入1。
while True: # 死循环
ret, frame = capture.read() # capture.read()函数返回的第1个参数ret(return value缩写)是一个布尔值,
# 表示当前这一帧是否获取正确。第二个参数表示获取的内容
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # cv2.cvtColor()用来转换颜色,这里将彩色图转成灰度图。
cv2.imshow('frame', gray) # imshow函数用来将图片显示在窗口中,参数一为窗口名称,参数二为窗口中的图片
if cv2.waitKey(1) == ord('q'): # 如果接受到键盘输入q,则退出该程序
break
capture.release()
cv2.destroyAllWindows() # 释放窗口
运行效果图:
emmmmmm因为用了双屏所以不小心给你们看到了桌面。。。。
3.将图片进行预处理并保存到本地
上面我们将图片转成了灰度图片,这个是大部分图像处理都必须进行的操作。本来我是准备直接将所有图片都保存到本地再进行预处理的,但是看了看我的512G硬盘的容量还剩下几个G。。。。我还是先处理了再保存到本地吧。。。。
如何进行图片预处理呢?或者说我们的图片预处理需要达到什么效果呢?我们的目的是进行人脸识别,所以说我们想要的效果就是在一张图片中找到人脸并将其裁剪保存下来。
好了,确定了一个目标,接下来我们要做的事情就是朝着这个目标去努力。想要找到人脸,我们就必须用一种方法先识别出图片中的人脸。这里我选用的是opencv的级联分类器来实现这个功能。
什么是级联分类器,我们怎么来使用级联分类器呢?
理解级联分类器:
分类器: 判别某个事物是否属于某种分类的器件,两种结果:是、否
级联分类器: 可以理解为将N个单类的分类器串联起来。如果一个事物能属于这一系列串联起来的的所有分类器,则最终结果就是 是,若有一项不符,则判定为否
下面我们来看一下opencv里面的级联分类器CascadeClassifier的原理:
级联分类器类的检测框架简而言之就是一个多尺度缩放+滑动窗口遍历搜索的框架。在CascadeClassifier中包含detectMultiScale和detectSingleScale成员函数,分别对应多尺度和单尺度检测,其中多尺度检测中会调用单尺度的方法。
分类器仅能够对某一固定size的采样图像做判断,给出当前的采样图像是否为真实目标的“非正即负”的结果(size是由训练数据决定的)。要找到某个图像中的