可以使用usb摄像头、rtsp流进行录像、人脸识别操作、人脸抓图
haarcascade_frontalface_default.xml文件下载
所需积分/C币: 0opencv-master-Python文档类资源-CSDN下载
#!/usr/bin/python3
# encoding: utf-8
import datetime
import time
from loguru import logger
import cv2
import os
# haarcascade_frontalface_default.xml文件路径
face_cascade = cv2.CascadeClassifier("D:\\opencv-master\\data\\haarcascades\\haarcascade_frontalface_default.xml")
rtsp = "rtsp://admin:root1234@192.168.1.108:554/cam/realmonitor?channel=1&subtype=0"
video = cv2.VideoCapture(1) # 调用摄像头,PC电脑中0为内置摄像头,1为外接摄像头
judge = video.isOpened() # 判断video是否打开
# 获取摄像头分辨率
size = (int(video.get(3)), int(video.get(4)))
if int(video.get(3)) == 0 and int(video.get(4)) == 0:
logger.error("未找到摄像头")
exit()
fps = video.get(5) # 获取摄像头帧率
logger.info("摄像头分辨率: " + str(size) + " 帧率:" + str(fps))
# 保存视频
code = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G') # 编码格式
# 全局变量
global out
# fps = 10 # 保存视频的帧率
def videos():
# 保存视频的路径和名字
filename = open(str(time.strftime("%Y-%m-%d %H-%M-%S", time.localtime(int(time.time())))) + '.avi',
'w')
filename.close()
filename = str(time.strftime("%Y-%m-%d %H-%M-%S", time.localtime(int(time.time())))) + '.avi'
logger.info("文件创建时间: " + filename)
out = cv2.VideoWriter(filename, code, fps, size, isColor=True) # 保存视频的视频流
if not (out.isOpened()): # 判断视频流是否创建成功
print('out is not opened')
return out, filename
# 画面添加时间戳
def show_time(frame):
font = cv2.FONT_HERSHEY_PLAIN
datet = str(datetime.datetime.now())
frame = cv2.putText(frame, datet, (30, 30), font, 1, (235, 230, 210), 1, cv2.LINE_AA)
return frame
# face检测
def face(frame):
# 图像灰度处理
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 设定人脸识别参数
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=3)
facenum = len(faces)
if facenum > 0:
for faceRect in faces:
x, y, w, h = faceRect
# -------- 在人脸周围绘制矩形
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)
logger.info("人脸数量:" + str(facenum))
# 截图
cv2.imwrite(str(time.strftime("%Y-%m-%d %H-%M-%S", time.localtime(int(time.time())))) + ".png", frame)
def main():
# 不需要录像注释掉
v = videos()
while judge:
ret, frame = video.read()
show_time(frame)
face(frame)
# qt预览展示---------linux需要注释---------按q退出
cv2.imshow('Output', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
exit()
# 不需要录像注释掉
v[0].write(frame) # 将图像写入视频流,生成视频
# 录像文件大于50切掉
if os.path.getsize(v[1]) / float(1024 * 1024) >= 50:
break
main()