2012-12-18 23 views
6

Szukam sposobu na integrację kamery internetowej z moim programem python.Opcje odczytu kamery przy użyciu Python/Linux

Używam Raspberry Pi Model A OC'd do 900MHz, więc rozwiązanie będzie musiało być kompatybilne z ARM i (miejmy nadzieję) lekkie.

Większość postów, które widziałem, zaleca używanie modułu OpenCV do odczytywania kamery internetowej, ale nie mogę uzyskać niczego poza czarną ramką, która pojawia się z mojej kamery internetowej. Zakładam, że OpenCV nie jest kompatybilny z moją kamerą internetową. Jednak każda inna aplikacja internetowa dostępna dla systemu Linux może wykryć i wyświetlić kanał z mojej kamery internetowej.

Zastanawiam się, czy istnieją inne lekkie lub proste metody przechwytywania z mojej kamery internetowej przy użyciu Pythona. Być może sposób, w jaki mógłbym bezpośrednio współpracować z urządzeniem video0, które pojawia się pod/dev/dla mojej kamery internetowej? Jestem otwarty na wszelkie sugestie; ponieważ to, co teraz robię, nie działa.

Dzięki

(na żądanie):

wyjściu v4l2-ctl --all:

Driver Info (not using libv4l2): 
    Driver name : uvcvideo 
    Card type  : UVC Camera (046d:081b) 
    Bus info  : usb-bcm2708_usb-1.2 
    Driver version: 3.2.27 
    Capabilities : 0x04000001 
     Video Capture 
     Streaming 
Format Video Capture: 
    Width/Height : 640/480 
    Pixel Format : 'YUYV' 
    Field   : None 
    Bytes per Line: 1280 
    Size Image : 614400 
    Colorspace : SRGB 
Crop Capability Video Capture: 
    Bounds  : Left 0, Top 0, Width 640, Height 480 
    Default  : Left 0, Top 0, Width 640, Height 480 
    Pixel Aspect: 1/1 
Video input : 0 (Camera 1: ok) 
Streaming Parameters Video Capture: 
    Capabilities  : timeperframe 
    Frames per second: 30.000 (30/1) 
    Read buffers  : 0 

i jest to fragment kodu używam:

import cv 

cv.NamedWindow("camera", 1) 
capture = cv.CaptureFromCAM(0) 

while True: 
    img = cv.QueryFrame(capture) 
    cv.ShowImage("camera", img) 
    if cv.WaitKey(10) == 27: 
     break 

cv.DestroyWindow("camera") 

Dzięki za Wsparcie!

+0

proszę pisać 'v4l2-CTL --all' a niektóre kod używasz teraz. – gertvdijk

+0

Dodałem go do mojego pierwszego postu. Dzięki! –

Odpowiedz

3

Możesz użyć gstreamer-0.10.

  1. Włącz go do pracy z wiersza poleceń. np .: gst-launch -v v4l2src! decodebin! ffmpegcolorspace! pngenc! filesink location = out.png

  2. Użyj funkcji parse_launch, aby uzyskać skrót do działającego potoku w twoim kodzie pythona.

    import gst 
    
    pipeline = gst.parse_launch(""" 
    v4l2src ! decodebin ! ffmpegcolorspace ! pngenc ! filesink location="%s" 
    """ % sys.argv[-1]) 
    
    pipeline.set_state(gst.STATE_PLAYING) 
    
1

Próbowałem kilka metod przechwytywania pojedynczych klatek z kamery internetowej:

uvccapture jest jedną z opcji, a oto polecenie:

uvccapture -d /dev/video0 -o outfile.jpg 

streamer jest inny i komenda wygląda o tak:

streamer -c /dev/video0 -o outfile.jpeg 

Tak, zdaję sobie sprawę, że nie jest to najwyższy wynik, ponieważ musisz użyć "polecenia" modułu Pythona, aby wykonać to polecenie i uzyskać wyniki, i kura otwiera plik wynikowy w OpenCV, aby wykonać przetwarzanie.

ALE to działa. Używam go w produkcji w kilku projektach automatyzacji z powodzeniem. Opóźnienie, którego doświadczam, wszystko opiera się na moim oprogramowaniu do przetwarzania obrazów, obrazy surowe mogą być wyświetlane BARDZO szybko.

+0

Zapisz go w pamięci RAM, '/ run/shm', a prędkość będzie jeszcze większa. – Mustafa

Powiązane problemy