人脸识别

http://www.jianshu.com/p/d4a924c97416
1、利用OpenCV获取USB摄像头的视频流并展示出来

python学习,sys.argv[]的意思,表示命令行参数
ys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码本身文件路径,所以参数从1开始
import sys,os  
os.system(sys.argv[1]) 
  1 #coding=utf-8
  2 
  3 import cv2
  4 import sys
  5 from PIL import Image
  6 
  7 def CatchUsbVideo(window_name, camera_idx):
  8         cv2.namedWindow(window_name)
  9 
 10         # 视频来源,可以来自一段已存好的视频,也可以是直接来自USB摄像头
 11         cap = cv2.VideoCapture(camera_idx)
 12 
 13         while cap.isOpened():
 14                 ok, frame = cap.read() # 读取一帧数据
 15                 if not ok:
 16                         break
 17 
 18                 # 显示图像并等待10毫秒按键输入,输入“q”退出程序
 19                 cv2.imshow(window_name, frame)
 20                 key = cv2.waitKey(100)
 21                 if key & 0xFF == ord("q"):
 22                         break
 23 
 24         # 释放摄像头并销毁所有窗口
 25         cap.release()
 26         cv2.destroyAllWindows()
 27 
 28 if __name__ == "__main__":
 29         if len(sys.argv) != 2:
 30                 print("Usage:%s camera_id\r\n" %(sys.argv[0]))
 31         else:
 32                 CatchUsbVideo("截取视频流", int(sys.argv[1]))
Shell控制台执行上述代码
python catch_usb_video.py 0
camera_id,这个就是USB摄像头的索引号,一般是0,如果0不行可以试试12

2、实时视频流中识别出人脸区域

  1 #coding=utf-8
  2 
  3 import cv2
  4 import sys
  5 from PIL import Image
  6 
  7 def CatchUsbVideo(window_name, camera_idx):
  8         cv2.namedWindow(window_name)
  9 
 10         # 视频来源,可以来自一段已存好的视频,也可以是直接来自USB摄像头
 11         cap = cv2.VideoCapture(camera_idx)
 12 
 13         # 告诉opencv使用人脸识别分类器
 14         cascade_fn = "/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml"
 15         classifier = cv2.CascadeClassifier(cascade_fn)
 16 
 17         # 识别出人脸后要画出边框的颜色,RGB格式
 18         color = (0, 255, 0)
 19 
 20         while cap.isOpened():
 21                 ok, frame = cap.read()
 22                 if not ok:
 23                         break
 24 
 25                 # 将当前帧转换成灰度图像
 26                 grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 27 
 28                 # 人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
 29                 faceRects = classifier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32))
 30                 if len(faceRects) > 0:                  # 大于0则检测到人脸
 31                         for faceRect in faceRects:      # 单独框出每一张人脸
 32                                 x, y, w, h = faceRect
 33                                 cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h +10), color, 2)
 34 
 35                 # 显示图像
 36                 cv2.imshow(window_name, frame)
 37                 key = cv2.waitKey(10)
 38                 if key & 0xFF == ord("q"):
 39                         break
 40 
 41         # 释放摄像头并销毁窗口
 42         cap.release()
 43         cv2.destroyAllWindows()
 44 
 45 if __name__ == "__main__":
 46         if len(sys.argv) != 2:
 47                 print("Usage: %s camera_id \r\n" %(sys.argv[0]))
 48         else:
 49                 CatchUsbVideo("face_detect", int(sys.argv[1]))

grey:要识别的图像数据(即使不转换成灰度也能识别,但是灰度图可以降低计算强度,因为检测的依据是哈尔特征,转换后每个点的RGB数据变成了一维的灰度,这样计算强度就减少很多)
scaleFactor:图像缩放比例,可以理解为同一个物体与相机距离不同,其大小亦不同,必须将其缩放到一定大小才方便识别,该参数指定每次缩放的比例
minNeighbors:对特征检测点周边多少有效点同时检测,这样可避免因选取的特征检测点太小而导致遗漏
minSize:特征检测点的最小值
对同一个画面有可能出现多张人脸,因此,我们需要用一个for循环将所有检测到的人脸都读取出来,然后逐个用矩形框框出来,这就是接下来的for语句的作用。Opencv会给出每张人脸在图像中的起始坐标(左上角,x、y)以及长、宽(h、w),我们据此就可以截取出人脸。其中,cv2.rectangle()完成画框的工作,在这里我有意识的外扩了10个像素以框出比人脸稍大一点的区域。cv2.rectangle()函数的最后两个参数一个用于指定矩形边框的颜色,一个用于指定矩形边框线条的粗细程度。

3、利用opencv拍照收集人脸数据
日本程序员提供的源码利用了keras这个深度学习库来训练自己的人脸识别模型。keras是一个上层的神经网络学习库,纯python编写,被集成进了Tensorflow和Theano这样的深度学习框架。其存在的目的就是简化开发复杂度,能够让你迅速出产品,更关键的是,keras有中文文档;),有兴趣的请点这里:http://keras-cn.readthedocs.io/en/latest/

  1 #coding=utf-8
  2 
  3 import cv2
  4 import sys
  5 from PIL import Image
  6 
  7 def CatchPICFromVideo(window_name, camera_idx, catch_pic_num, path_name):
  8         cv2.namedWindow(window_name)
  9 
 10         #视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头
 11         cap = cv2.VideoCapture(camera_idx)
 12 
 13         #告诉OpenCV使用人脸识别分类器
 14         cascade_fn = "/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml"
 15         classfier = cv2.CascadeClassifier(cascade_fn)
 16 
 17         #识别出人脸后要画的边框的颜色,RGB格式
 18         color = (0, 255, 0)
 19 
 20         num = 0
 21         while cap.isOpened():
 22                 ok, frame = cap.read() #读取一帧数据
 23                 if not ok:
 24                     break
 25 
 26                 grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  #将当前桢图像转换成灰度图像            
 27 
 28                 #人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
 29                 faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32))
 30                 if len(faceRects) > 0:          #大于0则检测到人脸                                   
 31                     for faceRect in faceRects:  #单独框出每一张人脸
 32                         x, y, w, h = faceRect
 33 
 34                         #将当前帧保存为图片
 35                         img_name = '%s/%d.jpg'%(path_name, num)
 36                         image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
 37                         cv2.imwrite(img_name, image)
 38 
 39                         num += 1
 40                         if num > (catch_pic_num):   #如果超过指定最大保存数量退出循环
 41                             break
 42 
 43                         #画出矩形框
 44                         cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
 45 
 46                         #显示当前捕捉到了多少人脸图片了,这样站在那里被拍摄时心里有个数,不用两眼一抹黑傻等着
 47                         font = cv2.FONT_HERSHEY_SIMPLEX
 48                         cv2.putText(frame,'num:%d' % (num),(x + 30, y + 30), font, 1, (255,0,255),4)
 49 
 50                 #超过指定最大保存数量结束程序
 51                 if num > (catch_pic_num): break
 52 
 53                 #显示图像
 54                 cv2.imshow(window_name, frame)
 55                 key = cv2.waitKey(10)
 56                 if key & 0xFF == ord('q'):
 57                     break
 58 
 59         #释放摄像头并销毁所有窗口
 60         cap.release()
 61         cv2.destroyAllWindows()
 62 
 63 if __name__ == '__main__':
 64     if len(sys.argv) != 4:
 65         print("Usage:%s camera_id face_num_max path_name\r\n" % (sys.argv[0]))
 66     else:
 67         CatchPICFromVideo("截取人脸", int(sys.argv[1]), int(sys.argv[2]), sys.argv[3])

4、模型训练
CNN(Convolutional Neural Network)——卷积神经网络,人工神经网络(Neural Network,NN)的一种,其它还有RNN、DNN等类型,而CNN就是利用卷积进行滤波的神经网络。
第一步: 加载数据到内存

参考备注:
http://www.cnblogs.com/neo-T/p/6426029.html
https://zhuanlan.zhihu.com/p/25249694

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值