У меня есть приложение iOS
с заставкой.Я хотел бы отследить лицо пользователя, чтобы заставка автоматически исчезала, когда пользователь смотрит на устройство.
Я настроил тестовое приложение, использующее API Vision, и начал с некоторого код от Рэй Вендерлих .Я изменил код так, чтобы он печатал лицо / лицо не в зависимости от того, смотрит кто-то на устройство или нет.Тем не менее, я заметил, что загрузка процессора действительно высока, и через пару минут устройство немного нагревается.Есть ли способ уменьшить частоту обновления функции распознавания лиц или есть другое решение моей проблемы, которое потребляет меньше энергии?
Вот мой модифицированный код:
import AVFoundation
import UIKit
import Vision
class FaceDetectionViewController: UIViewController {
var sequenceHandler = VNSequenceRequestHandler()
let session = AVCaptureSession()
var previewLayer: AVCaptureVideoPreviewLayer!
let dataOutputQueue = DispatchQueue(
label: "video data queue",
qos: .userInitiated,
attributes: [],
autoreleaseFrequency: .workItem)
override func viewDidLoad() {
super.viewDidLoad()
configureCaptureSession()
session.startRunning()
}
}
// MARK: - Video Processing methods
extension FaceDetectionViewController {
func configureCaptureSession() {
// Define the capture device we want to use
guard let camera = AVCaptureDevice.default(.builtInWideAngleCamera,
for: .video,
position: .front) else {
fatalError("No front video camera available")
}
// Connect the camera to the capture session input
do {
let cameraInput = try AVCaptureDeviceInput(device: camera)
session.addInput(cameraInput)
} catch {
fatalError(error.localizedDescription)
}
// Create the video data output
let videoOutput = AVCaptureVideoDataOutput()
videoOutput.setSampleBufferDelegate(self, queue: dataOutputQueue)
videoOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA]
// Add the video output to the capture session
session.addOutput(videoOutput)
let videoConnection = videoOutput.connection(with: .video)
videoConnection?.videoOrientation = .portrait
}
}
extension FaceDetectionViewController: AVCaptureVideoDataOutputSampleBufferDelegate {
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
// 1
guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
return
}
let detectFaceRequest = VNDetectFaceLandmarksRequest(completionHandler: detectedFace)
do {
try sequenceHandler.perform(
[detectFaceRequest],
on: imageBuffer,
orientation: .leftMirrored)
} catch {
print(error.localizedDescription)
}
}
}
extension FaceDetectionViewController {
func detectedFace(request: VNRequest, error: Error?) {
// 1
guard
let results = request.results as? [VNFaceObservation],
let result = results.first
else {
print("** NO FACE")
return
}
print("FACE")
}
}
Есть ли способ использовать Vision API более энергоэффективным способом?Мне не нужны быстрые частоты обновления.Одного обнаружения достаточно 5 секунд.