Python Numpy(OpenCV)图像阵列到OpenGL纹理(pi3d)

Python Numpy(OpenCV)图像阵列到OpenGL纹理(pi3d),python,opencv,numpy,opengl-es,raspberry-pi,Python,Opencv,Numpy,Opengl Es,Raspberry Pi,我正在使用pi3d在屏幕上显示ImageSprite,其纹理来自我正在加载的图像 displayTexture = pi3d.Texture("display/display.jpg", blend=True, mipmap=True) displaySlide = pi3d.ImageSprite(texture=displayTexture, shader=shader, w=800, h=600) 这个纹理图像实际上是我在程序中创建的。这是一个openCV2图像,因此只是一个numpy

我正在使用pi3d在屏幕上显示ImageSprite,其纹理来自我正在加载的图像

displayTexture = pi3d.Texture("display/display.jpg", blend=True, mipmap=True) 
displaySlide = pi3d.ImageSprite(texture=displayTexture, shader=shader, w=800, h=600)
这个纹理图像实际上是我在程序中创建的。这是一个openCV2图像,因此只是一个numpy阵列。现在我保存它只是为了再次加载它作为纹理,但是有没有一种方法可以用不断变化的numpy数组值不断更新精灵的纹理

我研究了openCV和OpenGL的支持,但从我所能看到的来看,它目前只支持Windows,因此不适合此用途


编辑:应该提到我也很高兴有一个较低级别的解决方案。我目前正在尝试在图像数组上使用.toString(),并将生成的字节列表与glTexImage2D一起使用,以生成纹理,但到目前为止还没有骰子。

是的,您可以将PIL.image传递给pi3d.texture,它将使用它创建一个新纹理。这里需要做一些工作,所以如果是大纹理,它会影响帧速率。此外,还需要更新保存纹理数组的缓冲区中的指针,以便使用新纹理

有一种方法可以将numpy数组加载到PIL.Image(Image.fromarray())中,因此这是一种简单的方法。然而,这有点复杂,因为pi3d已经将PIL.Image转换为numpy数组,请参见

以下内容可以作为pi3d.Texture工作的捷径,但调用“private”函数\u load\u opengl有点麻烦。我可能会考虑制定一种更稳健的方法来实现这一点(例如,将视频映射到3D对象等)

PS我记不起切换到numpy纹理的pi3d版本了,但这是最近的版本,所以你可能需要升级

编辑:

2015年3月18日发布了从Texture.image作为字节对象切换到numpy数组的v1.14

要阐明使用numpy数组初始化和刷新更改图像的步骤,请执行以下操作:

...
im = Image.fromarray(cv2im)       # cv2im is a numpy array
tex = pi3d.Texture(im)            # create Texture from PIL image
sprite = pi3d.ImageSprite(tex, shader, w=10.0, h=10.0)
...
  tex.image = cv2im               # set Texture.image to modified numpy array
  tex._load_opengl()              # re-run OpenGLESv2 routines

谢谢这个问题-它促使我在pi3d中快速更新图像,我现在可以使用视频作为纹理。谢谢你的回答!工作很好:)将v2.1升级到github。a) 您可以将numpy数组传递给Texture init b)有一种比运行整个_load_opengl更高效的方法Texture.update_ndarray。请参阅示例用法。作为一个整体概念,此解决方案是否适合?@Pi?我怀疑它是否比Rotem的建议更好。显然,我的代码是特定于pi3d的,必须转换为opencv。我认为渲染OpenGL帧总是比为真实视频开发的高度优化过程慢,因为我不认为texture2d创建过程可以以着色器使用的高度并行方式运行。运行cprofile时,瓶颈在哪里?
...
im = Image.fromarray(cv2im)       # cv2im is a numpy array
tex = pi3d.Texture(im)            # create Texture from PIL image
sprite = pi3d.ImageSprite(tex, shader, w=10.0, h=10.0)
...
  tex.image = cv2im               # set Texture.image to modified numpy array
  tex._load_opengl()              # re-run OpenGLESv2 routines