发布时间:2022-10-14 18:00
一.设计思路
1.导入模块
import sys
import cv2
sys模块:该模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数。
cv2模块:opencv接口模块
2.读取视频
def videocapture():
cap = cv2.VideoCapture(0) # 生成读取摄像头对象
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 获取视频的宽度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 获取视频的高度
fps = cap.get(cv2.CAP_PROP_FPS) # 获取视频的帧率
fourcc = int(cap.get(cv2.CAP_PROP_FOURCC)) # 视频的编码
# 定义视频对象输出
writer = cv2.VideoWriter("video_result.mp4", fourcc, fps, (width, height))
while cap.isOpened():
ret, frame = cap.read() # 读取摄像头画面
cv2.imshow('teswell', frame) # 显示画面
key = cv2.waitKey(24)
writer.write(frame) # 视频保存
# 按Q退出
if key == ord('q'):
break
cap.release() # 释放摄像头
cv2.destroyAllWindows() # 释放所有显示图像窗口
如果本地没视频的话,用这个函数调用自己的摄像头,并录制一段视频,保存下来,如果有本地视频,后面主函数中可以把这个函数注释掉,用本地视频
3.人脸检测
def CatchUsbVideo(window_name, camera_idx):
cv2.namedWindow(window_name)
# 视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头
cap = cv2.VideoCapture("video.mp4")
# 告诉OpenCV使用人脸识别分类器
#classfier = cv2.CascadeClassifier(r"./haarcascade_frontalface_alt2.xml")
classfier = cv2.CascadeClassifier(r"F:\OpenCV\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml")
# 识别出人脸后要画的边框的颜色,RGB格式
color = (0, 255, 0)
while cap.isOpened():
ok, frame = cap.read() # 读取一帧数据
if not ok:
break
# 将当前帧转换成灰度图像
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(faceRects) > 0: # 大于0则检测到人脸
for faceRect in faceRects: # 单独框出每一张人脸
x, y, w, h = faceRect
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
# 显示图像
cv2.imshow(window_name, frame)
c = cv2.waitKey(10)
if c & 0xFF == ord('q'):
break
# 释放摄像头并销毁所有窗口
cap.release()
cv2.destroyAllWindows()
这里需要注意,haarcascade_frontalface_alt2.xml文件的路径,在自己的安装路径里,在下图这个位置,记得替换为自己的路径
设置完人脸识别分类器,将视频一帧一帧转为图片,并进行灰度处理,调用函数进行人脸检测,框选,执行完将图片显示出来,最后释放摄像头
4.程序测试
if __name__ == '__main__':
#videocapture()
try:
if len(sys.argv) != 1:
print("Usage:%s camera_id\r\n" % (sys.argv[0]))
else:
CatchUsbVideo("识别人脸区域",0)
except Exception as Error:
print(Error)
主函数,调用上面所写函数进行测试
二.运行结果
结果还算满意
唯一问题是,最后显示名称因为是中文,会出现如图乱码,暂时不知道解决方案
三.总结
本设计需要注意的是:
1.是否需要调用本地摄像头,如果不用,本地应该有需要检测的视频(我试了下,gif也可以)
2.haarcascade_frontalface_alt2.xml文件路径要设置好