我无法找到从触摸点设置“inputfoccusrect”值的正确方法。
我用

@IBAction func imageTapped(_ sender: UITapGestureRecognizer) {
    var touchPoint = sender.location(in: self.imageView)
    imageTapCoordinates = CIVector(cgPoint: touchPoint)

我用一个单独的模糊函数把它传递给cifilter。
filter?.setValue(imageTapCoordinates, forKey: "inputFocusRect")

然而,似乎坐标系不匹配!确定“输入焦点”的最佳方法是什么?苹果在他们的网站上没有太多的文档…
谢谢!

最佳答案

由于篇幅和更好的格式,将此作为答案发布。
TL;DR;
最有可能的问题似乎是,这个过滤器期望两个(或更多)输入-一个输入图像和一个coreml或(更可能)一个面部识别的视觉框架输出。
我的想法是,inputFocusRect,aCIVector(在原点位于左下角的翻转坐标中)是coreml或vision framework输出识别较大图像中的面的位置。
说明:
CIDepthBlurEffect是iOS 11或MacOS 10.3中提供的新过滤器。事实上,它是如此的新,苹果还没有为它更新他们的CI Filter Reference
我不得不放弃我能找到的东西。这是相当简单的代码。创建过滤器的实例并打印出它的属性。

let filter = CIFilter(name: "CIDepthBlurEffect")
print(filter?.attributes)

要知道,有更好的方法可以做到这一点:查询设备中的可用过滤器(全部或特定类别),使用特定属性获取其显示名称,等等。我在这里的目的是为这个问题提供我所能提供的。“dump”会产生一个字典元素数组或[String:Any]并且在这里是未格式化的。手动格式化会产生以下结果:
[
    "inputRightEyePositions": {
        CIAttributeClass = CIVector;
        CIAttributeDisplayName = "Right Eye Positions";
        CIAttributeType = CIAttributeTypePosition;
    },
    "inputCalibrationData": {
        CIAttributeClass = AVCameraCalibrationData;
        CIAttributeDisplayName = CalibrationData;
    },
    "inputImage": {
        CIAttributeClass = CIImage;
        CIAttributeDescription = "The image to use as an input image. For filters that also use a background image, this is the foreground image.";
        CIAttributeDisplayName = Image;
        CIAttributeType = CIAttributeTypeImage;
    },
    "inputChinPositions": {
        CIAttributeClass = CIVector;
        CIAttributeDisplayName = "Chin Positions";
        CIAttributeType = CIAttributeTypePosition;
    },
    "inputLeftEyePositions": {
        CIAttributeClass = CIVector;
        CIAttributeDisplayName = "Left Eye Positions";
        CIAttributeType = CIAttributeTypePosition;
    },
    "inputAuxDataMetadata": {
        CIAttributeClass = NSDictionary;
        CIAttributeDisplayName = AuxDataMetadata;
    },
    "CIAttributeFilterAvailable_Mac": 10.13,
    "CIAttributeFilterName": CIDepthBlurEffect,
    "CIAttributeReferenceDocumentation": http://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIDepthBlurEffect,
    "inputAperture": {
        CIAttributeClass = NSNumber;
        CIAttributeDefault = 0;
        CIAttributeDisplayName = Aperture;
        CIAttributeMax = 22;
        CIAttributeMin = 0;
        CIAttributeSliderMax = 22;
        CIAttributeSliderMin = 1;
        CIAttributeType = CIAttributeTypeScalar;
    },
    "CIAttributeFilterDisplayName": Depth Blur Effect,
    "CIAttributeFilterAvailable_iOS": 11,
    "inputNosePositions": {
        CIAttributeClass = CIVector;
        CIAttributeDisplayName = "Nose Positions";
        CIAttributeType = CIAttributeTypePosition;
    },
    "inputLumaNoiseScale": {
        CIAttributeClass = NSNumber;
        CIAttributeDefault = 0;
        CIAttributeDisplayName = "Luma Noise Scale";
        CIAttributeMax = "0.1";
        CIAttributeMin = 0;
        CIAttributeSliderMax = "0.1";
        CIAttributeSliderMin = 0;
        CIAttributeType = CIAttributeTypeScalar;
    },
    "inputScaleFactor": {
        CIAttributeClass = NSNumber;
        CIAttributeDefault = 1;
        CIAttributeDisplayName = "Scale Factor";
        CIAttributeSliderMax = 1;
        CIAttributeSliderMin = 0;
        CIAttributeType = CIAttributeTypeScalar;
    },
    "inputFocusRect": {
        CIAttributeClass = CIVector;
        CIAttributeDisplayName = "Focus Rectangle";
        CIAttributeIdentity = "[-8.98847e+307 -8.98847e+307 1.79769e+308 1.79769e+308]";
        CIAttributeType = CIAttributeTypeRectangle;
    },
    "inputDisparityImage": {
        CIAttributeClass = CIImage;
        CIAttributeDisplayName = DisparityImage;
    },
    "CIAttributeFilterCategories": <__NSArrayI 0x1c46588a0>(
        CICategoryBlur,
        CICategoryVideo,
        CICategoryStillImage,
        CICategoryBuiltIn
    )

我统计了12个可能的输入-2个、5个、3个、1个和1个。
其中一些很容易破译…它们处理相机、图像、图像元数据和面部组件。有些人不那么了解,但也许更深入地了解愿景框架的人了解更多。(如果没有,也许那是个好地方!)
具体来说,我的问题是:
CIImages到底是什么?
如果未找到CIVectors或chi位置,则需要哪些不同的输入面部特征?
这不是很多标准的答案,如果投了反对票,我会很高兴地删除它。但是我想给你一个关于如何获取过滤器属性的概念,并尝试提供帮助。
我对coreml和vision框架的了解很少。我涉猎过这两个概念,一个是理解它们背后的概念——看一个图像(或视频),然后检测/识别某个东西在哪里,通常给出一个信心因素。
由于面部特征的其他输入也是NSNumbers,我认为NSDictionary是一个检测到整个面部的点。有意义的是,vision框架很容易将这些输出与这个过滤器紧密集成。
最后,我尝试了属性中的文档链接,结果发现它是空的。

10-08 18:18