Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将OpenCV(cv2)图像(BGR和BGRA)转换为pygame.Surface对象_Python_Numpy_Pygame_Cv2_Pygame Surface - Fatal编程技术网

Python 如何将OpenCV(cv2)图像(BGR和BGRA)转换为pygame.Surface对象

Python 如何将OpenCV(cv2)图像(BGR和BGRA)转换为pygame.Surface对象,python,numpy,pygame,cv2,pygame-surface,Python,Numpy,Pygame,Cv2,Pygame Surface,我从/()创建了图像,并希望将其转换为对象: def CV2图像表面(CV2图像): pygameSurface=#?从“cv2Image”创建 返回游戏面 表面=CV2图像到表面(CV2图像) 一些图像具有3个通道(BGR),一些图像还具有alpha通道(BGRA)。在cv2ImageToSurface中,要将其中一种格式的图像转换为对象,我必须做些什么?a的shape属性是每个维度中的元素数。第一个元素是高度,第二个元素是宽度,第三个元素是通道数。 可以通过生成。第一个参数可以是numpy

我从/()创建了图像,并希望将其转换为对象:

def CV2图像表面(CV2图像):
pygameSurface=#?从“cv2Image”创建
返回游戏面
表面=CV2图像到表面(CV2图像)

一些图像具有3个通道(BGR),一些图像还具有alpha通道(BGRA)。在
cv2ImageToSurface
中,要将其中一种格式的图像转换为对象,我必须做些什么?

a的
shape
属性是每个维度中的元素数。第一个元素是高度,第二个元素是宽度,第三个元素是通道数。
可以通过生成。第一个参数可以是
numpy.array
,第二个参数是格式(
RGB
RGBA

通过切片获取
pygame.Surface
对象的大小(宽度、高度):

size=cv2Image.shape[1::-1]
根据第三个通道,确定
pygame.Surface
对象的目标格式:

format='RGBA'如果cv2Image.shape[2]==4,则为'RGB'
由于源格式为BGR或BGRA,但目标格式为RGB或RGBA,因此必须交换红色和蓝色通道:

cv2Image[:,:,[0,2]]=cv2Image[:,:,[2,0]]
对于灰度图像,必须使用更改阵列的形状,并且必须使用以下方法将灰色通道扩展为红绿色和蓝色通道:

cv2Image=np.重复(cv2Image.重塑(尺寸[1],尺寸[0],1],3,轴=2)
通过他的数据,
pygame.Surface
对象可以通过
pygame.image.frombuffer
生成:

surface=pygame.image.frombuffer(cv2Image.flatte(),大小,格式)
为确保图像具有与显示表面相同的像素格式并获得最佳性能,应使用或转换表面:

surface=surface.convert_alpha()如果格式=='RGBA'else surface.convert()
完整功能
cv2ImageToSurface

def CV2图像表面(CV2图像):
如果cv2Image.dtype.name==“uint16”:
cv2Image=(cv2Image/256).astype('uint8')
大小=CV2图像形状[1::-1]
如果透镜(CV2图像形状)==2:
cv2Image=np.重复(cv2Image.重塑(尺寸[1],尺寸[0],1],3,轴=2)
格式='RGB'
其他:
如果cv2Image.shape[2]==4,则格式为“RGBA”,否则为“RGB”
cv2Image[:,:,[0,2]]=cv2Image[:,:,[2,0]]
surface=pygame.image.frombuffer(cv2Image.Flatte(),大小,格式)
返回surface.convert_alpha()如果format='RGBA'else surface.convert()
最简单的例子:

导入操作系统
导入pygame
进口cv2
将numpy作为np导入
def CV2图像表面(CV2图像):
如果cv2Image.dtype.name==“uint16”:
cv2Image=(cv2Image/256).astype('uint8')
大小=CV2图像形状[1::-1]
如果透镜(CV2图像形状)==2:
cv2Image=np.重复(cv2Image.重塑(尺寸[1],尺寸[0],1],3,轴=2)
格式='RGB'
其他:
如果cv2Image.shape[2]==4,则格式为“RGBA”,否则为“RGB”
cv2Image[:,:,[0,2]]=cv2Image[:,:,[2,0]]
surface=pygame.image.frombuffer(cv2Image.Flatte(),大小,格式)
返回surface.convert_alpha()如果format='RGBA'else surface.convert()
pygame.init()
window=pygame.display.set_模式((400400))
clock=pygame.time.clock()
cv2Image1=cv2.imread('woodtiles.jpg',cv2.imread_灰度)
cv2Image2=cv2.imread('woodtiles.jpg',cv2.imread_未更改)
cv2Image3=cv2.imread('Apple1-256.png',cv2.imread_未更改)
pygameSurface1=cv2ImageToSurface(cv2Image1)
pygameSurface2=cv2ImageToSurface(cv2Image2)
pygameSurface3=cv2ImageToSurface(cv2Image3)
运行=真
运行时:
时钟滴答(60)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
窗口填充(0)
blit(pygameSurface1,pygameSurface1.get_rect(topleft=window.get_rect().flate(-10,-10).topleft))
blit(pygamessurface2,pygamessurface2.get_rect(center=window.get_rect().center))
blit(pygameSurface3,pygameSurface3.get_rect(bottomright=window.get_rect().flate(-10,-10).bottomright))
pygame.display.flip()
pygame.quit()