python - 如何将pygame中的3d数组转换为opencv python中的有效输入?

标签 python numpy opencv image-processing pygame

我正在尝试将屏幕输入从游戏文件输入到图像处理器文件:
PyGame输出:

image_data = pygame.surfarray.array3d(pygame.display.get_surface()) 

OpenCV输入:
imgTesting = cv2.imread(image_data)

我得到的错误是:
imgTesting = cv2.imread(image_data)         
TypeError: bad argument type for built-in operation

那么,如何将3d输入转换为opencv友好数据,以便进行图像处理?

最佳答案

imread()用于读取文件,而不是内存。

但是您不必转换它。 PyGame提供可以在cv2中使用的图像。

您只需要:

  • RGB(用于PyGame)转换为BGR(用于CV2)。
  • transpose图像-将widthheight交换。PyGame使用(X,Y),但CV2使用(Y,X)像数学中的矩阵(即(row, column))。


  • 我认为这段代码显示了您可能需要的所有内容。
  • PyGame中创建图像
  • PyGame显示图像
  • 将图像从PyGame转换为CV2
  • CV2显示图像
  • 修改CV2中的图像
  • CV2显示修改后的图像
  • 将修改后的图像从CV2转换为PyGame
  • PyGame显示修改后的图像


  • import pygame
    import cv2
    
    pygame.init()
    
    # --- create PyGame image ---
    
    pg_img = pygame.Surface((400, 200))
    pygame.draw.circle(pg_img, (255,0,0), (0,0), 200)
    
    # --- display PyGame image ---
    
    screen = pygame.display.set_mode((400, 400))
    
    screen.fill((255,255,255))
    screen.blit(pg_img, pg_img.get_rect())
    pygame.display.flip()
    
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.KEYDOWN:
                running = False
    
    pygame.quit()
    
    # --- move from PyGame to CV2 ---
    
    color_image = pygame.surfarray.array3d(pg_img)
    
    color_image = cv2.transpose(color_image)
    color_image = cv2.cvtColor(color_image, cv2.COLOR_RGB2BGR)
    
    # --- display CV2 image ---
    
    cv2.imshow('Color', color_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    # --- change CV2 image ---
    
    color_image = cv2.rotate(color_image, cv2.ROTATE_90_CLOCKWISE)
    gray_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2GRAY)
    
    # --- display CV2 image ---
    
    cv2.imshow('Gray', gray_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    # --- save in file in CV2 ---
    
    cv2.imwrite('test.png', color_image)
    
    # --- move back from CV2 to PyGame ---
    
    gray_image = cv2.cvtColor(gray_image, cv2.COLOR_GRAY2RGB)
    gray_image = cv2.transpose(gray_image)
    
    pg_img = pygame.surfarray.make_surface(gray_image)
    
    # --- display PyGame image ---
    
    screen = pygame.display.set_mode((400, 400))
    
    screen.fill((255,255,255))
    screen.blit(pg_img, pg_img.get_rect())
    pygame.display.flip()
    
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.KEYDOWN:
                running = False
    
    pygame.quit()
    

    关于python - 如何将pygame中的3d数组转换为opencv python中的有效输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47614396/

    相关文章:

    python - 如何将一个数据框中的一列字符串值映射到另一个数据框中的另一列?

    python - Python 中的偏导数

    c++ - 为模块化 OpenCV 应用程序确定语言/框架

    objective-c - 使用 OpenCV,如何在执行 OCR 之前检测文本方向?

    c++ - 在没有调试符号的情况下在 Xcode 中调试 dylib

    python - 获取整数中偶数最长序列的最佳方法

    python - 如何捕获上下文中未定义名称的异常?

    python - 值错误 : operation parameter must be str or unicode

    python - 编辑二维数组中元素的简单方法 Python :

    python - 计算一组坐标之间的距离