You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Google Mobile Vision在Swift 4中实现人脸追踪及眨眼触发功能?

没问题!我帮你梳理下在Swift 4里用Google Mobile Vision实现人脸追踪+眨眼触发功能的完整步骤,避开Obj-C转译的坑:

1. 先集成Google Mobile Vision

咱们用CocoaPods来集成最方便,在你的Podfile里加一行:

pod 'GoogleMobileVision/FaceDetector'

然后终端跑pod install,打开生成的.xcworkspace文件。

2. 配置人脸检测器(关键!要能识别眼睛状态)

初始化检测器时必须开启关键点检测和分类功能,这样才能拿到眼睛的睁开概率数据。代码示例:

import GoogleMobileVision

// 初始化检测器选项
let faceDetectorOptions = GMVFaceDetectorOptions()
faceDetectorOptions.classificationType = .all // 开启分类(包含眼睛睁开/闭合状态)
faceDetectorOptions.landmarkType = .all // 开启关键点检测(定位眼睛、鼻子等部位)
faceDetectorOptions.trackingEnabled = true // 开启人脸追踪,避免重复检测同一人脸
faceDetectorOptions.minFaceSize = 0.2 // 设置最小检测人脸的尺寸比例(占画面的20%)

// 初始化检测器实例
let faceDetector = GMVFaceDetector(options: faceDetectorOptions)
3. 捕获摄像头画面并传给检测器

我们需要用AVFoundation获取摄像头实时帧,再把每一帧传给检测器处理。下面是简化的AVCaptureSession配置代码:

import AVFoundation

class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {
    var captureSession: AVCaptureSession!
    var faceDetector: GMVFaceDetector!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupCaptureSession()
        setupFaceDetector()
    }
    
    func setupCaptureSession() {
        captureSession = AVCaptureSession()
        captureSession.sessionPreset = .medium // 平衡画质与性能
        
        // 获取前置摄像头(如果用后置就把position改成.back)
        guard let camera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front) else {
            print("摄像头不可用")
            return
        }
        
        // 添加摄像头输入
        guard let input = try? AVCaptureDeviceInput(device: camera) else {
            print("无法创建摄像头输入")
            return
        }
        if captureSession.canAddInput(input) {
            captureSession.addInput(input)
        }
        
        // 添加视频输出,并设置代理处理帧数据
        let videoOutput = AVCaptureVideoDataOutput()
        videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoProcessingQueue"))
        if captureSession.canAddOutput(videoOutput) {
            captureSession.addOutput(videoOutput)
        }
        
        // 启动会话开始捕获画面
        captureSession.startRunning()
    }
    
    func setupFaceDetector() {
        let options = GMVFaceDetectorOptions()
        options.classificationType = .all
        options.landmarkType = .all
        options.trackingEnabled = true
        faceDetector = GMVFaceDetector(options: options)
    }
    
    // 处理每一帧视频数据
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        // 把SampleBuffer转成Google Mobile Vision能识别的UIImage
        guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
        let ciImage = CIImage(cvImageBuffer: imageBuffer)
        let context = CIContext(options: [.useSoftwareRenderer: false])
        guard let cgImage = context.createCGImage(ciImage, from: ciImage.extent) else { return }
        let image = UIImage(cgImage: cgImage)
        
        // 翻转图像(前置摄像头画面是镜像的,检测器需要正确方向)
        let flippedImage = image.withHorizontallyFlippedOrientation()
        
        // 检测画面中的人脸
        if let faces = faceDetector.results(in: flippedImage) as? [GMVFace] {
            processFaces(faces)
        }
    }
}
4. 实现眨眼检测逻辑

核心判断逻辑:Google Mobile Vision会返回人脸的leftEyeOpenProbability和rightEyeOpenProbability(值从0到1,1=完全睁开,0=完全闭合)。我们设置一个阈值(比如0.2),当两只眼睛的概率都低于阈值,且连续几帧都满足,就判定为有效眨眼(避免误触发)。

在ViewController里添加以下方法:

// 记录连续闭眼的帧数
var closedEyeFrames = 0
// 判定眨眼的帧数阈值(连续3帧闭眼就算一次有效眨眼)
let blinkThreshold = 3

func processFaces(_ faces: [GMVFace]) {
    guard let face = faces.first else {
        closedEyeFrames = 0 // 没检测到人脸,重置计数
        return
    }
    
    // 获取眼睛睁开概率(未开启classificationType的话,这两个值为nil)
    let leftEyeOpen = face.leftEyeOpenProbability ?? 1.0
    let rightEyeOpen = face.rightEyeOpenProbability ?? 1.0
    
    // 判断是否处于闭眼状态
    let isEyeClosed = leftEyeOpen < 0.2 && rightEyeOpen < 0.2
    
    if isEyeClosed {
        closedEyeFrames += 1
        // 达到阈值,触发指定函数
        if closedEyeFrames == blinkThreshold {
            DispatchQueue.main.async {
                self.triggerMyFunction() // 调用你的自定义函数
            }
        }
    } else {
        closedEyeFrames = 0 // 眼睛睁开,重置计数
    }
}

// 你的自定义触发函数,示例逻辑
func triggerMyFunction() {
    print("眨眼触发成功!")
    // 在这里写你要执行的逻辑,比如弹出提示、跳转页面、播放音效等
}
5. 别忘了添加相机权限!

在Info.plist里添加NSCameraUsageDescription键,值填写类似“需要访问摄像头进行人脸检测”的描述,否则App会因权限问题直接崩溃。


内容的提问来源于stack exchange,提问作者coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:00:55