使用OpenCV检测人脸

编程语言 2026-07-12

我正在开发一个程序,通过我的网络摄像头来检测我的脸,使用OpenCV来加载视频流,使用MediaPipe进行检测。

我的代码能工作,因为窗口会打开,但我没有任何可检测的脸。我并不真正理解MediaPipe的文档。正如你所看到的,我在开头复制了建议,但在理解这个库的工作方式时遇到了困难。

如何让我的代码检测出脸?

我的代码:

import numpy as np
import cv2 as cv
import mediapipe as mp
BaseOptions = mp.tasks.BaseOptions
FaceDetector = mp.tasks.vision.FaceDetector
FaceDetectorOptions = mp.tasks.vision.FaceDetectorOptions
FaceDetectorResult = mp.tasks.vision.FaceDetectorResult
VisionRunningMode = mp.tasks.vision.RunningMode

def print_result(result: FaceDetectorResult, output_image: mp.Image, timestamp_ms: int):
    print('face detector result: {}'.format(result))

options = FaceDetectorOptions(
    base_options=BaseOptions(model_asset_path=r'C:\Users\hugop\Documents\python\face_project\blaze_face_short_range.tflite'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)

cap = cv.VideoCapture(0)
if not cap.isOpened():
    print("Je ne peux pas ouvrir la caméra")
    exit()

with FaceDetector.create_from_options(options) as detector : 

    while True:
        ret, frame = cap.read()

        if not ret:
            print("Je ne peux pas recevoir le flux vidéo. Sortir...")
            break

        cv.imshow('Caméra', frame)
        if cv.waitKey(1) == ord('q'):
            break

cap.release()
cv.destroyAllWindows ()

解决方案

你必须使用你创建的检测器。

仅仅因为运行模式是实时流,并不意味着 detector 对象知道来自哪个实时流。你已经通过回调把数据 输出 给它,但还没有把数据 输入 给它。要知道你需要创建 cap 对象,因为它指向一个特定的实时流——如果你愿意,甚至可以切换流,或者把多路流混合输入到你的检测器。

看起来你在使用 Google的指南 中某一节的代码?后面的章节会告诉你如何把 frames输入到检测器:

mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame)
detector.detect_async(mp_image, timestamp_ms)

请注意,这里的检测器是异步工作的。这是标准做法,因为检测可能很慢,可能会阻塞程序(或网站)在此期间进行其他操作,例如响应某些用户输入。这也是你给它设回调的原因——一旦你完成对一帧的处理,就对结果做需要的处理。你也可以把 imshow 以及与之相关的内容,比如绘制检测到的边界框,放进回调里。

变量 timestamp_ms 的存在是因为这种异步方法需要对输出进行排序(输出会传入回调函数)。在循环之前把它设为0,并在循环中根据你等待的毫秒数来更新它。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章