【发布时间】:2015-10-27 06:02:43
【问题描述】:
我正在使用 CoreImage 来检测图片上的人脸。它在模拟器上效果很好,但在我的 iphone 5 上,它几乎从不适用于使用 iphone 相机拍摄的照片(它适用于从网络上挑选的照片)。
以下代码显示了我如何检测人脸。对于每张图片,应用程序都会记录
第 1 步:将处理图像
但它只记录
第 2 步:检测到人脸
对于他们中的少数人来说,几乎每一张脸都是在模拟器上检测到的,或者如果我使用来自网络的图片。
var context: CIContext = {
return CIContext(options: nil)
}()
let detector = CIDetector(ofType: CIDetectorTypeFace,
context: context,
options: [CIDetectorAccuracy: CIDetectorAccuracyHigh])
let imageView = mainPic
for var index = 0; index < picsArray.count; index++ {
if !(picsArray.objectAtIndex(index).objectAtIndex(1) as! Bool) {
var wholeImageData: AnyObject = picsArray.objectAtIndex(index)[0]
if wholeImageData.isKindOfClass(NSData) {
let wholeImage: UIImage = UIImage(data: wholeImageData as! NSData)!
if wholeImage.isKindOfClass(UIImage) {
NSLog("step 1 : image will be processed")
let processedImage = wholeImage
let inputImage = CIImage(image: processedImage)
var faceFeatures: [CIFaceFeature]!
if let orientation: AnyObject = inputImage.properties()?[kCGImagePropertyOrientation] {
faceFeatures = detector.featuresInImage(inputImage, options: [CIDetectorImageOrientation: orientation]) as! [CIFaceFeature]
} else {
faceFeatures = detector.featuresInImage(inputImage) as! [CIFaceFeature]
}
let inputImageSize = inputImage.extent().size
var transform = CGAffineTransformIdentity
transform = CGAffineTransformScale(transform, 1, -1)
transform = CGAffineTransformTranslate(transform, 0, -inputImageSize.height)
for faceFeature in faceFeatures {
NSLog("step 2 : face detected")
// ...
我一直在寻找解决方案三个小时,我很绝望:)。
任何建议将不胜感激!
提前致谢。
【问题讨论】:
-
图像的分辨率是否相同?我不确定 Apple 使用哪种算法,但多尺度检测可能是某些系统的问题。有没有试过把手机没检测到人脸的图片拉出来,放到模拟器里看看能不能用?
-
是的,它总是在模拟器上工作,即使是从 iPhone 的相机拍摄的照片
-
所以当你在手机上运行时,变量 faceFeatures 基本上返回一个空向量?
-
是的,如果我使用 iPhone 相机中的图片(它适用于网络上的图片)
-
不抱歉,但我刚刚注意到其他事情:如果我将相同的图片放入我的 images.assets 中(直接放入我的项目中),那么就会检测到人脸。所以我认为从照片库中挑选图片时会发生一些事情(使用 UIImagePickerController )