2013-02-19 3 views
1

ВопросДоступ к видео данных с помощью Python

Как я могу взять небольшой образец текших кадров, и манипулировать ими с помощью Python? Существуют ли какие-либо доступные библиотеки, или мне придется кодировать весь проект в одиночку?

Технические характеристики

ОС: Linux

соединения: CAT-5 Ethernet

Камера: dlink DCS-930L

Введение

Я недавно спросил question, б Это было закрыто из-за проблем с ясностью.

Я переписываю с более подробной информацией, и если он еще не ясен, не стесняйтесь редактировать или добавлять комментарии.

фон

У меня есть Dlink DCS-930L камеру, которая непосредственно связана с моей Linux компьютер с прямым cat5 связи. Я назначил его статическому IP-адресу, и все отлично работает.

Когда я открываю веб-браузер и подключаюсь к этому статическому IP-адресу (например, в 192.168.0.20), камера работает правильно в режиме реального времени.

Я сделал это, чтобы убедиться, что моя камера работает, и что я смог правильно установить Ethernet-соединение.

Теперь, что мне нужно для обработки изображений на видеокадрах, которые я получаю по Ethernet от камеры.

Я больше не хочу использовать веб-браузер как средство отображения, и вместо этого я хочу использовать Python для чтения фреймов.

Другими словами, камера производит 30 кадров в секунду, и каждый кадр имеет определенный размер (например, 1920x1080 пикселей).

Все, что я хочу сделать, - это начать чтение этих кадров в Python. Я не возражаю, если мне не хватает фреймов, и если я обрабатываю их медленно. Даже если я смогу обработать один кадр за несколько секунд, я все еще в порядке.

Поскольку видео представляет собой набор изображений (в данном случае 30 изображений в секунду), я хочу иметь возможность читать эти изображения с помощью Python, а затем выполнять любую обработку, которую мне нужно делать на этих изображениях.

Если бы у меня были эти изображения, сохраненные на компьютере, я бы открывал эти изображения с помощью Python и начал ими манипулировать. Но, поскольку в этом случае изображения фактически передаются потоком, я просто хочу знать, как я могу их пробовать (возможно, один раз в несколько секунд) и делать некоторые манипуляции с помощью Python?

Пожалуйста, дайте мне знать, если мой вопрос все еще неясен, и я постараюсь его прояснить насколько могу.

Спасибо, --Rudy

+0

Зависит от того, какие форматы потокового ли поддержка камеры, я полагаю – wRAR

+0

Какую версию Python? Вы хотите, чтобы мы писали код или предоставляли библиотеки? – xxmbabanexx

+0

Я не уверен, какая версия работает на компьютере. Я должен проверить. Но что я хочу сделать довольно сложный процесс? Это даже возможно с Python? Если вы можете указать мне в каком-то направлении, я был бы признателен. Например, что связано с этим процессом? Нужно ли беспокоиться о деталях протоколов? Например, в прошлом я работал с API, написанным на C, для получения данных по ethernet, и это было очень сложно. Но, к счастью, в то время API-интерфейс помогал всем низкоуровневым протоколам UDP, и мне не нужно было об этом беспокоиться. Что такое сделка с Python? – Rudy01

ответ

0

Согласно manual, камера служит видео через Java-апплет, так что это будет bedifficult, чтобы получить доступ через питона без понимания того, что протокол сервера.

Однако у него есть возможность выталкивать изображения на ftp-сервер (стр. 34), поэтому, если вы устанавливаете vsftpd на свой linux-бокс, вы можете сказать, что камера нажимает изображения там, возможно, до 4 кадров в секунду. Есть инструкции по настройке vsftpd на ubuntu here, другие версии linux будут похожи (я, кажется, помню, что Fedora нуждалась в чуть меньшей настройке, но это было много лет назад).

Вам необходимо включить загрузку с помощью строки write_enable=YES в /etc/vsftpd.conf. Существуют различные способы обработки загрузок, самым простым из которых является регистрация в вашей учетной записи пользователя, после чего они будут удалять изображения в вашем домашнем каталоге (или путь, указанный вами в конфигурации камеры).

Затем вы должны иметь возможность нормально открывать изображения, то есть с помощью PIL.

Если вы не хотите устанавливать файловый сервер, вы можете попробовать захватить данные напрямую с помощью urllib2, см. Страницу this, где описано, как обращаться с логином. Есть некоторый шанс, обманывая вас с извлечением данных, вы сможете извлечь видеопоток, но я думаю, что опция ftp будет намного проще.

+0

Большое спасибо за подробные указания. Я попробую их всех и посмотрю, куда он меня принимает. Кстати, из любопытства я кое-что прочитал об использовании OpenCV в сочетании с Python. (например, http://tech.dir.groups.yahoo.com/group/OpenCV/message/75653). Любая идея об использовании OpenCV. Похоже, что кто-то попытался, не имел большого успеха в его запуске и запуске. Но считаете ли вы это еще одним проспектом? – Rudy01

+0

OpenCV выглядит несколько более убедительным способом захвата кадров, чем непосредственно с urllib2, но это не меняет того факта, что вам, вероятно, нужно понять, как камера служит изображениям (и в этом случае, возможно, взаимодействует с Java-апплетом). Мне тяжело узнать гораздо больше, не имея возможности сунуть в реальный рабочий экземпляр. – triplepoint217

0

Я не знаком с тем, как работает DCS-30 dlink, но у меня есть модель более раннего поколения, dlink DCS-20 и имеет ту же цель, поэтому, возможно, вы можете использовать мое решение DCS-20, или его части, чтобы решить эту проблему для DCS-30.

Ключ был просто анализом 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 для, например, сшитого результирующего изображения, установленного в видео с замедленным просмотром.

НТН

Смежные вопросы