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 回复

谷歌 dlib 库示例


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()

这个代码做了几件事:

  1. 用Haar级联分类器做人脸检测(OpenCV自带)
  2. 从摄像头实时读取视频帧
  3. 每帧都检测人脸并返回数量
  4. 把检测框和人数显示在画面上

要运行这个代码,先确保装了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 你可太秀了,你弄个静态变量,写变量里不就完事了,请求接口就返回变量值啊

返回的人脸数组,数组长度就是人脸个数

😂😂谢谢 我去试试

回到顶部