在PyGam中将覆盆子Pi相机的IO流显示为视频

2024-05-15 14:30:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个项目,需要我有一个取景器(条码扫描仪)。

我正在用python模块中的Raspberry Pi相机模块来完成这项工作,我已经完成了所有的检测和编程。

现在我需要弄清楚如何在PyGamemovie模块中显示Pi的Camera模块的预览。 (如果有更好的方法在PyGame中显示来自IO流的视频,请告诉我。)

我需要在PyGame中显示它的原因是,我需要在视频顶部覆盖控件,并且能够从触摸屏获取输入,我将使用它作为Pi/项目的取景器/屏幕。

据我从pygame.movie documentation中所见,pygame.movie仅从文件加载。有没有一种方法可以将流转换成类似文件的对象并从中进行PyGame游戏?

基本上,我需要一种方法来获取在this example code中创建的io.BytesIO流,并在PyGame中显示它。


Tags: 模块项目方法视频编程pimoviepygame
2条回答

您可以使用“pygame.image.frombuffer”命令完成此操作。

下面是一个例子:

import picamera
import pygame
import io

# Init pygame 
pygame.init()
screen = pygame.display.set_mode((0,0))

# Init camera
camera = picamera.PiCamera()
camera.resolution = (1280, 720)
camera.crop = (0.0, 0.0, 1.0, 1.0)

x = (screen.get_width() - camera.resolution[0]) / 2
y = (screen.get_height() - camera.resolution[1]) / 2

# Init buffer
rgb = bytearray(camera.resolution[0] * camera.resolution[1] * 3)

# Main loop
exitFlag = True
while(exitFlag):
    for event in pygame.event.get():
        if(event.type is pygame.MOUSEBUTTONDOWN or 
           event.type is pygame.QUIT):
            exitFlag = False

    stream = io.BytesIO()
    camera.capture(stream, use_video_port=True, format='rgb')
    stream.seek(0)
    stream.readinto(rgb)
    stream.close()
    img = pygame.image.frombuffer(rgb[0:
          (camera.resolution[0] * camera.resolution[1] * 3)],
           camera.resolution, 'RGB')

    screen.fill(0)
    if img:
        screen.blit(img, (x,y))

    pygame.display.update()

camera.close()
pygame.display.quit()

如果我能理解,你需要从相机模块到屏幕的即时无限预览。

我有办法弄清楚。首先,您必须安装正式的V4L2驱动程序。

sudo modprobe bcm2835-v4l2

参考https://www.raspberrypi.org/forums/viewtopic.php?f=43&t=62364

然后创建一个python文件来编译

import sys
import pygame
import pygame.camera

pygame.init()
pygame.camera.init()

screen = pygame.display.set_mode((640,480),0)
cam_list = pygame.camera.list_cameras()
cam = pygame.camera.Camera(cam_list[0],(32,24))
cam.start()

while True:
   image1 = cam.get_image()
   image1 = pygame.transform.scale(image1,(640,480))
   screen.blit(image1,(0,0))
   pygame.display.update()

   for event in pygame.event.get():
          if event.type == pygame.QUIT:
          cam.stop()
          pygame.quit()
          sys.exit()

这段代码来自http://blog.danielkerris.com/?p=225,在这个博客中他们用了一个摄像头。将相机模块定义为带有v4l2驱动程序的网络摄像头

您还应该查看本教程https://www.pygame.org/docs/tut/camera/CameraIntro.html

我希望这对你有用

相关问题 更多 >