Python 使用openCV导出openGL纹理时出现异常

Python 使用openCV导出openGL纹理时出现异常,python,numpy,opencv,opengl,cv2,Python,Numpy,Opencv,Opengl,Cv2,出于调试目的,我决定编写纹理导出函数: def图像导出(self,文件名:str): im_format=file_name.rsplit('..')[-1] 如果im_格式为('jpg',): iformat=gl.gl\u BGR elif im_格式('png',): iformat=gl.gl\u BGRA 其他: 引发未实现的错误 具有自:#绑定纹理 #gl.glPixelStorei(gl.gl\U包\U对齐,1) im=(gl.glGetTexImage(gl.gl\u TEXTU

出于调试目的,我决定编写纹理导出函数:

def图像导出(self,文件名:str):
im_format=file_name.rsplit('..')[-1]
如果im_格式为('jpg',):
iformat=gl.gl\u BGR
elif im_格式('png',):
iformat=gl.gl\u BGRA
其他:
引发未实现的错误
具有自:#绑定纹理
#gl.glPixelStorei(gl.gl\U包\U对齐,1)
im=(gl.glGetTexImage(gl.gl\u TEXTURE\u 2D,0,iformat,gl.gl\u FLOAT)*255)。aType('uint8')
im=np.翻转(im,轴=0)
cv2.imwrite(文件名,im)
使用500x500纹理进行测试,效果良好:

但当我尝试500x600时,事情变得很奇怪:

我必须重塑它以获得所需的图像:

#。。。
im=im.重塑((600500,3))#添加线
im=np.翻转(im,轴=0)
cv2.imwrite(文件名,im)
结果是:

最近我问了一个问题 所以我尝试了
gl.glPixelStorei(gl.gl\u PACK\u ALIGNMENT,1)
,但没有发现它有任何效果。 重塑没有意义。如果不重塑,我应该简单地得到90度旋转的图像。我不明白什么



添加:
看完评论后,我试图总结我的理解。你能证实我的结论吗?

与之不同<代码>重塑不会更改轴(因此不会旋转),但会更改阵列的形状(宽度和高度)

e、 g:

a=numpy.array([[1,2,3,4],
[5, 6, 7, 8]])
ar=a.重塑((4,2))
打印(ar)
重塑:

[[12]
[3 4]
[5 6]
[7 8]]
转置:

at=a.转置((1,0))
打印(at)
[[15]
[2 6]
[3 7]
[4 8]]

返回具有形状(宽度、高度、通道)的数组。这意味着RGB 200x100图像的形状为(200100,3)。您可以通过
打印(im.shape)
来验证这一点

但是,按行的主要顺序(行、列)指定。这意味着

a=np.array([[1,2,3,4],
[5, 6, 7, 8]])
不是(4,2),而是(2,4)

表示RGB 4x2图像的阵列形状

a=np.array(
[(r1,g1,b1),(r2,g2,b2),(r3,g3,b3),(r4,g4,b4)],
[(r5,g5,b5),(r6,g6,b6),(r7,g7,b7),(r8,g8,b8)])
是(2,4,3)

PyOpenGL和NumPy(cv2)对形状的解释不同。因此,您必须更改形状并重塑阵列:

im=im.重塑((im.形状[1],im.形状[0],im.形状[2]))


总结:这并不复杂。PyOpenGL以(w,h,c)的形式返回形状信息,但NumPy需要(h,w,c)。图像的像素是线性存储的。顺序不需要更改,但必须更改它们的解释方式。

我没有发表评论,但给出了完整的答案。这并不复杂。PyOpenGL以(w,h,c)的形式返回形状信息,但NumPy需要(h,w,c)。图像的像素是线性存储的。顺序不需要改变,但它们的解释方式必须改变。我想你的第一条评论说的是我在最后一张图片右下角的评论“…(数组)像素索引不代表它在纹理中的位置”,对吗?但如果是这样的话,这就是为什么实现会这样做。它可以简单地将数组索引与纹理像素坐标匹配。