-
-
Save radames/1e7c794842755683162b to your computer and use it in GitHub Desktop.
from pygame.locals import KEYDOWN, K_ESCAPE, K_q | |
import pygame | |
import cv2 | |
import sys | |
camera = cv2.VideoCapture(1) | |
pygame.init() | |
pygame.display.set_caption("OpenCV camera stream on Pygame") | |
screen = pygame.display.set_mode([1280, 720]) | |
try: | |
while True: | |
ret, frame = camera.read() | |
screen.fill([0, 0, 0]) | |
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) | |
frame = frame.swapaxes(0, 1) | |
pygame.surfarray.blit_array(screen, frame) | |
pygame.display.update() | |
for event in pygame.event.get(): | |
if event.type == pygame.QUIT: | |
sys.exit(0) | |
elif event.type == KEYDOWN: | |
if event.key == K_ESCAPE or event.key == K_q: | |
sys.exit(0) | |
except (KeyboardInterrupt, SystemExit): | |
pygame.quit() | |
cv2.destroyAllWindows() |
@jaxx99 thanks for the optimization! I've also replaced two surfaces step to a more efficient way using pygame.surfarray.blit_array
Folks, I've also create a repo with env for reference https://github.com/radames/opencv_video_to_pygame
I am getting this error:
"ValueError: array must match surface dimensions"
What should I do?
I am getting this error:
"ValueError: array must match surface dimensions"
What should I do?
Change screen size to your camera output size screen = pygame.display.set_mode([640, 480]) worked for me.
You can get size of frame easily E.g: print(frame.shape)
I can't thank you enough for this code. Keep it up.
Guys if anyone had this error
cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-kh7iq4w7\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
add frame = cv2.VideoCapture(0)
below ret, frame = camera.read()
hi @angelman7 can't help much but it could be related to your camera image streaming,
read more https://stackoverflow.com/questions/52676020/opencv-src-empty-in-function-cvtcolor-error
Can you show it the other way too?
Thanks a lot. This will be useful for me. ;)