使用 Python/Linux 读取网络摄像头的选项

Posted

技术标签:

【中文标题】使用 Python/Linux 读取网络摄像头的选项【英文标题】:Options to read webcam using Python/Linux 【发布时间】:2012-12-05 20:58:24 【问题描述】:

我正在寻找一种将网络摄像头集成到我的 python 程序中的方法。

我在 Raspberry Pi A 型超频至 900mHz 上运行,因此该解决方案需要与 ARM 兼容并且(希望)是轻量级的。

我看到的大多数帖子都建议使用 OpenCV 模块来读取网络摄像头,但我无法从我的网络摄像头中看到一个黑框。我假设 OpenCV 与我的网络摄像头不兼容。但是,可用于 linux 的所有其他网络摄像头应用程序都可以检测并显示来自我的网络摄像头的提要。

我想知道是否有任何其他轻量级或简单的方法可以使用 python 从我的网络摄像头捕获。也许我可以直接与 /dev/ 下为我的网络摄像头出现的 video0 设备交互?我愿意接受任何建议;因为我现在正在做的,是行不通的。

谢谢

(根据要求):

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

这是我正在使用的代码 sn-p:

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

感谢您的帮助!

【问题讨论】:

请发布v4l2-ctl --all 和一些您现在正在使用的代码。 我已将它添加到我的开篇文章中。谢谢! 【参考方案1】:

我尝试了几种方法从网络摄像头捕获单帧:

uvccapture 是一种选择,这里有一个命令:

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

streamer 是另一个,命令看起来像这样:

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

是的,我意识到这不是最高性能,因为您必须使用 Python 的“命令”模块来执行此命令并获取结果,然后在 OpenCV 中打开生成的文件进行处理。

但它确实有效。我已经在几个自动化项目的生产中非常成功地使用它。我所经历的滞后都是基于我的图像处理软件,原始图像可以非常快速地显示出来。

【讨论】:

保存到RAMDisk,/run/shm,速度会更快。【参考方案2】:

您可以使用 gstreamer-0.10。

    让它在命令行上工作。 例如:gst-launch -v v4l2src !解码器! ffmpeg色彩空间! !文件接收器位置=out.png

    使用 parse_launch 函数在 Python 代码中获取工作管道的快捷方式。

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

【讨论】:

以上是关于使用 Python/Linux 读取网络摄像头的选项的主要内容,如果未能解决你的问题,请参考以下文章

3h精通OpenCV- 读取图像视频与网络摄像头

有关opencv无法解码网络摄像头rtsp流的解决办法

MAC11.5.2怎么开安装其他应用的权限为啥按照操作还是没有其他的选

如何在 C++ 中读取来自网络摄像头的输入?

如何在 OSX 上的单独进程中读取网络摄像头?

Python3 读取本地网络摄像头流