繁体   English   中英

Pygame表面到opencv图像对象(不是文件保存)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM