2017-12-03 217 views
0

我试图从游戏文件养活我的屏幕输入图像处理器文件: - pygame的输出:如何将pygame中的3d数组转换为opencv python中的vaid输入?

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友好数据,以便我可以进行图像处理?

回答

0

imread()用于从文件读取,而不是从存储器读取。

但你不必转换它。 PyGame给出了您可以在cv2中使用的图像。

你必须只:从RGB

  • 转换(在PyGame使用)BGR(在CV2使用)。
  • transpose图片 - 交换widthheightPyGame使用(X,Y)但是CV2使用(Y,X)像数学中的矩阵(换句话说(row, column))。

我觉得这个代码显示了你可能需要的所有东西。

  • 创建PyGame
  • 显示图像中PyGame
  • 转换图像的图像从PyGameCV2
  • 显示图像中CV2
  • CV2
  • 修改 CV2
  • 显示修改后的图像的图像
  • convert modif从CV2PyGame
  • 显示IED图像修改的图像中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() 
相关问题