在 iOS 开发中,苹果使用 Core ML 进行手势检测需要结合设备传感器或摄像头数据,工程并依赖预训练的模式机器学习模型。以下是代码大全实现手势检测的完整技术路径和示例代码:
一、准备工作
1. 获取手势识别模型
2. 工程配置
swift
// Podfile
pod 'CoreML'
pod 'Vision'
二、何使基础实现(摄像头手势识别)
swift
import AVFoundation
import Vision
class GestureDetector: NSObject {
private var requests = [VNRequest]
private var bufferSize: CGSize = .zero
private var previewLayer: AVCaptureVideoPreviewLayer!
// 初始化模型
func setupCoreML(model: MLModel) {
let visionModel = try?苹果 VNCoreMLModel(for: model)
let request = VNCoreMLRequest(model: visionModel!) { req, err in
self.handleDetection(request: req)
requests = [request]
// 处理识别结果
private func handleDetection(request: VNRequest) {
guard let results = request.results as? [VNClassificationObservation] else { return }
if let topResult = results.first {
let confidence = topResult.confidence
if confidence >0.8 {
DispatchQueue.main.async {
print("检测到手势: (topResult.identifier) 置信度: (confidence)")
// 摄像头配置扩展
extension GestureDetector: AVCaptureVideoDataOutputSampleBufferDelegate {
func setupCameraSession(previewView: UIView) {
let session = AVCaptureSession
session.sessionPreset = .hd1280x720
guard let device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back),
let input = try? AVCaptureDeviceInput(device: device) else { return }
if session.canAddInput(input) {
session.addInput(input)
previewLayer = AVCaptureVideoPreviewLayer(session: session)
previewView.layer.addSublayer(previewLayer)
let output = AVCaptureVideoDataOutput
output.setSampleBufferDelegate(self, queue: DispatchQueue(label: "VideoQueue"))
session.addOutput(output)
session.startRunning
func captureOutput(_ output: AVCaptureOutput,
didOutput sampleBuffer: CMSampleBuffer,
from connection: AVCaptureConnection) {
guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
let requestHandler = VNImageRequestHandler(
cvPixelBuffer: pixelBuffer,
orientation: .up
do {
try requestHandler.perform(requests)
} catch {
print(error.localizedDescription)
三、高级优化技巧
1. 实时性能优化
swift
// 设置模型计算后端
request.usesCPUOnly = false // 启用GPU加速
// 降低分辨率
session.sessionPreset = .vga640x480
2. 多手势识别
swift
// 修改处理逻辑支持多标签输出
if let results = request.results as?工程 [VNRecognizedObjectObservation] {
results.forEach { observation in
let labels = observation.labels
filter { $0.confidence >0.75 }
map { "($0.identifier)(($0.confidence))" }
print("检测到多手势: (labels.joined(separator: ", "))")
3. 时序手势识别
四、调试技巧
1. 使用 Xcode 的模式 Model Performance 工具分析推理耗时
2. 启用 Core ML 日志:
swift
let config = MLModelConfiguration
puteUnits = .all // 自动选择计算单元
config.allowLowPrecisionAccumulationOnGPU = true // 低精度加速
五、典型问题排查
1. 输入维度不匹配
swift
// 检查模型输入规格
let input = model.modelDescription.inputDescriptionsByName["image"]!
print("Required input size: (input.imageConstraint?代码大全.pixelsWide ?? 0)x(input.imageConstraint?.pixelsHigh ?? 0)")
2. 内存泄漏
六、扩展方向
1. 结合 ARKit
swift
import ARKit
// 使用 ARFrame 的何使 capturedImage 作为输入
2. 离线训练优化
完整项目示例可参考:[Apple Core ML Gesture Sample]
建议通过 Xcode 的工程 Model Preview 功能直接查看模型输入/输出规格,确保数据预处理符合要求。模式
代码大全