Python中使用OpenCV检测视频中的人脸,如何实时返回人脸个数?
我遇到的问题是在检测到视频中人脸后,可以把人脸实时显示出来,但是怎么把这个值通过返回值实时返回呢? 类似于
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
#capture frame-by-frame
ret , frame = cap.read()
检测人脸操作略。。。
#display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) &0xFF ==ord('q'): #按 q 键退出
break
#when everything done , release the capture
cap.release()
cv2.destroyAllWindows()
怎么改成一个其他人可以调用的函数,实时返回人脸的个数呢?因为返回的同时还要实时显示,非科班出身,思路受限,谷歌没得到想要的结果,希望大佬点拨下,给个思路
Python中使用OpenCV检测视频中的人脸,如何实时返回人脸个数?
8 回复
import cv2
def count_faces_in_video():
# 加载预训练的人脸检测器(Haar级联分类器)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 打开摄像头(0表示默认摄像头)
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("无法打开摄像头")
return
while True:
# 读取视频帧
ret, frame = cap.read()
if not ret:
print("无法读取视频帧")
break
# 转换为灰度图像(人脸检测需要)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.1, # 图像缩放比例
minNeighbors=5, # 检测框最小邻居数
minSize=(30, 30) # 最小人脸尺寸
)
# 获取人脸数量
face_count = len(faces)
# 在图像上绘制检测结果
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
# 显示人脸数量
cv2.putText(frame, f'Faces: {face_count}', (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
# 显示结果
cv2.imshow('Face Detection', frame)
# 按'q'键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
count_faces_in_video()
这个代码做了几件事:
- 用Haar级联分类器做人脸检测(OpenCV自带)
- 从摄像头实时读取视频帧
- 每帧都检测人脸并返回数量
- 把检测框和人数显示在画面上
要运行这个代码,先确保装了OpenCV:pip install opencv-python。运行后按’q’退出。
如果想用DNN模型(更准但慢点),把检测部分换成:
net = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'res10_300x300_ssd_iter_140000.caffemodel')
blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300), [104, 117, 123])
net.setInput(blob)
detections = net.forward()
核心就三点:加载检测器、循环处理帧、统计检测结果数量。
简单说:用cv2.CascadeClassifier检测,len()统计数量。
不是都拿到检测的结果了吗,直接一个 len 不就得到个数了。不拿到结果也不可能画在图上的啊
库函数得到结果里就包含所有检测到的脸啊
老师让我把函数做成 API,供其他的函数调用,实时显示人脸框很好理解,如果返回此时刻的人脸识别结果,那么检测行为就结束了,能不能在不影响人脸检测过程的行为,同时把结果让其他函数知道,我现在的想法是,就检测到的人脸结果写到 txt 文件,其他函数可以读 txt 得到结果,感觉像非正规军做的😂
写到 txt 你可太秀了,你弄个静态变量,写变量里不就完事了,请求接口就返回变量值啊
返回的人脸数组,数组长度就是人脸个数
😂😂谢谢 我去试试


