在Web服务器上使用扭曲的三角形绘制图像

7

场景

我当前项目的 Flash 前端生成图像,需要一个 web 服务器将其组合成视频。帧率和帧分辨率都足够大,无法发送图像序列到后端(时间和客户端带宽都不够)。相反,我们也在尝试在后端重新创建图像绘制。

正确且缓慢,或者错误且快速

问题是这涉及相当多的纹理三角形绘制,而我们在 Python 中找到的两个解决方案(这里那里)效率太低,每帧需要约 60 秒,从而为 30 秒的剪辑处理时间高达 7.5 小时。不能接受。

使用 PHP 模块向 ImageMagick 发送命令进行图像操作时,整个过程非常快(每帧几十分之一秒),但 ImageMagick 似乎无法像前端那样绘制三角形,因此最终结果不匹配。不能接受。

我在这里问的是,是否有人知道一种解决此问题的方法,无论如何都可以在 web 服务器上运行。

图像扭曲

让我解释一下前端的过程:

  1. 对图像中的点执行 Delaunay 计算,以获得均匀分布的三角形网格。
  2. 偏移网格中的点/顶点,扭曲或扭曲图像。
  3. 绘制扭曲的三角形到新位图上。

左侧为原始图像,右侧为扭曲图像

我们可以将步骤 1 和 2 的结果(坐标)发送到后端,然后绘制扭曲的三角形并将其保存为磁盘上的图像(或附加为视频的一帧)。但是我需要帮助的最后一步就是这个。

问题

是否有 ImageMagick 的替代方案可以在位图中绘制三角形? 是否有其他库(例如 C 库)能够使我们做到这一点? 或者我们是否可以通过切换后端技术(例如 Ruby)更轻松地实现此效果?(.Net 和 Java 目前不是真正的选项)

非常感谢。EP。

P.S. 我会感激重新标记的努力,我不太知道该给这个问题打上什么标签。谢谢!


也许我没有完全理解你想做什么。你能描述一下从客户端到服务器这个系统是做什么的吗?或者它应该做什么? - Darknight
服务器将接收A)源图像,B)UV点列表,C)组成三角网格的UV索引列表。最后,D)是与原始UV位置不同的点列表,当正确绘制时会产生扭曲的图像/帧。最终将有许多这些列表,每个帧都有一个,但只需让服务器绘制一张图像即可开始。 - epologee
简而言之,@Darknight,我想让服务器绘制像我的示例图像中右侧的椅子一样的图像。 - epologee
让我们在聊天室里继续这个讨论。 - epologee
1
没有解决方案,只有建议:如果您在右侧图像中突出显示修改后的三角形,一眼就能看清您所尝试实现的内容。 - Micros
显示剩余4条评论
2个回答

0

在两端使用相同的技术将为您带来最一致的结果,并且更容易保持算法同步。如果您使用画布,您也可以在服务器上使用node.js的nodecanvas进行图像生成,方法与客户端相同。(不必全部切换。您只需运行扭曲服务器进程即可)

https://github.com/LearnBoost/node-canvas


0

Opencv 是一个 C 库,支持许多类型的图像变形和合成。


嗨Eric,感谢您的发布。我们确实在上周通过使用OpenCV编写自己的C应用程序来解决了这个问题。它以480p分辨率渲染图像帧,在500毫秒内完成,这对于我们的目的已经足够了。 - epologee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接