草庐IT

ios - 难以从 iPhone X 上的 2D 区域获取面部特征点的深度(SceneKit/ARKit 应用程序)

coder 2024-01-17 原文

我正在使用 iPhone X 上的前置摄像头运行面部标志检测,并且非常努力地尝试获取面部标志的 3D 点(VNFaceLandmarkRegion2D 仅提供图像坐标 X、Y)。

我一直在尝试使用 ARSCNView.hitTestARFrame.hitTest,但到目前为止都没有成功。我认为我的错误可能在于将初始地标点转换为正确的坐标系。我已经尝试了很多排列组合,但目前根据我的研究,这是我想出的:

let point = CGPoint(x: landmarkPt.x * faceBounds.width + faceBounds.origin.x, y: (1.0 - landmarkPt.y) * faceBounds.height + faceBounds.origin.y)
let screenPoint = CGPoint(point.x * view.bounds.width, point.y * view.bounds.height)
frame.hitTest(screenPoint, types: ARHitTestResult.ResultType.featurePoint)

我也试过

let newPoint = CGPoint(x: point.x, y: 1.0 - point.y) 

转换后,但似乎没有任何效果。我的 frame.hitTest 结果总是空的。我在转换中遗漏了什么吗?

前置摄像头是否为此增加了另一个层次? (我还尝试在某一点反转初始 X 值,以防坐标系被镜像)。在我看来,初始地标 normalizedPoints 有时为负,有时也大于 1.0,这对我来说没有任何意义。我正在使用 ARSession.currentFrame?.capturedImage 捕捉前置摄像头的画面,如果这很重要的话。

非常非常感谢任何帮助,非常感谢!

-- 已解决 --

对于任何有类似问题的人: 我终于得到了 HitTest 结果!

for point in observation.landmarks?.allPoints?.pointsInImage(imageSize: sceneView.bounds.size) {
    let result = ARSCNView.hitTest(point, options: [ARSCNHitTestOption.rootNode: faceNode)
}

我使用面部几何体作为附加到面部节点的遮挡节点。

谢谢 Rickster!

最佳答案

您正在使用 ARFaceTrackingConfiguration,对吗?在这种情况下,featurePoint HitTest 类型将无济于事,因为特征点是世界跟踪的一部分,而不是面部跟踪……事实上,几乎所有 ARKit HitTest 机制专门用于世界跟踪,对面部跟踪没有用。

您可以改为使用面部网格 (ARFaceGeometry) 和面部姿势跟踪 (ARFaceAnchor) 从 2D 图像点到3D 世界空间(或相机空间)点。为此,您至少可以走几条路:

  1. 如果您已经在使用 SceneKit,则可以使用 SceneKit 的 HitTest 而不是 ARKit。 (也就是说,您正在针对 SceneKit 中建模的“虚拟”几何体进行测试,而不是针对 ARKit 建模的真实世界环境的稀疏估计进行测试。在这种情况下,面部网格的“虚拟”几何体通过ARKit。)也就是说,你想要ARSCNView.hitTest(_:options:) (继承自 SCNSceneRenderer),而不是 hitTest(_:types:)。当然,这意味着您需要使用 ARSCNFaceGeometry 来可视化场景中的面部网格,并使用 ARSCNView 的节点/ anchor 映射来跟踪面部姿势(尽管如果您希望视频图像显示出来,您可以使网格透明)——否则 SceneKit HitTest 将找不到任何 SceneKit 几何体。

  2. 如果您没有使用 SceneKit,或者由于某种原因无法将面部网格放入您的场景中,您拥有重建针对面部网格的 HitTest 所需的所有信息。 ARCamera 有 View 和投影矩阵,告诉您 2D 屏幕投影与 3D 世界空间的关系,ARFaceAnchor 告诉您人脸在世界空间中的位置, ARFaceGeometry 告诉你每个点在脸上的位置——所以它只是一个 bunch of math从屏幕点到面网格点,反之亦然。

关于ios - 难以从 iPhone X 上的 2D 区域获取面部特征点的深度(SceneKit/ARKit 应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48155766/

有关ios - 难以从 iPhone X 上的 2D 区域获取面部特征点的深度(SceneKit/ARKit 应用程序)的更多相关文章

  1. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  2. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  3. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  4. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  5. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  6. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  7. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

    我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

  9. ruby-on-rails - 缺失区域;使用 :region option or export region name to ENV ['AWS_REGION' ] - 2

    我知道还有其他相同的问题,但他们没有解决我的问题。我不断收到错误:Aws::Errors::MissingRegionErrorinBooksController#create,缺少区域;使用:region选项或将区域名称导出到ENV['AWS_REGION']。但是,这是我的配置开发.rb:config.paperclip_defaults={storage::s3,s3_host_name:"s3-us-west-2.amazonaws.com",s3_credentials:{bucket:ENV['AWS_BUCKET'],access_key_id:ENV['AWS_ACCE

  10. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

随机推荐