我刚刚开始在 Android 上查看 ARToolkit,我看到的示例依赖于识别来自设备摄像头的视频流中的标记。
是否有可以使用图像(例如包含二维条形码标记的普通 JPG 文件)的示例?或者有没有办法在标记出现时暂停视频流或抓取单帧?
我意识到这听起来可能很奇怪,但我对一个特定的用例感兴趣。
在除Android之外的所有平台上,您都可以使用“图像”视频输入模块。这是一个替代视频捕获模块,它只循环一个或多个 JPEG 图像。您可以通过将视频配置字符串更改为以下内容来请求此视频模块:
-device=Image -image="/path/to/image0.jpeg" -image="/path/to/image1.jpeg"
在 Android 上,如果您正在为 Android 应用程序构建 Java ARToolKit,一种可能的替代方法是在 Java 环境中自己加载图像并将该图像推送到本机跟踪例程,而不是从相机流中推送图像。最简单的拦截图片推送的地方就是ARBaseLib/src/org/artoolkit/ar/base/ARToolKit.java的convertAndDetect()方法。arwAcceptVideoImage 的“frame”参数是一个指向 NV12 编码视频帧的指针。
如果您在 Android 上使用 ARToolKit for Unity,同样的建议也适用,只是 arwAcceptVideoImage 调用的位置不同。相反,它位于文件 org/artoolkit/ar/unity/CameraSurface 的方法 onPreviewFrame 中的 UnityARPlayer 类中。
抱歉,我无法推荐更简单的方法... Android 的 ARToolKit 并没有真正为视频流源提供很大的灵活性。
是的,我已经做到了。
如果您会看到它的流程,则将相机帧作为字节数组抓取,并将该数组发送到呈现器类,呈现为背景图像,标记检测部分检测标记并生成转换矩阵。
因此,您可以做的是将图像读取为位图并将其更改为相同格式的数组(作为抓取的帧),然后输入该数组以用于渲染和检测部分。
如果您想在一帧暂停视频,您可以复制输入图像数组的该实例,然后仅将该数组连续馈送到渲染和检测部分。
或拦截 cameraPreviewFrame(final byte[] data) 并使用正确格式的位图加载数据数组。