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加载的视频,和保存视频文件像素大小不一样可能会导致保存的视频打不开也很小。