在使用CoreImage框架时,模拟器可以检测到人脸,但iPhone设备却不能检测到。

13

我正在使用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")
                            // ...

我已经寻找解决方案三个小时了,现在感到非常绝望:)。

非常感谢任何建议!

提前致谢。


愚蠢的问题——模拟器和你的手机是否运行相同的目标操作系统? - ABC
我在iOS 8上遇到了同样的问题,而且在iOS 9上仍然存在。 - Randy
我有几个猜测从哪里开始。可能是因为模拟器和手机上的核心图像转换出现了某些不同。如果它们运行相同的操作系统,那么为什么会发生这种情况就不太合理了。另一个可能性是,当面部检测在两个系统上运行时,算法会以某种方式不同。你所描述的戴着面具并且光线充足的情况似乎意味着它正在使用Haar级联过滤器,这可能有点棘手。但这也似乎有些可疑,这让我再次想到两个系统上的图像可能有所不同。 - ABC
有一件事我完全忘了提,非常抱歉,因为它很重要: 我使用opencv框架遇到了完全相同的问题。 - Randy
1
不好意思,但我刚刚注意到另一件事: 如果我把相同的图片放在我的图像资源中(直接放入我的项目中),那么人脸就会被检测到。因此,我认为当从照片库中选择图片(使用UIImagePickerController)时,会发生某些情况。 - Randy
显示剩余6条评论
1个回答

4
我找到了一个非常奇怪的方法来解决我的问题。
当选择图片时,通过将UIImagePickerController()allowsEditing属性设置为true,一切都正常工作...我不明白为什么,但它确实有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接