jjzjj

swift - CIDepthBlurEffect : setting inputFocusRect

coder 2023-09-16 原文

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

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

我在单独的模糊函数中将其传递给 CIFilter。

filter?.setValue(imageTapCoordinates, forKey: "inputFocusRect")

但是坐标系似乎不匹配!确定“inputFocusRect”的最佳方法是什么? Apple 在他们的网站上没有太多关于此的文档...

谢谢!

最佳答案

由于长度和更好的格式,将此作为答案发布。

TL;DR;

最可能的问题似乎是这个过滤器需要两个(或更多)输入——一个输入图像和一个 CoreML 或(更有可能)面部识别的 Vision 框架输出。

我的想法是 inputFocusRect,一个 CIVector(原点在左下方的翻转坐标)是 CoreML 或 Vision 框架输出识别人脸的地方在更大的图像中。

解释:

CIDepthBlurEffect 是 iOS 11 或 macOS 10.3 中可用的新滤镜。事实上它太新了,Apple 还没有更新他们的 CI Filter Reference

我不得不倾倒我能找到的东西。这是相当简单的代码。创建过滤器的实例并打印出它的属性。

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

了解,有更好的方法可以做到这一点 - 查询设备的可用过滤器(所有或特定类别),使用特定属性来获取它们的显示名称,等等。我在这里的目的是为这个问题提供我能做的。 “转储”导致字典元素数组或 [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 个 CIImages、5 个 CIVectors、3 个 NSNumbers、1 个 NSDictionary,以及1 AVCameraCalibrationData

其中一些很容易破译……它们涉及相机、图像、图像元数据和面部组件。有些不那么重要——但也许更深入了解 Vision 框架的人了解更多。 (如果没有,也许那是个不错的地方!)

具体来说,我的问题是:

  • inputDisparityImage 到底是什么?
  • 如果 nil 或未找到 chi 位置,期望的各种输入面部特征是什么?

这不是许多 SO 标准的答案,如果投反对票,我会很乐意将其删除。但我想向您介绍如何了解过滤器的属性,并尝试提供帮助。

我对 CoreML 和 Vision 框架的了解很少。我已经涉足这两个领域并理解它们背后的概念 - 查看图像(或视频)并检测/识别某物的位置并且(通常)给出一个置信度。

由于面部特征的其他输入也是 CIVectors,我相信 inputFocusRect 是检测到整张脸的地方。 Vision 框架很容易将此类输出与此过滤器紧密集成,这是有道理的。

最后,我确实尝试了属性中的文档链接,但它是空的。

关于swift - CIDepthBlurEffect : setting inputFocusRect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47975130/

有关swift - CIDepthBlurEffect : setting inputFocusRect的更多相关文章

  1. swift - 将 json 编码时间转换为 nsdate - 2

    当我将time.Now()编码到JSON对象时,它给出的结果为"2009-11-10T23:00:00Z"但打印时间。现在给出2009-11-1023:00:00+0000UTC。他们为什么不同。什么是T和Z。另外,如何根据this将其转换为swiftNSDate对象?表? 最佳答案 这些值的含义无关紧要,它们是该格式(ISO8601)的一部分。有几种方法可以解决这个问题。一种是为时间或您的结构定义自定义MarshalJSON()方法并使用它来格式化日期,另一种是首先在您的结构中将其表示为字符串,以便当默认实现执行你得到你正在寻找的

  2. objective-c - 为什么 Swift 函数定义语法是多余的? - 2

    在C/C++/Java/Go中,我们使用,来分隔参数:(aint,bint)在ObjectiveC中,我们使用:来表示参数::(int)a:(int)b在Swift中,我们必须同时使用:和,:(a:int,b:int)是否需要冗余? 最佳答案 Swift可能有外部和内部参数名称:(externalinternal:Int)如果没有独特的分隔符,会产生很多歧义。 关于objective-c-为什么Swift函数定义语法是多余的?,我们在StackOverflow上找到一个类似的问题:

  3. swift - Swift 和 Go 之间的 Zlib 压缩 - 2

    我的Swift应用程序与用Go编写的服务器通信。我希望使用Zlib压缩传输的数据,但压缩结果似乎与Swift和Go不同。这是Go版本:sourceString:="A-t-ellebesoind'autrespreuves?Acceptez-lapourleplaisir.J'aitantfaitquedelacueillir,Etc'estpresqueunefleur-des-veuves."//Compressionvarbbytes.Bufferwriter:=zlib.NewWriter(&b)writer.Write([]byte(sourceString))writer.

  4. ios - swift api SecKeyCreateEncryptedData 使用的额外认证数据是什么? - 2

    我正在使用rsaEncryptionOAEPSHA256AESGCM在iOS上使用SecKeyCreateEncryptedData加密一些数据,然后在golang后端解密相同的数据。我正在使用3072位rsa公钥来加密对称key。当我从iOS获取数据到后端时,我能够成功解密对称key,但gcm标签验证失败。我使用的是与iOS相同的16字节IV,但不知道iOS在加密时是否使用任何aad(附加身份验证数据)。有谁知道rsaEncryptionOAEPSHA256AESGCMforiOS是否使用了一些aad?这适用于iOS10+。我已经尝试过使用nil、空的16字节数组、aeskey本身、

  5. json - 如何使用 iOS Swift 访问设备中的 vpn api url? - 2

    我使用swiftyJSON从apiurl消费OData。这里的apiurl与VPN连接。并且apiurl看起来像http://192.xxx.xx.xx:8000/sap/opu/odata/sap/Z_SRV/PRListSetSet?$format=json当我在模拟器中运行时,我可以从odataapiurl获取数据,但是在设备中运行时,没有从odataapiurl接收到数据。由于没有vpn连接到移动设备。我如何以编程方式对我的VPN进行硬编码以在移动设备中接收数据?这是我如何从ODataapiurl获取数据:typealiasServiceResponse=(JSON,Error

  6. xml - 使用 XML 解析 Swift 库时,Playgrounds 崩溃并显示 "unknown error" - 2

    我正在开发一个涉及一些XML解析的自定义框架,使用Kanna框架。每当我尝试将我的框架导入playground时,playground就会崩溃并出现以下错误:Playgroundexecutionfailed:expressionfailedtoparse,unknownerror*thread#1:tid=0x4e9448,0x00000001074bf360com.apple.dt.Xcode.PlaygroundStub-macosx`executePlayground,queue='com.apple.main-thread',stopreason=breakpoint1.1*

  7. swift - 在 Windows 10 上的 Ubuntu 上的 bash 上安装 swift 4 - 2

    我尝试在Windows10上的Ubuntu上的bash上安装Swift4我的Ubuntu版本:我@DESKTOP:~$lsb_release-a没有可用的LSB模块。经销商ID:Ubuntu描述:Ubuntu16.04.3LTS发布:16.04代号:xenial我做了apt-getupgrade和apt-getupdate我遵循Linux步骤here:安装Swift4最终我得到了错误:我@DESKTOP:~$swift/home/me/swift4/swift-4.0.2-RELEASE-ubuntu16.04/usr/bin/lldb:加载共享库时出错:libpython2.7.so

  8. iOS-Swift 音视频采集与文件写入 - 2

    概述音视频采集是直播架构的第一步音视频采集包括两部分视频采集音频采集iOS开发中,同音视频采集相关API都封装在AVFoundation中,导入该框架,即可实现音频、视频的同步采集采集步骤采集步骤文字描述导入框架同采集相关API在AVFoundation中,因此需要先导入框架创建捕捉会话(AVCaptureSession)会话:用于连接输入源、输出源输入源:摄像头、麦克风输出源:对应的视频、音频数据设置视频输入源、输出源输入源(AVCaptureDeviceInput):从摄像头输入(前置/后置)输出源(AVCaptureVideoDataOutput):可从代理方法中拿到数据将输入源、输出源

  9. Swift 周报 第十六期 - 2

    前言本期是Swift编辑组自主整理周报的第七期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。欢迎投稿或推荐内容。目前计划每两周周一发布,欢迎志同道合的朋友一起加入周报整理。当你来到双水村以外的大世界,你的人生目标便不单单是一名庄稼人了。Swift社区陪你一起成长,一起创造更多可能!👊👊👊周报精选新闻和社区:【挑战上岛】适配实时活动和灵动岛提案:函数反向部署Swift论坛:围绕Swift6lock展开的讨论推荐博文:推荐500+款AppUI设计工具推荐:妙言话题讨论:如果您年龄超过35岁被裁员,再入职时能接受降薪吗?新闻和社区挑战上岛:适配实时活动和灵动岛Apple大中华区设计与

  10. php - Swift Mailer 有问题不发送消息 - 2

    我的swiftmailer有问题,它没有向用户发送消息我将库提取到我网站的inc文件夹并创建了以下消息供swiftmailer发送:注意:如果您可以建议除SwiftMailer之外的其他解决方案,请发表评论。require_once'inc/lib/swift_required.php';//CreatetheTransport$transport=Swift_SmtpTransport::newInstance('mail.mywebsite.com',25)->setUsername('info@mywebsite.com')->setPassword('myPassword');

随机推荐