0

我正在玩游戏。

游戏要求实体分析图像并朝着具有特定属性(高红色通道等)的像素前进

我研究过 Pixel Bender,但这似乎只对向图像写入新颜色有用。目前,即使在低分辨率 (200x200) 下,只有一个实体扫描图像会减慢到 1-2 帧/秒。

我正在嵌入图像并将其作为位图实例化为舞台的子级。1-2 FPS 的情况是使用 BitmapData.getPixel() (在每个像素上)预先计算距离。

我想知道是否有任何方法可以更有效地做到这一点......我的第一个想法是某种空间分区以及将图像分成许多较小的部分。

我也觉得 Pixel Bender 应该能够以某种方式提供帮助,但是我对此几乎没有经验。

为任何帮助而欢呼。乔纳森

4

3 回答 3

2

让我们将实体朝向“吸引子”的像素称为“吸引子”,因为它们吸引了实体。

您描述了由于扫描吸引子而导致的低帧速率。这表明您可能在每一帧都扫描图像。您无需指定扫描的图像是静态的还是像视频输入那样频繁变化的。如果图像每帧都在变化,因此您必须以某种方式重新计算吸引子,那么您正在尝试使用 ABC 虚拟机进行实时计算机视觉,请参见下文。

如果您有一张不变的图像,那么您可以进行的最重要的优化是只扫描一次图像,然后保存吸引子位置的摘要(或“记忆”)。在每个渲染帧,您可以搜索已知吸引子的列表或数组,而不是扫描整个图像。当用户使图像发生变化时,您可以从头开始重新计算,或者逐步更新您的计算——只要您认为合适。

如果您尝试使用 ActionScript 3 进行实时计算机视觉,我建议您查看新vector类型的 Flash 10.1,并且您也可以考虑使用abcsx编写 ABC 汇编代码,或者使用Adob​​e 的 Alchemy将 C 编译到闪存运行时。ABC是Flash的字节码。换句话说,重新考虑将 AS3 用于实时计算机视觉。

于 2010-06-03T03:05:16.700 回答
0

BitmapData 有一个getPixels方法(注意它是复数形式)。它返回一个包含所有像素的字节数组,该数组的迭代速度比 for 循环快得多,其中调用 getPixel 并嵌套在另一个 for 循环中。不幸的是,字节数组,顾名思义,是一维字节数组,因此迭代每个像素(4 个字节)需要使用 for 循环,而不是 foreach 循环。默认情况下,您可以单独访问每个像素的颜色通道,但这听起来像您想要的(查找具有“高红色通道”的像素),因此您不必按位和每个像素值来隔离特定通道。

我在某处读到 getPixel 非常慢,所以我认为你会节省最多。我可能是错的,所以值得计时。

于 2010-06-03T03:11:44.813 回答
0

我会说 Heath Hunnicutt 的 anwser 是一个很好的答案。如果图像没有改变,只需将所有颜色值存储在一个向量中。或任何字节数组并将其用作查找表,因此您无需每帧调用 getPixel() 。

于 2010-07-15T02:04:23.170 回答