1

问题

如何获取流式帧的小样本,并使用 Python 操作它们?是否有任何可用的库可供使用,还是我必须单独编写整个项目的代码?

技术规格

操作系统:Linux

连接:CAT-5 以太网

相机:dlink DCS-930L

介绍

我最近问了一个问题,但由于清晰度问题,它被关闭了。

我正在重新发布更多细节,如果仍然不清楚,请随时编辑或添加评论。

背景

我有一个 dlink DCS-930L 相机,它通过直接cat5连接直接连接到我的 Linux 计算机。我将它分配给一个静态 IP 地址,一切正常。

当我打开一个网络浏览器并连接到这个静态 IP 地址(例如登录到 192.168.0.20)时,相机就可以实时正常工作。

我这样做是为了验证我的相机是否正常工作,并且我能够正确建立以太网连接。

现在,我需要对通过以太网从相机接收到的视频帧进行一些图像处理。

我不想再使用网络浏览器作为显示方式,而是想使用 Python 来读取帧。

换句话说,假设相机每秒产生 30 帧,并且每一帧都有一定的尺寸(例如 1920x1080 像素)。

我想做的就是开始用 Python 读取这些帧。我不介意我是否丢失了帧并且我处理它的速度很慢。即使我能够在几秒钟内处理一帧,我仍然可以接受。

由于视频是图像的集合(在这种情况下每秒 30 张图像),我希望能够使用 Python 读取这些图像,然后能够对这些图像进行我需要做的任何处理。

如果我将这些图像保存在计算机上,我会用 Python 打开这些图像,然后开始操作它们。但是,由于在这种情况下,图像实际上是流式传输的,我只想知道如何对它们进行采样(可能每隔几秒采样一次),并使用 Python 进行一些操作?

如果我的问题仍然不清楚,请告诉我,我会尽可能地澄清它。

谢谢,--鲁迪

4

2 回答 2

0

根据手册,摄像头通过java小程序提供视频,因此如果不了解该服务器协议,将很难通过python访问。

但是,它确实可以选择将图像推送到 ftp 服务器(第 34 页),因此如果您在 linux 机器上安装 vsftpd,您可以告诉相机以可能高达 4 fps 的速度将图像推送到那里。这里有关于在 ubuntu 上设置 vsftpd 的说明,其他版本的 linux 将类似(我似乎记得 fedora 需要的设置稍微少一点,但那是几年前的事了)。

您将需要write_enable=YES使用/etc/vsftpd.conf. 有多种方法可以处理上传,最简单的一种是使用您的用户帐户登录,然后它将图像转储到您的主目录(或您在相机配置中指定的路径)中。

然后您应该能够正常打开图像,即使用 PIL。

如果您不想设置文件服务器,可以尝试直接使用 urllib2 抓取数据,请参阅页面了解如何处理登录。有一些机会通过获取数据来获取数据,您将能够提取视频流,但我认为 ftp 选项会容易得多。

于 2013-02-20T01:10:15.507 回答
0

我不熟悉 dlink DCS-30 的具体工作原理,但我有一个较早的型号,即 dlink DCS-20,并且有相同的目标,所以也许你可以利用我的 DCS-20 解决方案,或者它的一部分, 为 DCS-30 解决相同的问题。

关键只是解析内置 Web 浏览器访问提供的 HTML。

外部模块请求、PIL 和 BeautifulSoup 简化了解决方案。

假设您的摄像头 IP 是 192.168.0.20,并且您已经通过 webadmin 设置了一个用户登录到 user1/pw1 的摄像头,这里是解决方案的关键:

from StringIO import StringIO

import requests
from PIL import Image
from bs4 import BeautifulSoup

DCS_IP = "192.168.0.20"
userauth = ('user1', 'pw1')

snapurl = "http://" + DCS_IP + "/top.htm"

r = requests.get(snapurl, auth=userauth)
soup = BeautifulSoup(r.content)

# There are several <img> tags in page, so use border=0 attribute of 
# objective <img> to distinguish it
imgtag = soup.find_all("img", attrs={'border':0})
imgsrc = BeautifulSoup(str(imgtag[0])).img['src']
imgurl = "http://" + DCS_IP + "/" + imgsrc

img = requests.get(imgurl, auth=userauth)
i = Image.open(StringIO(img.content))
i.save("snapshot.png")

检索到图像 (i) 后,您可以使用 PIL 进行进一步操作,或者之后使用 ffmpeg 将生成的图像集拼接成延时视频。

高温高压

于 2014-01-13T01:49:30.590 回答