人脸检测

环境及软件:Ubuntu16.04.5 opencv2.4.13.6 python3 vim
首先是打开摄像头:
之前用C++实现过打开电脑摄像头,但并没有记录下来,这次python遇到的问题比上次多,所以简要的记录一下过程。
首先最基本的命令 vim test.py建立一个python脚本,:!python % 用来执行python程序。
代码如下:

    import cv2
    cap = cv2.VideoCapture(1) #视频进行读取操作以及调用摄像头
    width = 640#宽度
    ret = cap.set(3, width)
    height = 480#高度
    ret = cap.set(4, height)
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter('out.avi', fourcc, 20.0, (width, height))
    while cap.isOpened(): #判断视频读取或者摄像头调用是否成功,成功则返回true。
         ret, frame = cap.read()#返回给ret的是摄像头调用是否成功的结果,返回给frame的为获取到的视频
         if ret is True:
              print('frame shape:',frame.shape)
              frame = cv2.resize(frame, (640, 480))
              out.write(frame)
              cv2.imshow('frame', frame)
        else:
             break
      key = cv2.waitKey(1)
       if key == ord('q'):
              break
    
    cap.release()
    out.release()
    cv2.destroyAllWindows()

这里需要注意的是cap = cv2.VideoCapture(1)此处如果不通的话可以试一下0,因为代码是从网上各个地方找的,我用0的时候是不对的,改成1可以,此处需要注意一下。
其中遇到 类似
File “test.py”, line 3
SyntaxError: Non-ASCII character ‘\xe5’ in file test.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
问题在代码前两行加上

 #!usr/bin/python 
 # -*- coding: utf-8 -*-

即可解决。
实现过程中一定要注意代码正确,若是有问题先测试摄像头打开是否有问题或是版本问题,最简便打开摄像头的方法:命令cheese,如果没有安装,先使用 sudo apt-get install cheese 再用命令cheese打开。
实现结果如下:
此处仅仅打开了摄像头,后续会进行人脸检测识别,期待下一篇。。。
最后实现人脸检测:
人脸识别技术是基于人的脸部特征,对输入的人脸图像或者视频流 . 首先判断其是否存在人脸 , 如果存在人脸,则进一步的给出每个脸的位置、大小和各个主要面部器官的位置信息。并依据这些信息,进一步提取每个人脸中所蕴涵的身份特征,并将其与已知的人脸进行对比,从而识别每个人脸的身份。
此处我进行的是人脸检测,即通过检测到的脸的位置、大小画出矩形框实现检测到人脸。

import cv2
import numpy as np

cv2.namedWindow("li") #命名一个窗口
cap = cv2.VideoCapture(0)#打开摄像头
success, frame = cap.read()#读取一桢图像,前一个返回值是否成功,后一个返回值是图
像本身
color = (0,225,0)#设置人脸框的颜色
classfier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#定义分类器
while success:
        success, frame = cap.read()
        size = frame.shape[:2]#获取当前桢彩色图像的大小
        image = np.zeros(size,dtype = np.float16)#定义一个与当前桢图像大小相同的
灰度图像矩阵
        image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#将当前桢图像转换成灰度图
像
        cv2.equalizeHist(image,image)#灰度图像进行直方图等距化
        #设定最小图像的大小
        divisor = 8
        h, w = size
        minSize=(int(w/divisor),int(h/divisor))#这里加了一个取整函数
        faceRects = classfier.detectMultiScale(image,1.2,2,cv2.CASCADE_SCALE_IMAGE,minSize)#人脸检测
        if len(faceRects)>0:#人脸数组长度大于0
           for faceRect in faceRects:#对每一个人脸画矩形框
                x,y,w,h = faceRect
                cv2.rectangle(frame,(x,y),(x+w,y+h),color)
        cv2.imshow("li",frame)#显示图像
        key = cv2.waitKey(10)
        c = chr(key & 255)
        if c in ['q','Q',chr(27)]:
           break
cv2.destroyWindow("li")

代码是在网上看到一位老师写的,链接如下http://www.shtml.net/article/content/tok/99794/id/12919.html
其中我只做了微小的改动,打开摄像头这块参数是1还是0还是没搞明白,每次都是试出来的,一次跟一次不一样,知道原因的希望您在下方留言,让我这个小白多学点东西。
此处遇到类似问题empty() in function cv::CascadeClassifier::detectMultiScale,经过多次实验和查资料发现是
classfier = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)#定义分类器的问题,我将老师写的haarcascade_frontalface_alt.xml中的alt改为default,这两个分类器存在于我的文件夹opencv-2.4.13.6//data//haarcascades里面,但这个路径会报错,所以将要调用的.xml分类器复制粘贴到根目录下,最终完成人脸检测,关于框的颜色这里我就不说明了。
此处顺便说明一下key = cv2.waitKey(10)函数的用法,cv2.waitKey(int delay)函数的功能是不断刷新图像,delay为频率时间,单位为ms,返回值为当前键盘按键值,如果delay<=0,即等待时间无限长,返回值仍旧为键盘按键值,它本身是在一个给定时间内等待用户的按键触发。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值