更新:苹果现在有一个
示例代码项目,可以完成其中的一些步骤。继续阅读需要自己解决的部分...
几乎所有你想要做的东西都已经存在了... 你只需要把它们组合起来就行了。
你可以通过定期轮询
ARSession
的
currentFrame
或者让它们推送到你的会话代理来获取
ARFrame
。(如果你正在构建自己的渲染器,那就是
ARSessionDelegate
; 如果你正在使用
ARSCNView
或
ARSKView
,它们的委托回调是指向视图的,所以你可以从那里返回到会话并获取导致回调的
currentFrame
。)
ARFrame
以
CVPixelBuffer
的形式提供当前
capturedImage
。
你可以使用
VNImageRequestHandler
或
VNSequenceRequestHandler
类中的方法,将图像传递给
Vision进行处理。这两个类都有一个接受
CVPixelBuffer
作为输入图像进行处理的方法。请注意,内容保留了HTML标签。
你可以在
WWDC17 Vision会议中找到将图像传递给Vision + Core ML的通用代码。如果您观看该会议,现场演示还包括将
CVPixelBuffer
传递给Vision。(在该演示中,他们从AVCapture获取像素缓冲区,但如果您从ARKit获取缓冲区,则Vision部分相同。)
您可能会遇到的一个难点是识别/定位对象。大多数人使用 Core ML + Vision 的“对象识别”模型(包括 Apple 在其
ML 开发者页面上提供的预转换版本)都是
场景分类器。也就是说,它们查看一张图片并说:“这是一张
(物品)的图片”,而不是像“这张图片中有一个
(物品),位于
(边界框)”这样的内容。
Vision 提供了易于处理分类器的 API — 您的请求结果数组将填充
VNClassificationObservation
对象,告诉您场景是什么(或者带有置信度评分的“可能是”)。
如果您发现或训练了一个既能识别又能定位物体的模型——
这一部分我必须强调,这取决于您——使用Vision将会产生
VNCoreMLFeatureValueObservation
对象。这些对象有点像任意键值对,因此如何从中识别一个对象取决于您如何构建和标记模型的输出。
如果您正在处理的是Vision已经知道如何识别的内容,而不是使用自己的模型——比如脸部和QR码——则可以使用Vision的API获取这些内容在图像帧中的位置。
如果您想在AR中显示与2D图像相关联的3D内容(或者显示2D内容,但将其放置在3D中使用ARKit),则需要对这些2D图像点进行
命中测试以便显示3D内容。一旦到达此步骤,使用命中测试放置AR内容已经在
Apple和
社区等其他地方有了很好的涵盖。
CVPixelBuffer
。祝你好运! - user7014451