我无法找到从触摸点设置“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框架很容易将这些输出与这个过滤器紧密集成。最后,我尝试了属性中的文档链接,结果发现它是空的。