python + opencv 实现人脸检测

可以用opencv 的库函数来实现人脸检测
#coding=utf-8
import numpy as np
import cv2
import time
import sys, getopt
from video import create_capture
from common import clock, draw_str


def detect(img , cascade):#检测函数
    rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30),
                                     flags=cv2.CASCADE_SCALE_IMAGE)
    if len(rects) == 0:
        return []
    rects[:,2:] += rects[:,:2]
    return rects

def draw_rects(img, rects, color):#画框函数
    for x1, y1, x2, y2 in rects:
        cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)

if __name__ == '__main__':#主函数
    args = {}
    #读入分类器
    cascade_fn = args.get('--cascade', "haarcascade_frontalface_alt.xml")
    # cascade_fn = args.get('--cascade', "haarcascade_righteye_2splits.xml")#yanjing
    # cascade_fn = args.get('--cascade', "haarcascade_fullbody.xml")
    eyes  = args.get('--eyesed-cascade', "haarcascade_eye.xml")
    
    cascade = cv2.CascadeClassifier(cascade_fn)
    eyesed  = cv2.CascadeClassifier(eyes)
    print cascade_fn
	#捕获摄像头视频流
    cap = cv2.VideoCapture(0)
    while True:
        #延时
        time.sleep(0.10)
        # img = cv2.imread("haha2.jpg")
        # print img.shape
        ret,img = cap.read()#读入每一帧图像
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#灰度化

        t = clock()#计时
        rects = detect(gray, cascade)#检测人脸
        vis = img.copy()
        draw_rects(vis, rects, (0, 255, 0))
        # if not eyesed.empty():
            # for x1, y1, x2, y2 in rects:
                # roi = gray[y1:y2, x1:x2]
                # vis_roi = vis[y1:y2 , x1:x2]
                # subrects = detect(roi.copy(), eyesed)
                # draw_rects(vis_roi, subrects, (255, 0, 0))

        subrects = detect(gray, eyesed)
        draw_rects(vis, subrects, (255, 0, 0))

        dt = clock() - t
        # print dt
        draw_str(vis, (20, 20), 'time: %.1f ms' % (dt*1000))
        cv2.imshow('facedetect', vis)

        if cv2.waitKey(5) == 27:
            break
    cv2.destroyAllWindows()
下面是效果图:
图删了。。

一共三个函数:detect函数 、draw_rects函数、main函数
在主函数里面读取视频的每一帧,可以直接处理读入人炼狱眼睛的的分类器,然后每一帧检测人脸与眼睛,检测到则画方框
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/qq_33894122/article/details/78076592