微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使逐像素PImage操作更快?

如何解决如何使逐像素PImage操作更快?

我正在制作一个android应用程序,其中有一个简单的相机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个。请发表评论获取更多信息,我会尽快回复

解决方法

一些可能的优化:

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

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

  • 与其调用image(dummyImage)(这涉及对像素进行第二遍复制以将其复制到PApplet中),不如直接在循环内写入PApplet(删除对{{1 }},而改用dummyImage

  • 由于逐个像素的计算非常复杂,因此您甚至可以考虑编写glsl着色器(有很多处理示例)或使用Aparapi,将Java代码转换为可用于GPU的OpenCL(我已经成功地将它与Processing结合使用了。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?