Java 从机器视觉摄像机高效流式传输可缩放图像的实现范例?

Java 从机器视觉摄像机高效流式传输可缩放图像的实现范例?,java,opengl,computer-vision,lwjgl,Java,Opengl,Computer Vision,Lwjgl,我正在从事一个机器视觉项目,在这个项目中,我想使用Java,尽管在本机环境中工作有好处,因为我的长期目标是开发一个用Java编写的现有框架插件 目前,我使用的机器视觉摄像头通过USB 3.0总线以大约7 FPS的速度传输12 MP图像,将来可能会使用更高分辨率的摄像头(>29 MP) 我正在使用的本机库是c语言的,我已经成功地使用JNA+JNAvigator“包装”了它 我只在Windows 64位环境中工作 我已经证明,我们可以成功地从本机库中捕获原始BGR字节[],将它们转储到Buffere

我正在从事一个机器视觉项目,在这个项目中,我想使用Java,尽管在本机环境中工作有好处,因为我的长期目标是开发一个用Java编写的现有框架插件

目前,我使用的机器视觉摄像头通过USB 3.0总线以大约7 FPS的速度传输12 MP图像,将来可能会使用更高分辨率的摄像头(>29 MP)

我正在使用的本机库是c语言的,我已经成功地使用JNA+JNAvigator“包装”了它

我只在Windows 64位环境中工作

我已经证明,我们可以成功地从本机库中捕获原始BGR字节[],将它们转储到BuffereImage中,并以非常接近c实现速度的更新速度显示在AWT帧中。下面是我当前如何转换为BuffereImage的一个示例,它应该能够让我对当前访问的低级数据有一定的了解:

byte[] pixels = new byte[rawImageSize * 3]; // *3 for B,G,R
rawImage.getData().get(pixels);

// Turn into buffered image
BufferedImage image = new BufferedImage(rawImageWidth, rawImageHeight,
    BufferedImage.TYPE_3BYTE_BGR);
byte[] imageData = ( (DataBufferByte) image.getRaster().getDataBuffer() ).getData();
System.arraycopy(pixels, 0, imageData, 0, pixels.length);
现在的诀窍是,由于这些是12MP图像,它们不能方便地在屏幕上查看,因为它们需要缩小。我尝试使用其他地方的示例来缩放BuffereImage,但显然,在使用CPU缩放图像时,性能会受到巨大的影响。此外,我希望用户能够在图像更新时动态放大和缩小图像,而不会注意到显著的性能影响

我的想法是,继续前进的最佳选择是使用OpenGL Java实现,并将缩放图像的工作交给GPU

不幸的是,我使用OpenGL的经验非常有限,更不用说在Java中利用它了。我特别寻求以下方面的指导/答案:

  • 鉴于我可以访问图像的原始字节[],OpenGL是向前迈出的正确一步吗
  • 在研究Java的OpenGL实现时,我考虑的是LWJGL。这是最低的进入门槛吗
  • 有没有类似的有意义的例子

谢谢

使用GL回答您的第一个问题,您的缩放问题将变为“免费”。不过,将像素转换为每帧OpenGL纹理需要花费很多钱。谢谢,由于我缺乏使用OpenGL的经验,我很难用谷歌搜索任何类型的示例来了解如何实现这一点。你能告诉我参考资料吗?你需要的关键词是LWJGL,纹理,教程。在我看来,我遇到的每一个LWJGL示例都使用了该软件包的更旧版本,并且在当前版本中,许多内容似乎已被弃用或丢失。我想我可能需要结束这个问题,问一个更具体的问题,让我的脚离开地面,这里。谢谢你的帮助@Robinson!使用GL回答您的第一个问题,您的缩放问题将变为“免费”。不过,将像素转换为每帧OpenGL纹理需要花费很多钱。谢谢,由于我缺乏使用OpenGL的经验,我很难用谷歌搜索任何类型的示例来了解如何实现这一点。你能告诉我参考资料吗?你需要的关键词是LWJGL,纹理,教程。在我看来,我遇到的每一个LWJGL示例都使用了该软件包的更旧版本,并且在当前版本中,许多内容似乎已被弃用或丢失。我想我可能需要结束这个问题,问一个更具体的问题,让我的脚离开地面,这里。谢谢你的帮助@Robinson!