【问题标题】:GPUImage: synchronization of 2 branch chainsGPUImage:2个分支链的同步
【发布时间】:2014-03-24 20:30:23
【问题描述】:

我正在开发一个图像拼接应用程序,该应用程序从相机获取输入,估计图像变换并通过估计的变换扭曲输入图像。如下图所示,来自相机的图像被输入到链的 2 个分支中。然而,图像变形的处理依赖于变换估计的结果。我的问题是如何让分支 1 等待分支 2 的结果?

【问题讨论】:

    标签: ios opengl-es opengl-es-2.0 gpuimage chain


    【解决方案1】:

    如果您将图像变形过滤器设为 GPUImageTwoInputFilter 的子类,则会为您处理此同步。

    将 GPUImageVideoCamera 实例定位到您的特征匹配/变换估计过滤器和图像扭曲过滤器,然后将您的特征匹配/变换估计过滤器定位到图像扭曲过滤器。这将导致您的视频输入通过第一个输入图像进入,并且您的特征匹配和变换估计过滤器的结果将出现在第二个图像中。 GPUImageTwoInputFilter 子类仅在将输入帧都提供给它们的输入后处理和输出帧。

    这应该会为您提供所需的同步,并且设置起来非常简单。

    【讨论】:

    • 谢谢你,布拉德。问题是特征匹配/转换估计不是真正的过滤器,而是 CPU 处理。结果是一个 3x3 的单应矩阵,需要输入到图像变形中。我目前的解决方案是在 3x3 矩阵准备好时从 GPUImageVideoCamera.textureForOutput 初始化一个 GPUImageTextureInput。然后添加图像变形滤镜作为 GPUImageTextureInput 的目标。您认为这种方式可行吗?我还没有测试过代码。
    • @user3348157 - 如果您使用 GPUImageRawDataInput 输入您的单应矩阵,它将以相同的方式运行。双输入过滤器将一直等待,直到它有两个输入帧才起作用,如果它来自 CPU 密集型处理,您可以通过原始数据输入提供该帧数据。
    • 正如我从您的 FilterShowcase 示例中了解到的,如果 GPUImageTwoInputFilter 将 GPUImageVideoCamera 和 GPUImagePicture 作为输入,则 GPUImagePicture 只需调用 [GPUImagePicture processImage] 一次即可解除阻塞 GPUImageVideoCamera 循环。根据您的建议, GPUImageRawDataInput 具有不同的行为。我需要在循环的每次迭代中调用 [GPUImageRawDataInput processData] 来解锁 GPUImageVideoCamera。我说的对吗?
    • @user3348157 - 嗯,是的,原始数据输入也使用了不确定的时间戳,这导致双输入过滤器在运行之前不等待它提供新帧。 -processData 可能会扩展到 -processDataForTimestamp: 以允许这样做并启用正确的同步。您只需输入从原始数据输出中获得的时间戳或触发 CPU 端处理的任何内容。
    • 这在我向 GPUImageRawDataInput 添加了一个 -processDataForTimestamp 并在每次我需要触发图像扭曲过滤器时将有效的 CMTime 传递给它之后工作。谢谢,布拉德。
    【解决方案2】:

    我认为,您可以尝试使用 dispatch_semaphore_there

    【讨论】:

      猜你喜欢
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多