【发布时间】:2021-01-25 15:21:24
【问题描述】:
人脸检测的tracking Id在人脸不动的情况下保持变化,我在ios中使用ML Kit,并按照google的文档进行。
文档:https://developers.google.com/ml-kit/vision/face-detection/ios#performance_tips
这是我的代码:
func captureOutput( _ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
self.detectFaceMLKit(image: sampleBuffer)
}
private func detectFaceMLKit(image: CMSampleBuffer) {
let image = VisionImage(buffer: image)
image.orientation = imageOrientation(
deviceOrientation: UIDevice.current.orientation,
cameraPosition: cameraPosition)
faceDetector?.process(image) { [self] faces, error in
guard error == nil, let faces = faces, !faces.isEmpty else {
//TODO : show error
return
}
// Faces detected
if faces.count == 1 {
let face = faces[0]
let frame = face.frame
var rotX : CGFloat = 0
var rotY : CGFloat = 0
var faceTrackingId = 0
if face.hasHeadEulerAngleX {
rotX = face.headEulerAngleX // Head is rotated to the uptoward rotX degrees
print("rotx: \(rotX)")
}
if face.hasHeadEulerAngleY {
rotY = face.headEulerAngleY // Head is rotated to the right rotY degrees
print("rotY: \(rotY)")
}
// If face tracking was enabled:
if face.hasTrackingID {
faceTrackingId = face.trackingID
print("trackingId: \(faceTrackingId)")
}
}
}
func imageOrientation(
deviceOrientation: UIDeviceOrientation,
cameraPosition: AVCaptureDevice.Position
) -> UIImage.Orientation {
switch deviceOrientation {
case .portrait:
return cameraPosition == .front ? .leftMirrored : .right
case .landscapeLeft:
return cameraPosition == .front ? .downMirrored : .up
case .portraitUpsideDown:
return cameraPosition == .front ? .rightMirrored : .left
case .landscapeRight:
return cameraPosition == .front ? .upMirrored : .down
case .faceDown, .faceUp, .unknown:
return .up
}
}
注意:跟踪 id 在开始时可以正常工作,但在 id “10”左右之后,它会失去面部跟踪,并开始为同一张脸提供多重 id,而无需在相机中移动面部。
过滤跟踪id后的输出样本:
trackingId:21 追踪编号:21 追踪编号:21 追踪编号:21 追踪编号:21 追踪编号:21 跟踪ID:22 跟踪ID:22 跟踪ID:22 跟踪ID:22 跟踪ID:22 跟踪ID:23 跟踪ID:23 跟踪ID:23 跟踪ID:23 跟踪ID:23 跟踪ID:24 跟踪ID:24 跟踪ID:24 跟踪ID:24 trackingId: 24
【问题讨论】:
标签: ios swift xcode firebase-mlkit google-mlkit