【问题标题】:How to make pixel by pixel PImage manipulation faster?如何使逐像素图像处理更快?
【发布时间】:2020-10-20 07:31:31
【问题描述】:

我正在制作一个安卓应用程序,其中有一个简单的相机 UI 以及一个过滤器列表来操作相机点击的图片。 我正在使用 Java 中的处理库 (https://processing.org/) 以及处理 IDE 中的 Ketai 库 (http://ketai.org/)。

以下是我的程序的主要运行方式:

--- 我有一个相机对象和一个空图像对象。图像对象的分辨率与相机的分辨率相同。

--- 从相机读取也返回一个图像对象。我们将相机返回的图像称为cameraImage,将空图像称为dummyImage。

--- 在每一帧,我使用 cameraImage 的像素数组从相机读取,我将每个像素单独复制到相应坐标位置的 dummyImage。

--- 正是在从 cameraImage 复制到 dummyImage 时,我根据用户选择的选项来操作像素。

--- 我在使用位移(以获得最大效率)复制每个像素时获取每个像素的红色、绿色和蓝色值,然后对其进行操作。

--- 复制到 dummyImage 完成后,我将 dummyImage 作为普通图像显示到屏幕上。

现在的问题是,当我直接显示 cameraImage 时,我很容易达到 50 到 60 fps 左右。但是当我在复制后显示 dummyImage 时,我得到大约 1.5 fps。

以下代码演示了我如何从 cameraImage 复制到 dummyImage。它没有任何过滤器,但会花费与使用任何过滤器一样多的时间。

  cameraImage.read();
  cameraImage.loadPixels();
  dummyImage.loadPixels();
  for (int x = 0; x < cameraImage.width; x++){
    for (int y = 0; y < cameraImage.height; y++){
      int index = x + (y * cameraImage.width);
      color currentPixel = cameraImage.pixels[index];
      
      float r = currentPixel >> 16 & 0xFF;
      float g = currentPixel >> 8 & 0xFF;
      float b = currentPixel & 0xFF;
      
      dummyImage[index] = color(r, g, b)
    }
  }
  dummyImage.updatePixels();
  image(dummyImage);

我想知道如何将帧数增加到每秒至少 20 个。请评论以获取更多信息,我会尽快回复。

【问题讨论】:

    标签: java android image camera processing


    【解决方案1】:

    一些可能的优化:

    • = color(r, g, b) 替换为= 0xff000000 | ((int) (r) &lt;&lt; 16 | (int) (g) &lt;&lt; 8 | (int) (b))

    • 您不能在 Processing 中并行光栅化图形,但可以并行读取/写入 pixels[] 数组(然后是 updatePixels()),因此请使用 thread() 在多个 CPU 线程上拆分像素迭代。

    • 而不是调用image(dummyImage),这涉及到第二次通过像素将它们复制到PApplet,而是直接在循环中写入PApplet(删除所有对dummyImage的引用并改用pixels[index] = ...) .

    • 由于逐像素计算是令人尴尬的并行,您甚至可以考虑编写一个 glsl 着色器(有很多这样的处理示例)或使用 Aparapi,它将 Java 代码转换为 GPU -ready OpenCL(我已经成功地使用了这个处理)。

    【讨论】:

    • 您提到的前两个步骤确实有很大帮助。我仍在尝试找到最佳阈值来划分图像以在线程化时获得最高效率。至于您的最后一步,我改为降低相机分辨率,然后使用image() 根据需要调整图像大小。减少图像实际上会增加帧数几乎是实际值的 4 倍,但我认为这不是理想的解决方案。无论如何谢谢你。
    • 至于线程数,根据我的经验,最好不要使用机器的全部线程数,因为那样Processing自己的绘制线程将不得不共享。
    • 您关于使用位移来替代 color() 函数的第一个提示有点奇怪。能否请您重新检查一下并告诉我,因为它可以改善帧数,但效果不佳。
    • 您关于使用位移来替代 color() 函数的第一个提示有点奇怪。能否请您重新检查一下并告诉我,因为它可以改善帧数,但没有给出理想的结果。它在分配之前从 r g b 值中添加或减去它会给出奇怪的结果。例如,如果我执行 r += 20, g += 20, b += 20,则图像不会变亮。就好像我直接为 r、g、b 变量赋值一样,它按预期工作。
    • 如果值超出范围 (0-255),它会搞砸的。color() 会限制值,但位移位当然会规避这一点。
    猜你喜欢
    • 2016-12-18
    • 1970-01-01
    • 2011-08-17
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多