Unity3D 和 OpenCV 集成并相互传递相机帧

Unity3D and OpenCV integration and passing each other camera frames

背景:

我一直在使用 Unity3D 和 OpenCV 进行 AR 项目。集成已通过以下方式完成。

我们的 OpenCV 程序和 OpenCV 库本身编译成一个动态库(so 文件 Linux)。 (OpenCV 库静态链接)

然后,在 Unity3D 中,我们在 C# 脚本中导入它 (DllImport) 并使用它的功能。

到目前为止一切看起来都很清楚,但问题在于:两个部分(Unity3D 和 OpenCV)都需要相机的每一帧,因此有多种方法可以为它们提供相机帧:

  1. Unity3D 读取帧(WebCamTexture)并通过转换为三个二维数组并传递给 OpenCV 部分来发送它们。 (这样OpenCV部分就无法访问camera)

  2. OpenCV 部分读取帧 (VideoCapture::open) 并发送回 Unity3D。 (这样Unity3D是无法访问camera的)

  3. 双方均允许开启相机

请注意,主要处理是在 OpenCV 部分完成的,Unity3D 只需要帧来显示相机预览。

问题:

一切都与性能有关!哪种方法是性能最好的方法,也是最佳实践的观点?

在性能方面,您应该使用 #2 或制作您自己的直接访问相机的插件。

您的 #1 选项和 WebCamTexture 是最简单的方法,但最大的问题是它没有提供足够的帧来执行视频处理。

此外,WebCamTexture 对图像大小有限制,它可以在 iOS 和 Android 上 return,这意味着您获得的图像质量不会与设备可以提供的相同。因此提供来自相机的低质量图像。大多数视频处理 API 例如 Vuforia 使用他们自己的原生 API 来接收帧,你也应该这样做。

WebCamTexture 不适合这个。