CIDetector要么不检测,要么在奇怪的地方检测

时间:2015-12-12 20:41:53

标签: ios swift image-recognition cidetector

我正在练习使用一些swift 2并且在使用CIDetector时遇到了一些困难。

我有一个应用程序,其中包含一系列图片;三个不同的矩形和三个不同的人/组照片。我只是在这些图像上尝试CIDetector来查看识别的内容。我所获得的最大成功就是面部 - 然而它所识别的面孔在图像上非常奇怪。

这是我测试过的矩形图像及其输出: Rectangle Test

这是一张脸部图片: enter image description here

这是我的检测代码:

    ///does the detecting of features
        func detectFeatures() -> [CIFeature]? {

            print("detecting")

            let detectorOptions: [String: AnyObject] = [CIDetectorAccuracy: CIDetectorAccuracyHigh, CIDetectorImageOrientation: 6]
            var detectorType    : String

            switch currentPhoto.currentType {
            case .RECTANGLES:
                detectorType = CIDetectorTypeRectangle
            case .FACES:
                detectorType = CIDetectorTypeFace
            default:
                print("error in phototype")
                return nil

            }

            let detector = CIDetector(ofType: detectorType, context: nil, options: detectorOptions)
            let image = CIImage(image: imageViewer.image!)

            guard image != nil else{
                print("image not cast to CIImage")
                return nil
            }

            return detector.featuresInImage(image!)
        }

添加星星的地方:

for f in features!{
            print(f.bounds.origin)
            imageViewer.layer.addSublayer(createMarker(f.bounds.size, location: f.bounds.origin))
        }

以及星星的创建地点:

///Creates a star on a layer and puts it over the point passed in
    func createMarker(size: CGSize, location: CGPoint) -> CALayer{

        print("The marker will be at [\(location.x),\(location.y)]")
        //doesn't appear in correct place on the screen
        let newLayer = CALayer()
        newLayer.bounds = imageViewer.bounds
        newLayer.frame = CGRect(origin: location, size: size)
        newLayer.contents = UIImage(named: "star")?.CGImage
        newLayer.backgroundColor = UIColor(colorLiteralRed: 0.0, green: 0.0, blue: 0.0, alpha: 0.0).CGColor
        newLayer.masksToBounds = false

        return newLayer
    }

有没有人遇到过这样的事情?

1 个答案:

答案 0 :(得分:0)

不幸的是,我不认为您使用的矩形与您正在使用的图像兼容。如果你看一下它的CIDetector Class Reference

  

CIDetectorTypeRectangle搜索矩形区域的检测器   在静止图像或视频中,返回CIRectangleFeature对象   提供有关检测到的区域的信息。

     

矩形检测器找到可能代表的区域   在图像中以透视方式出现的矩形对象,例如   在桌面上看到的论文或书籍。

根据这个建议,我在此图片上运行了您的代码:enter image description here

结果:

  

bounds =“(296.752716064453,74.7079086303711,181.281158447266,   253.205474853516)\ n“个

我在没有找到任何功能的其他计划矩形上运行您的代码。需要有点“真实世界”的形象。