我有一个应用程序,可以获取用户的所有图像(照片应用程序中的所有资产).之后应用程序应该运行抛出所有图像并检测面部并返回其面部地标,然后查看数据库以查看是否有任何朋友具有相同的地标(识别朋友面孔),类似于Facebook在时刻应用程序上执行的操作并在网上.然后,该应用将显示朋友在其中显示的所有照片.我的应用程序的重要部分是用户隐私,因此我希望将整个过程保留在设备上,而不是将其发送到在线服务.将其保留在设备上的另一个好处是,我的应用程序中的每个用户都可以拥有数千个图像,并且使用外部服务将是扩展的并且可能会降低性能(如果每个图像都需要发送到服务器).
从我所做的研究中,有许多在线服务(但它们不符合我的要求 – 保持流程脱机).还有CIDector可以检测到面部,然后您可以返回一些功能,例如眼睛位置和嘴部位置(我认为这不足以进行可靠的识别).我也听说过Luxand,openCV和openFace,这些都是设备识别,但都是C类,这使得很难与swift项目集成(文档不是很好,并没有解释如何将它集成到你的项目以及如何在swift上进行人脸识别.
所以我的问题是,是否有任何方法可以执行面部检测,返回设备上的面部标志?
>如果没有,我可以使用任何其他方式或服务.
此外,如果有任何有效且快速的方式来执行面部检测和识别,如果用户可能有数千个图像.
顺便说一下,我处于开发的早期阶段,我正在寻找可用于开发阶段的免费服务.
最佳答案 iOS在Core
Image框架中具有原生面部检测功能,非常酷.您也可以检测眼睛等.只需查看此代码,就会展示如何使用它.
func detect() {
guard let personciImage = CIImage(image: personPic.image!) else {
return
}
let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh]
let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy)
let faces = faceDetector.featuresInImage(personciImage)
// converting to other coordinate system
let ciImageSize = personciImage.extent.size
var transform = CGAffineTransformMakeScale(1, -1)
transform = CGAffineTransformTranslate(transform, 0, -ciImageSize.height)
for face in faces as! [CIFaceFeature] {
print("Found bounds are \(face.bounds)")
// calculating place for faceBox
var faceViewBounds = CGRectApplyAffineTransform(face.bounds, transform)
let viewSize = personPic.bounds.size
let scale = min(viewSize.width / ciImageSize.width,
viewSize.height / ciImageSize.height)
let offsetX = (viewSize.width - ciImageSize.width * scale) / 2
let offsetY = (viewSize.height - ciImageSize.height * scale) / 2
faceViewBounds = CGRectApplyAffineTransform(faceViewBounds, CGAffineTransformMakeScale(scale, scale))
faceViewBounds.origin.x += offsetX
faceViewBounds.origin.y += offsetY
let faceBox = UIView(frame: faceViewBounds)
faceBox.layer.borderWidth = 3
faceBox.layer.borderColor = UIColor.redColor().CGColor
faceBox.backgroundColor = UIColor.clearColor()
personPic.addSubview(faceBox)
if face.hasLeftEyePosition {
print("Left eye bounds are \(face.leftEyePosition)")
}
if face.hasRightEyePosition {
print("Right eye bounds are \(face.rightEyePosition)")
}
}
}