![](/img/trans.png)
[英]How do I convert an OpenCV (cv2) image (BGR and BGRA) to a pygame.Surface object
[英]Pygame surface to opencv image object (not file saving)
我在 pygame 表面上有一个矩形区域。 我想将该区域转换为 opencv 图像对象(不保存到文件),以便仅对该矩形区域进行进一步的图像处理。 我怎样才能做到这一点?
selected_area = mysurface.subsurface((x,y,w,h))
img_array=numpy.array(pygame.surfarray.array2d(selected_area))
#image_object = ..... ?
gray = cv2.cvtColor(image_object, cv2.COLOR_BGR2GRAY)
cv2.imshow("test",gray)
实际上,一个cv2图像只是一个三维numpy数组。 第一个维度是高度,第二个维度是宽度,第三个维度是蓝色、绿色、红色的通道数。
使用pygame.surfarray.pixels3d
将像素引用到 3d 数组中:
img_array = numpy.array(pygame.surfarray.pixels3d(selected_area))
不幸的是,像素按行长顺序存储。 颜色通道的顺序是红、绿、蓝。 所以你需要重新格式化这个数组。 transpose
数组:
image_object = numpy.transpose(img_array, (1, 0, 2))
最后交换红色和蓝色通道
image_object[:, :, [0, 2]] = image_object[:, :, [2, 0]]
或者
image_object = cv2.cvtColor(image_object, cv2.COLOR_RGB2BGR)
转换功能:
def pygameSurfaceToCv2Image(mysurface, x, y, w, h):
selected_area = mysurface.subsurface((x, y, w, h))
img_array = numpy.array(pygame.surfarray.pixels3d(selected_area))
image_object = numpy.transpose(img_array, (1, 0, 2))
image_object[:, :, [0, 2]] = image_object[:, :, [2, 0]]
return image_object
最小的例子:
import pygame
import cv2, numpy
pygame.init()
window = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()
def pygameSurfaceToCv2Image(mysurface, x, y, w, h):
selected_area = mysurface.subsurface((x, y, w, h))
img_array = numpy.array(pygame.surfarray.pixels3d(selected_area))
image_object = numpy.transpose(img_array, (1, 0, 2))
#image_object[:, :, [0, 2]] = image_object[:, :, [2, 0]]
image_object = cv2.cvtColor(image_object, cv2.COLOR_RGB2BGR)
return image_object
apple_surf = pygame.image.load("Apple1.bmp")
image_object = pygameSurfaceToCv2Image(apple_surf, 20, 20, 200, 120)
gray = cv2.cvtColor(image_object, cv2.COLOR_BGR2GRAY)
cv2.imshow("apple subsurface", image_object)
cv2.imshow("gray apple subsurface", gray)
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
window.fill(0)
window.blit(image, image.get_rect(center = window.get_rect().center))
pygame.display.flip()
clock.tick(60)
pygame.quit()
exit()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.