отображать изображение cv2.VideoCapture внутри поверхности Pygame

Я пытаюсь использовать opencv (cv2) для потоковой передачи веб-камеры в объект поверхности pygame. Проблема в том, что цвета отображаются неправильно. Я думаю, что это кастинг типов, но мне сложно понять документацию на поверхности пигмейка, чтобы знать, чего он ожидает.

Этот код демонстрирует, о чем я говорю

import pygame from pygame.locals import * import cv2 import numpy color=False#True#False camera_index = 0 camera=cv2.VideoCapture(camera_index) camera.set(3,640) camera.set(4,480) #This shows an image the way it should be cv2.namedWindow("w1",cv2.CV_WINDOW_AUTOSIZE) retval,frame=camera.read() if not color: frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) cv2.flip(frame,1,frame)#mirror the image cv2.imshow("w1",frame) #This shows an image weirdly... screen_width, screen_height = 640, 480 screen=pygame.display.set_mode((screen_width,screen_height)) def getCamFrame(color,camera): retval,frame=camera.read() if not color: frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) frame=numpy.rot90(frame) frame=pygame.surfarray.make_surface(frame) #I think the color error lies in this line? return frame def blitCamFrame(frame,screen): screen.blit(frame,(0,0)) return screen screen.fill(0) #set pygame screen to black frame=getCamFrame(color,camera) screen=blitCamFrame(frame,screen) pygame.display.flip() running=True while running: for event in pygame.event.get(): #process events since last loop cycle if event.type == KEYDOWN: running=False pygame.quit() cv2.destroyAllWindows() 

Конечная цель, которую я имею, – создать небольшое приложение для фотобумаги для свадьбы DIY в следующем году. Я новичок в программировании, но мне удалось совместить это вместе. Я также пытался это сделать с помощью VideoCapture, который выводит PIL, который я также не мог получить для работы с поверхностным объектом. Я хочу использовать поверхность pygame, чтобы я мог анимировать и накладывать обратный текст, границы и т. Д.

Обновление: проблема заключалась в том, что функция cv2 camera.read () возвращает изображение BGR, но pygame.surfarray ожидает изображение RGB. Это фиксируется линией

 frame=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB) 

Кроме того, при преобразовании в оттенки серого работает следующий код:

 frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) frame=cv2.cvtColor(frame,cv2.COLOR_GRAY2RGB) 

Таким образом, функция getCamFrame теперь должна быть

 def getCamFrame(color,camera): retval,frame=camera.read() frame=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB) if not color: frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) frame=cv2.cvtColor(frame,cv2.COLOR_GRAY2RGB) frame=numpy.rot90(frame) frame=pygame.surfarray.make_surface(frame) return frame 

2 Solutions collect form web for “отображать изображение cv2.VideoCapture внутри поверхности Pygame”

Здесь нет цветовой ошибки

 frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) 

поэтому для нормального цвета экрана u просто измените это на

 frame=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB) 

Это будет делать, потому что это работает для меня

я пробую ваш код и получаю снимок не из фильма, я копирую

 frame=getCamFrame(color,camera) screen=blitCamFrame(frame,screen) pygame.display.flip() 

в цикл while для запуска, который работает, но видео перевернуто, чтобы зафиксировать его, я перемещаю cv2.flip (кадр, 1, кадр) #mirror изображение перед frame = numpy.rot90 (frame) в функции getcamFrame, и теперь все работает хорошо.

извините, я не разговариваю по-английски

  • Скачивание игр pygame с Pygame?
  • Как мне сделать так, чтобы моя ходячая анимация играла на заданной скорости? (Python, Pygame)
  • круг pygame не меняется
  • Как установить границы в pygame?
  • Pygame: невозможно открыть файл .mp3
  • играть музыку, используя pygame, но без звука
  • Прозрачное окно в Pygame или Python
  • Пользовательское событие PyGame
  • Python - лучший язык программирования в мире.