【发布时间】:2021-05-28 23:28:54
【问题描述】:
出于调试目的,我决定编写纹理导出函数:
def image_export(self, file_name: str):
im_format = file_name.rsplit('.')[-1]
if im_format in ('jpg',):
iformat = gl.GL_BGR
elif im_format in ('png',):
iformat = gl.GL_BGRA
else:
raise NotImplementedError
with self: # binding texture
# gl.glPixelStorei(gl.GL_PACK_ALIGNMENT, 1)
im = (gl.glGetTexImage(gl.GL_TEXTURE_2D, 0, iformat, gl.GL_FLOAT) * 255).astype('uint8')
im = np.flip(im, axis=0)
cv2.imwrite(file_name, im)
我必须重塑它以获得所需的图像:
# ...
im = im.reshape((600, 500, 3)) # added line
im = np.flip(im, axis=0)
cv2.imwrite(file_name, im)
最近我问了一个问题glTexImage2D data not filled as expected
所以我尝试了gl.glPixelStorei(gl.GL_PACK_ALIGNMENT, 1),但没有发现它有任何影响。
重塑没有意义。如果不进行整形,我应该简单地获得 90 度旋转的图像。我不明白什么?
补充:
阅读评论后,试图总结我的理解。你(某人)能验证我的结论吗?
【问题讨论】:
-
我没有发表评论,而是完整的回答。这没有什么复杂的。 PyOpenGL 以 (w, h, c) 的形式返回形状信息,但 NumPy 需要 (h, w, c)。图像的像素是线性存储的。顺序不需要改变,但它们的解释方式必须改变。
-
我认为您的第一条评论说明了我在最后一张图片的右下角评论中所说的“...(数组)像素索引不代表其在纹理中的位置”,对吗?但如果是这样,这就留下了实现这样做的原因。它可以简单地将数组索引与纹理像素坐标匹配。
标签: python numpy opencv opengl cv2