您的位置:首页 > 编程语言 > Python开发

使用python 以及opencv检测人脸

2019-06-29 08:28 246 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_38544360/article/details/94116302

1、人脸检测需要使用开源的opencv计算机视觉软件包 opencv-4.1.0-vc14_vc15.exe。

    下载opencv,  windows版,并安装,参见网址:https://opencv.org/releases/ 。opencv是一个开源的计算机视觉和机器学习的软件包。软件包有2500多种优化算法,其中包括一套综合的经典和最先进的计算机视觉和机器学习算法。这些算法可用于检测和识别人脸、识别对象、对视频中的人类行为进行分类、跟踪摄像机运动、跟踪移动对象、提取对象的三维模型、从立体摄像机生成三维点云、将图像拼接在一起以生成高分辨率的图像。轮胎场景,从图像数据库中找到相似的图像,从使用闪光灯拍摄的图像中去除红眼,跟踪眼球运动,识别风景并建立标记以增强现实感等。

     OpenCV拥有超过4.7万用户社区和估计的下载数量。超过1800万。该软件包在公司、研究团体和政府机构中被广泛使用。              除了像google、yahoo、microsoft、intel、ibm、sony、honda、toyota这样的知名公司,还有许多初创公司,如applied minds、videosurf和zeitera,它们广泛使用opencv。

     OpenCV的部署应用范围包括将街景图像拼接在一起、检测以色列监控视频中的入侵、监测中国的矿山设备、帮助机器人在柳树车库导航和拾起物体、检测欧洲游泳池溺水事故、跑步等。西班牙和纽约的互动艺术,检查土耳其跑道上的碎片,检查世界各地工厂产品的标签,以快速检测日本的人脸。            

    它具有C++、Python、Java和Matlab接口,支持Windows、Linux、Android和Mac OS。OpenCV主要面向实时视觉应用程序,并在可用时利用MMX和SSE指令。一个功能齐全的CUDAandOpenCL接口正在积极开发中。有500多个算法和大约10倍的函数组成或支持这些算法。OpenCV是用C++编写的,它有一个模板化的接口,它与STL容器无缝连接。

2、我们使用python语言,需要下载并使用pip命令安装opencv(opencv的python接口): opencv_python-4.1.0.25-cp37-cp37m-win_amd64.whl,参见网址:https://pypi.org/project/opencv-python/,分CPU和GPU版本。

3、人脸检测的源代码,可以检测出人脸,并可以保存视频,以及保存人脸图片(每10帧保存一张)。

#coding = utf-8

#pip install opencv-python

import  cv2
import numpy as np

import datetime

#打开电脑摄像头
cv2.namedWindow('Dace_Detect')
cap = cv2.VideoCapture(0)
success,frame = cap.read()

#打开视频文件,准备保存视频
fourcc = cv2.VideoWriter_fourcc(*'XVID')
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
out = cv2.VideoWriter('./camera_test.avi', fourcc,10.0, size)

#选择人脸检测分类器,位于opencv安装目录下。
classifier = cv2.CascadeClassifier('C:/open-cv/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml')

#每隔10帧保存一张图片

ff = 10

while success:
    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 = classifier.detectMultiScale(image,1.2,2,cv2.CASCADE_SCALE_IMAGE,minSize)
    if len(faceRects) > 0:

        for faceRect in faceRects:
            x,y,w,h = faceRect
            roiImg = frame[y:y+h,x:x+w]

            if ff%10 == 0:
                fn = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
                #将人脸图片保存到文件
                cv2.imwrite('./img/'+fn+'.jpg',roiImg)

            cv2.circle(frame,(x+w//2,y+h//2),min(w//2,h//2),(255,0,0),2)
            #cv2.circle(frame,(x+w//4,y+2*h//5),min(w//8,h//8),(0,255,0),2) #左眼轮廓
            #cv2.circle(frame,(x+3*w//4,y+2*h//5),min(w//8,h//8),(0,255,0),2)#右眼轮廓
            #cv2.circle(frame,(x+w//2,y+2*h//3),min(w//8,h//8),(0,255,0),2) #鼻子轮廓
            cv2.rectangle(frame, (x, y), (x+w, y+h), (0,0,255),2)   #矩形轮廓
    cv2.imshow('Face_Detect',frame)
    success,frame = cap.read()
    
    #写入视频文件
    out.write(frame)

    #按control + C 键退出
    key=cv2.waitKey(10)
    c = chr(key&255)
    if c in ['q','Q',chr(27)]:
        break
cap.release()
out.release()
cv2.destroyAllWindows()

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: