如何用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
相关产品推荐
相关产品推荐

