2015-01-06 81 views
2

視頻我的工作,需要我有一個取景器(條碼掃描器)的項目。顯示IO流從樹莓派相機在pygame的

我正在用picamera python模塊來完成樹莓派相機模塊的操作,而且我已經完成了全部檢測和未編程。

現在我需要弄清楚如何在PyGame movie模塊中顯示Pi的Camera Module中的預覽。 (如果有更好的方式來顯示來自PyGame中IO流的視頻,請告訴我們。)

我需要在PyGame中顯示它的原因是我需要在視頻頂部重疊控件並能夠從觸摸屏獲得輸入,我將用作Pi /項目的取景器/屏幕。

據我所知,從pygame.movie documentation,pygame.movie只能從一個文件加載。有沒有一種方法可以將流轉換爲類似文件的對象,並讓PyGame可以播放它?

基本上說,我需要一種方法來取得在this example code中創建的io.BytesIO流,並將它顯示在PyGame中。

+0

你見過[上Adafruit的相機教程](https://learn.adafruit.com/diy-wifi-raspberry-pi-touch-cam/overview)?這似乎有一個實時預覽與頂部的按鈕,並使用觸摸屏。 – elParaguayo

+0

@elParaguayo是的,我已經看到了這一點,並計劃採取一些排隊 - 我只是好奇,如果任何人有任何在這個網站上的經驗。 –

+0

拍攝...有關於此的任何更新?我有點想知道它是如何完成的。我試圖做同樣的事情,雖然沒有觸摸屏 – Chaz

回答

3

如果我理解excatly,你需要即時和無限預覽從相機模塊到你的屏幕。

有我弄明白的方式。首先你必須安裝官方的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

我希望這將適用於你

0

您可以用「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()