Options to read webcam using Python/Linux


Question

I am looking to find a way to integrate a webcam into my python program.

I am running on a Raspberry Pi Model A OC'd to 900mHz, so the solution will need to be ARM compatible and (hopefully) lightweight.

Most posts I have seen recommend using the OpenCV module to read the webcam, but I am unable to get anything but a black frame to appear from my webcam. I assume that OpenCV is not compatible with my webcam. However, every other webcam application available for linux can detect and display the feed from my webcam.

I am wondering if there are any other lightweight or simple methods for capturing from my webcam using python. Perhaps a way that I could directly interface with the video0 device that comes up under /dev/ for my webcam? I am open to any suggestions; because what I am doing now, is not working.

Thanks

(as requested):

Output of 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

And this is the code snippet I'm using:

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")

Thanks for your help!

1
6
12/18/2012 4:02:34 PM

Accepted Answer

You could use gstreamer-0.10.

  1. Get it to work on the command line. e.g.: gst-launch -v v4l2src ! decodebin ! ffmpegcolorspace ! pngenc ! filesink location=out.png

  2. Use the parse_launch function to get a shortcut to a working pipeline in you python code.

    import gst
    
    pipeline = gst.parse_launch("""
    v4l2src ! decodebin ! ffmpegcolorspace ! pngenc ! filesink location="%s"
    """ % sys.argv[-1])
    
    pipeline.set_state(gst.STATE_PLAYING)
    
3
1/20/2013 1:02:27 PM

I have tried several methods to capture single frames from a webcam:

uvccapture is one option and here's a command:

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

streamer is another and the command looks about like this:

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

Yes I realize that this isn't the most high performance since you have to use Python's "command" module to execute this command and get the results, and then open up the resulting file in OpenCV to do processing.

BUT it does work. I've been using it in production on several automation projects quite successfully. The lag I experience is all based on my image processing software, raw images can be displayed VERY quickly.


Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon