opencv人脸检测 基于haar级联分类器+python

opencv人脸检测 基于haar级联分类器

识别视频中人脸代码

程序会读取目录下的指定视频文件,标注人脸后,保存为视频文件。

#!/usr/bin/python3
#coding=utf8
from cv2 import cv2
import threading
import time

#faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
path = 'D:\\VScode\\python\\face\\haarcascade_frontalface_default.xml'
#人脸识别分类器地址
faceCascade = cv2.CascadeClassifier(path)
#path = 'D:\VScode\python\face\haarcascade_frontalface_default.xml'
Running = True#运行
Run = True #循环的运行
orgFrame = None #框架
ret = False 
sum_count_failure = 0#识别失败的次数
sum_count_successful = 0#识别成功的次数

c = 80
#width, height = c*4, c*3 #width=320,height=240
width, height = 360, 640 #width=320,height=240
#读取视频缩放大小
#cap = cv2.VideoCapture(0)
cap = cv2.VideoCapture('python\\face\\1.mp4')
#视频的地址
#调用摄像头‘0’一般是打开电脑自带摄像头,‘1’是打开外部摄像头(只有一个摄像头的情况)

fourcc = cv2.VideoWriter_fourcc(*'XVID')
#视频的编码方式
#fourcc = int(cap.get(cv2.CAP_PROP_FOURCC))
fps = cap.get(cv2.CAP_PROP_FPS)
#视频的频率
#fps = 24
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
#视频大小
#size = 630,640
out = cv2.VideoWriter('python\\face\\outVideo.mp4', fourcc, fps, size)
#创建一个保存视频的类
print("视频的编码方式{},fps{}  ,size{} ".format(fourcc,fps,size))

def get_image():
    global orgFrame
    global ret
    global Running
    global cap
    global width, height
    #定义全局作用域global
    #读取摄像头的函数
    while True:
        if Running:
            if cap.isOpened():#检查摄像头是否打开失败为flase
                ret, orgFrame = cap.read()#orgFrame为读取的帧即一张张图片 ,ret为判断是否打开视频,成功为Ture,失败False   
                cv2.waitKey(24)   
            else:
                time.sleep(0.01)
        else:
            time.sleep(0.01)

th1 = threading.Thread(target = get_image)#多线程
th1.setDaemon(True)
'''
setDaemon(daemonic)
设置守护线程标志为布尔值daemonic。它必须在start()调用之前被调用。
当没有活动的非守护线程时,整个Python程序退出。'''
th1.start()
'''启动线程活动。在每个线程对象中最多被调用一次。它安排对象的run() 被调用在一单独的控制线程中。'''

while Run:
    if orgFrame is not None and ret:
        orgframe = cv2.resize(orgFrame, (width, height), interpolation = cv2.INTER_CUBIC) #将图片缩放 INTER_CUBIC - 基于4x4像素邻域的3次插值法
        #Gauss_frame = cv2.GaussianBlur(orgframe, (3, 3), 0)#高斯模糊
        gray = cv2.cvtColor(orgframe,cv2.COLOR_BGR2GRAY)
        #色彩转换为灰度图像
        faces = faceCascade.detectMultiScale(
            gray,
            scaleFactor=1.15,
            minNeighbors=5,
            minSize=(43,43),
            maxSize=(65,65)
        )
        count = len(faces)
        print("发现{0}个人脸!".format(count))
        
		#统计识别成功和失败的次数
        if count == 0:
            sum_count_failure = 1 + sum_count_failure
        else:
            sum_count_successful = sum_count_successful + 1

        #print("成功识别{}次,识别失败{}次!".format(sum_count_successful,sum_count_failure))

        for(x,y,w,h) in faces:
            cv2.rectangle(orgframe,(x,y),(x+w,y+w),(0,255,0),2)
        cv2.imshow("dect",orgframe)
        frame = cv2.resize(orgframe, size, interpolation = cv2.INTER_CUBIC) #将图片缩放 INTER_CUBIC - 基于4x4像素邻域的3次插值法
        out.write(frame)  # 写入视频对象
        cv2.waitKey(1)
        #time.sleep(0.01)
    else:
        print("成功识别{}次,识别失败{}次!".format(sum_count_successful,sum_count_failure))
        if sum_count_successful > 20:
            Run = False
print("视频保存成功!")
out.release()
cap.release()
cv2.destroyAllWindows()

程序的运行结果:效果图
在这里插入图片描述

可能会遇见的错误

1缺少解码文件***openh264-1.8.0-win64.dll***
2加载的视频,和保存视频文件像素大小不一样可能会导致保存的视频打不开也很小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值