惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tor Project blog
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 【当耐特】
G
Google Developers Blog
J
Java Code Geeks
The Cloudflare Blog
Attack and Defense Labs
Attack and Defense Labs
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
Cisco Talos Blog
Cisco Talos Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
I
Intezer
Jina AI
Jina AI
T
Tenable Blog
P
Palo Alto Networks Blog
Project Zero
Project Zero
D
DataBreaches.Net
Hugging Face - Blog
Hugging Face - Blog
The Hacker News
The Hacker News
F
Full Disclosure
Cloudbric
Cloudbric
量子位
H
Heimdal Security Blog
K
Kaspersky official blog
有赞技术团队
有赞技术团队
罗磊的独立博客
V
Vulnerabilities – Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
Recent Announcements
Recent Announcements
WordPress大学
WordPress大学
GbyAI
GbyAI
S
SegmentFault 最新的问题
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
Recorded Future
Recorded Future
Security Archives - TechRepublic
Security Archives - TechRepublic
AI
AI
Webroot Blog
Webroot Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
The Exploit Database - CXSecurity.com
Apple Machine Learning Research
Apple Machine Learning Research
C
Cybersecurity and Infrastructure Security Agency CISA
H
Hacker News: Front Page
Latest news
Latest news

木土金王可

复盘 2024,年度好物分享 落地 第二十台相机:宝丽来(Polaroid)Impulse AF 第十九台相机:哈苏(Hasselblad)X1D II 第十八台相机:宝丽来(Polaroid)Macro 5 SLR 第十七台相机:康泰时(Contax)S2 稻荷山 Dave Chappelle: The Closer 语言是思想的边界 对街头卖惨表演的看法 《民主森林》 电梯英雄 2023,年度好物分享 《大画幅 4x5》复活 新加坡华侨银行(OCBC)开户指南 第十六台相机:宾得(Pentax)PC35AF-M SEDATE 第十五台相机:沙慕尼(Chamonix)4x5 F2 Xbox 连接 Studio Display Twitter、Apple、Meta 和 Reddit 广告平台使用体验 第十四台相机:康泰时(Contax)S2 你到底什么时候买相机 拍摄胶片的理由 HomePod 不能作为 Mac 音响 男性生来就是残缺的女性 第十三台相机:柯尼卡(Konica)Big Mini 301 三年,十二台相机 恐怖片很好看啊 比残忍更残忍 用 SwiftUI 重构「行动日」 推荐《女生呵护指南》 你是左派还是右派? 驯服内心的猛犸象:为什么你应该停止关心别人对你的想法 想写点什么,但又不知道该写什么 摄影构图 精致的结婚照 中文没死,是有的人死了 上海爆发 COVID-19 疫情以来我收藏的文章(持续更新) 自我审查 25 美元,成为美国计算机学会(ACM)会员 当我们谈论离屏渲染时,我们在谈论什么 如何让 iOS 给你的应用开后门 二零一九年夏秋之交工作生活的异动 一声一世 iOS 限制输入字数与特殊字符的巧妙方法 对于番茄学习法的误解 Swift 中的空字符串 我如何自学 iOS 开发 为什么我不喜欢社交网络 如何与人见面 为什么我不喜欢即时通讯 以配置信息(UserDefaults)的形式存储应用数据 在文件沙盒中读取与写入应用数据 在 iOS 开发中使用键值对监听(KVO)与通知(Notification) 介绍 GCD 中的线程,队列,延迟执行,线程阻断,信号量,任务组与任务对象 iOS 原生 URLSession 网络请求 什么是自动引用计数(ARC)和引用循环 在 iOS 开发中使用代理与协议 独立开发的第一个应用:行动日 为什么我会把 Google Pixel 换成 iPhone SE? 手动进行 Nexus 和 Pixel 系列手机的 OTA 更新 开启 Chromebook 的夜间模式
将同事送我的仙人掌转换成 3D 模型
kinnouka bokudo · 2021-07-24 · via 木土金王可

2021 WWDC,Apple 在 RealityKit 框架下引入了新 API:PhotogrammetrySession,通过这个 API,可以从不同角度拍摄物体,并且基于这些相片,生成一个可以用于 AR/VR 显示的 3D 模型。

最近我也收到一个来自同事的礼物,她家的仙人掌掉落下来的小仙人掌。于是我萌生了这个将仙人掌转换成 3D 模型的想法。

开始,拍照

Apple 对于这个新 API 提供了非常多的相关代码和文章。其中包括用于拍摄的应用的 源代码

通过 Xcode 将这段源代码编译使其应用运行在 iPhone 上,可以对前期拍摄起到非常大的帮助作用。这个应用的主要功能是每隔一段时间自动拍摄一张相片,并且会记录相片的景深信息(注:必须使用至少拥有两个镜头的 iPhone 才可以使用这个应用,因为至少两个镜头才可以支持记录景深信息)。

在这个应用自动帮助我们拍摄的同时,我们只需要围绕着物体,缓慢移动镜头,完整的记录物体各个角度下的样子。关于拍照还有很多注意事项,比如最好拍摄 20 至 200 张相片,当前拍摄的物体的相片与上一张相片最好有 70% 以上的重合度,尽量在光线均匀的环境下拍摄,不要拍摄透明或者强烈反光的物体之类的。更多详细注意事项可以看《Capturing Photographs for RealityKit Object Capture》。

下图分别是 Apple 官方推荐的拍摄场景和我的拍摄场景。

Apple 官方将物体放在一个会旋转的平台上,并且用上文中提及的应用自动拍照。我将仙人掌放在一个普通的凳子上,然后右手举着相机,尽可能保持不动,左手从底部托着等凳子,缓慢的手动旋转。

拍摄完成之后将相片导入 Mac,然后就开始处理这些相片了。

Show Me the Code

这里需要用到 Apple 提供的另一段相关的 源代码,这段代码将在 Mac 运行,通过调用本文的主角 API PhotogrammetrySession,在 Mac 上将所拍摄的物体生成为 3D 模型。

在开始使用 PhotogrammetrySession 之前,需要先创建一个 PhotogrammetrySession.Request,这个 request 需要指定两个参数:URLPhotogrammetrySession.Request.Detail。他们分别表示最终输出 3D 模型的绝对地址和 3D 模型的精细程度,地址必须以 .usdz 后缀结尾,因为这是 3D 模型的格式名字,而精细程度则会影响 3D 模型的大小。

有了这个 request 之后就可以创建 PhotogrammetrySession,在创建这个 session 时,也需要一个 URL 参数,用来表示用于生成 3D 模型的图片所在文件夹的绝对地址:

let outputUrl = URL(fileURLWithPath: "/Users/jake/Downloads/Cactus.usdz")
var request = PhotogrammetrySession.Request.modelFile(url: outputUrl, detail: .full)

let inputFolderUrl = URL(fileURLWithPath: "/Users/jake/Downloads/Cactus Images")
guard let session = try PhotogrammetrySession(input: inputFolderUrl) else { return }

在创建 session 时还可以加入 PhotogrammetrySession.Configuration 参数:

let config = Configuration()
config.featureSensitivity = .high
config.sampleOrdering = .sequential
config.isObjectMaskingEnabled = true

guard let session = try PhotogrammetrySession(input: inputFolderUrl, configuration:config) else { return }

其中 featureSensitivity 表示处理模型时的细致程度,sampleOrdering 表示模型的相片是否连续,可以用于提高处理速度,isObjectMaskingEnabled 好像表示是否将模型与模型所在的背景区隔开,应该也可以提高处理速度。但在我实际使用中,我发现这几个参数无论如何调整似乎都没什么差别,也有可能是因为这个 API 还处于测试版的原因。

最后调用 sessionprocess(requests: [PhotogrammetrySession.Request]) 方法,然后等待制作完成就可以啦。这里可以一次性处理多个 requset,就可以同时生成多个模型,节约时间。

session.process(requests: [request])

async {
    do {
        for try await output in session.outputs {
            switch output {
                case .processingComplete:

                case .requestError(let request, let error):

                case .requestComplete(let request, let result):

                case .requestProgress(let request, let fractionComplete):

...

十几分钟之后

最后得到的模型在 Mac 上显示如下:

我用 iPhone 12 mini 一共给这个仙人掌拍了一百多张相片,使用的电脑是 2020 款 M1 芯片最低配金色 MacBook Air,按照 Apple 官方的说法,使用英特尔芯片的 MacBook 处理速度会更慢。我试着生成了好几种不同精度的模型,发现处理速度只跟相片数量有关,相片数量越多,处理时间越长,与模型精细程度等无关。

也许用带激光雷达的 iPhone 或者 iPad 拍摄相片,制作出来的 3D 模型效果会更好。

最后

在得到仙人掌的 3D 模型之后,通过使用 QLPreviewController 就可以很方便的在手机上显示出来:

override func viewDidAppear(_ animated: Bool) {
    let previewController = QLPreviewController()
    previewController.dataSource = self
    present(previewController, animated: true, completion: nil)
}

func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
    return 1
}

func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
    guard let path = Bundle.main.path(forResource: "Cactus", ofType: "usdz") else {
        fatalError("Couldn't find the supported input file.")
    }

    let url = URL(fileURLWithPath: path)
    return url as QLPreviewItem
}

效果如图所示:

看起来还不错,但 Apple 官方的样例才是惊为天人,可以从「AR Quick Look」下载并使用 Apple 官方模型。

2021 年 7 月 24 日