Работа с IP камерой. (IP camera)

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Работа с IP камерой. (IP camera)

Сообщение Sergey Ivanov »

Долго я трудился чтобы заставить IP камеру работать.

Так,что есть:
IP камера DCS-930/930L, которая подключена к ноутбуку через USB сетевую карту.
и вторая IP камера HN-VD9712IR, она подключена к роутеру. доступ к этой камере обеспечивается посредством wi-fi. (ноутбук, к которому подключена первая камера подключен по wi-fi к роутеру).

что понадобится для работы камер и встраивания видео в программу в :labview: :
1. программа iSpy
2. VLC плеер ( обязательно старая версия). новые версии в :labview: не работают. Я использовал версию 1.0.5 . Но, думаю, можно и другую версию скачать

Начнём с первой камеры. Она более популярна, много чего о ней описано на форумах. В идеале получить ссылку на видеопоток и использовать эту ссылку в VLC.
С ней, относительно просто. Заходим сюда и ищем свою камеру. Свою я нашёл, и нашёл ссылку на видеопоток:
IPADDRESS - это понятно что. в моём случае 192.168.0.20
немного переделаем ссылку, чтобы не было необходимости вводить логин и пароль.
у меня username - admin
пароль отсутствует
ссылка получается такая:
с первой камерой покончено.

Со второй было сложнее. На неё полностью отсутствовала всякая документация. В комплекте был только диск с программой, запустив которую можно было определить её IP. Ну я узнал его (192.168.1.10). Но ссылку на видео поток никак не получить.
Тут и понадобится программа iSpy
В общем, запускаем её, жмём Добавить>ONVIF камера
1111.jpg
Нажимаем на NVT
22222.jpg
В правом окне появляются доступные видеопотоки
33333.jpg
Выбираем нужный поток и жмём ОК
В окне изменить камеры ( появится после нажатия на ОК). Нажимаем на источник.
4444.jpg
В появившемся окне копируем поток для использования его в :labview: (также в программе iSpy можно проверить работоспособность камеры)
В моём случае, ссылка на видеопоток такая:
5555.jpg
rtsp://:@192.168.1.10/user=admin_password=DuTIbxbU_channel=1_stream=0.sdp?real_stream
Ну вот и всё. Собираем в :labview: небольшую программу с использованием ActiveX от VLC.

Вот такая получается и даже работает :)
6666.jpg
вот сам vi:
vlc.vi
(15.07 КБ) 779 скачиваний
ну и вопрос у меня возник. Как можно получить картинку с камеры ? У кого-нибудь есть идеи как это реализовать можно ?
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Работа с IP камерой. (IP camera)

Сообщение Sergey Ivanov »

подскажите, кто знает, плеер для проигрывания потокового видео с поддержкой ActiveX ?
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
griffinru
beginner
beginner
Сообщения: 14
Зарегистрирован: 15 ноя 2012, 03:03
Версия LabVIEW: 11
Откуда: MD, USA
Контактная информация:

Re: Работа с IP камерой. (IP camera)

Сообщение griffinru »

Сергей,
В принципе если камера имеет rtsp стрим то достаточно сделать запрос DESCRIBE и получить в ответ как к ней подключаться и работать. Посмотреть как это делается можно у меня вот здесь https://decibel.ni.com/content/docs/DOC-35217

По поводу ActiveX, то ни знаю зачем вам такой механизм поддерживается все хужу и хуже, но если нужно, то QuickTime работает с rtsp. Далее мог бы рекомендовать VLC (правда последнии версии больше ни обновлялись и с онлайн сняты, поэтому будет необходимо устанавливать VLC по полной для работы только через ActiveX). Ну и наконец можно прицепить WM, но ни для H264 стрима - иногда работает с MJPEG.

По ONVIF очень много документации и как все универсальное очень легко присоединяется, но есть определенные глюки когда хочется общаться с определенной камерой. В любом случае скачать картинку в JPG формате очень легко, показать видео через VLC или QT тоже ни составляет труда, но вот получить статус аналоговых, цифровых цепей, к детектору движения и тд может составить определенную трудность.

-Артур
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Работа с IP камерой. (IP camera)

Сообщение Sergey Ivanov »

Артур, спасибо ещё раз за помощь.
Решил воспользоваться вашим примером (VLC - Play Stream&Snapshot.vi (45.3 K) LabVIEW 11.0), он мне больше всего подходит.
Добро пожаловать на http://rk-stud.ru/
Axel
junior
junior
Сообщения: 51
Зарегистрирован: 15 ноя 2014, 17:26
Версия LabVIEW: 12
Контактная информация:

Re: Работа с IP камерой. (IP camera)

Сообщение Axel »

Скажите пожалуйста, а можно просматривать поток, не через плеер, а выдергивать из потока кадры и выводить их на image?
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Работа с IP камерой. (IP camera)

Сообщение Sergey Ivanov »

Лучше поздно чем никогда

Посмотрите тут пример VLC - Play Stream&Snapshot.vi (45.3 K)

Но, в этом случае, необходимо будет установить VLC плеер
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Работа с IP камерой. (IP camera)

Сообщение dadreamer »

Sergey Ivanov, этот пример очень полезен в плане взаимодействия с VLC, но проблему Axel не решит :) Чтобы извлечь кадры из видеопотока, нужно зарегистрировать самописные callback-функции с помощью процедуры libvlc_video_set_callbacks. После этого перестанет выводиться на Image или в отдельное окно весь видеопоток, но будут вызываться функции lock, unlock и display. В lock мы указываем буфер, куда будет помещаться каждый новый кадр из потока. В unlock можем передать этот буфер в :labview: через функцию PostLVUserEvent. Ну, а display можно даже не трогать :) Пример на C можно увидеть здесь или здесь. На :labview: , к сожалению, подобного примера пока нет...
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2206
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Работа с IP камерой. (IP camera)

Сообщение Borjomy_1 »

Возникла такая-же проблема. Кучу вариантов перепробовал, из того, что есть. Остановился на VLC плееере. В общем, решение такое - вывод изображения в .Net контейнер, в котором находится компонент "Picture Box" (Расположение: System.Windows.Forms(2.0.0.0) / PictureBox).
Прошу тех, кто работал с .Net, проконсультировать, как можно из него выдрать изображение. Какой-нибудь простенький примерчик.

Либо компонент .Net NationalInstruments.Vision.Common (NationalInstruments.Vision.WindowsForms / ImageViewer), у него есть незамысловатое свойство "Image", а у того метод "ImageToArray". Как этом можно воспользоваться?
Вложения
Получение изображения.PNG
Получение изображения.PNG (5.87 КБ) 22830 просмотров
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Работа с IP камерой. (IP camera)

Сообщение dadreamer »

Borjomy_1 писал(а):Остановился на VLC плееере.
Могу в принципе сделать пример с вариантом, описанным выше. Единственное, что требуется, - продумать архитектуру приложения. Ширина/высота картинки известна? Будет ли она меняться время от времени? Какой формат изображения (RGB32, RGB24, Grayscale, ...)? Откуда ведётся захват изображения (real-time поток с веб-камеры, например)?.. В данный момент я могу либо забить в callback-библиотеку формат константой, либо инициализировать формат каждый раз при запуске и подстраивать вывод.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2206
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Работа с IP камерой. (IP camera)

Сообщение Borjomy_1 »

dadreamer, У меня прием с IP камеры (если это о чем-то говорит IPEYE-3852P, но на реальном объекте это будет другая камера, с другим разрешением) в .Net контейнер есть. И он показывает картинку. Размер картинки 720p (1280*720). Мне нужно получить растровую картинку хотя-бы массив цветов U32, который я отображу на компоненте "Picture". Скриншотить дллкой я не могу - камера дает 20 кадров в сек.
Через Ni-Max камера не видна. Попробую поставить последние драйвера NI Device Drivers, но пока все тухло. Через VLC хоть работает.
Поэтому меня сейчас интересует принципиальная возможность выдрать изображение из контейнера средствами .Net
рабочий пример прилагаю.
Вложения
VLC - Play Stream&Snapshot Folder.zip
(57.22 КБ) 364 скачивания
Получение изображения1.PNG
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Работа с IP камерой. (IP camera)

Сообщение dadreamer »

Borjomy_1 писал(а):Поэтому меня сейчас интересует принципиальная возможность выдрать изображение из контейнера средствами .Net
Думаю, что это вряд ли возможно, если сам .NET-объект (то есть, класс в библиотеке) не предоставляет такого метода. Если только писать обёртку, перегружающую объект класса, чтобы он начал экспортировать соответствующий метод.
Теперь что касается VLC. Единственный способ выдрать кадр, что я нашёл, это использование callback'ов (см. выше). Так что согласно вашему формату и кое каким старым наработкам я состряпал вот такой :vi: . Сделано всё очень на скорую руку, но вроде как работает.
2015-03-23_21-54-01.jpg
Проверка на тестовом стриме:
2015-03-23_21-52-48.jpg
Красным на БД выделил место, где устанавливается формат видеопотока. Ещё одно место, где это нужно сделать, тут (выделено розовым):
[color=#BF0040][b]Исходник callback-библиотеки[/b][/color] писал(а):// VLC_CB.cpp : Defines the entry point for the DLL application.

#include "stdafx.h"
#include "extcode.h"
#include <stdlib.h>
#include <stdio.h>

// В этот массив будем получать кадры из видео, а потом перекидывать в LabVIEW
unsigned char * pixels = NULL;
LVBoolean DoPost = LVFALSE;
LVUserEventRef Ref = 0;
size_t ImgSize = 1280 * 720 * 4; //размер массива, куда производится рендеринг

extern "C" {
__declspec (dllexport) void * lock(void *data, void **p_pixels);
__declspec (dllexport) void unlock(void *data, void *id, void *const *ipixels);
__declspec (dllexport) void display(void *data, void *id);
__declspec (dllexport) unsigned videoFormat(void **opaque, char *chroma, unsigned *width, unsigned *height, unsigned *pitches, unsigned *lines);
__declspec (dllexport) void EnablePost();
__declspec (dllexport) void DisablePost();
__declspec (dllexport) void SetEventRef(LVUserEventRef *UserEventRef);
}

// Callback вызывается VLC плеером перед рендером кадра
__declspec (dllexport) void * lock(void *data, void **p_pixels)
{
*p_pixels = pixels; // просто указываем плееру, куда положить текущий кадр
return NULL;
}

// Вызывается плеером после lock
__declspec (dllexport) void unlock(void *data, void *id, void *const *ipixels)
{
if (DoPost)
{
PostLVUserEvent(Ref, (void *)ipixels);
}
}

// Вызывается плеером после unlock
__declspec (dllexport) void display(void *data, void *id)
{
//
}

//просмотр информации о видеоформате - в данном случае не используется
__declspec (dllexport) unsigned videoFormat(void **opaque, char *chroma, unsigned *width, unsigned *height, unsigned *pitches, unsigned *lines)
{
DbgPrintf("Video Format:");
DbgPrintf("Chroma is %s", chroma);
DbgPrintf("Width is %d", *width);
DbgPrintf("Height is %d", *height);
DbgPrintf("Pitches is %d", *pitches);
DbgPrintf("lines is %d", *lines);
return 0;
}

__declspec (dllexport) void EnablePost()
{
DoPost = LVTRUE; //можно кидать кадры
}

__declspec (dllexport) void DisablePost()
{
DoPost = LVFALSE; //нельзя кидать кадры
}

__declspec (dllexport) void SetEventRef(LVUserEventRef *UserEventRef)
{
Ref = *UserEventRef; //запоминаем ссылку на event
}

BOOL APIENTRY DllMain(HMODULE hModule,
DWORD Reason_for_call,
LPVOID lpReserved)
{
switch (Reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
//выделяем память под массив
pixels = new unsigned char[ImgSize];
}

case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
{
//освобождаем память
delete [] pixels;
break;
}
}
return TRUE;
}
В будущем могу добавить дополнительную функцию SetFormat, чтобы из :labview: установить размер кадра (массива) под рендеринг. Первоначально вывод в :labview: шёл в IMAQ-контрол, но я поставил Picture, хотя он похуже в плане качества картинки. Да, и всё это хозяйство будет работать сугубо на x32 пока что. Проверьте, если у вас на вашем потоке будет работать, то можно допиливать.
Вложения
2011.rar
VLC Callbacks - LV2011
(54.44 КБ) 434 скачивания
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2206
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Работа с IP камерой. (IP camera)

Сообщение Borjomy_1 »

Прекрасно! Оно работает.
Теперь о проблеме: Загрузка процессора составляет 40%, причем половина из этого приходится на CIN "Get Array By Pointer", из-за чего Frame Rate не поднимается выше 13 кадров в сек
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Работа с IP камерой. (IP camera)

Сообщение dadreamer »

Borjomy_1
У меня загрузка ЦП составляет ≈20% (Intel Core i7-2600 @ 3.4 ГГц, 8 Гб ОЗУ, Win 7 x64). В Event Inspector'е постоянно проскакивает Timeout, значит, пропуска кадров нет. Сделал вывод FPS и действительно видно, что частота не более 15 кадров/с. Если убрать мат. обработку массива, то она увеличивается до 23-24 кадров/с.
VLC Callback Test2.vi
lv2011
(44.36 КБ) 351 скачивание
Так что, по-видимому, программа банально не успевает дёргать кадры, причём это вина не только :labview: , но и VLC. Может быть, поместить RGBA-ARGB преобразование и вывод в отдельный поток?.. Не совсем ясно, как лучше поступить. Можно ещё попробовать вариант без Event'а - в цикле While брать кадры из массива, тогда вроде бы потоки получаются развязаны. Хотя и в случае Event'а должно было бы быть переполнение очереди событий, если бы не хватало производительности. Чего лично я не вижу нигде. :dntknw:

upd:
Не туда смотрел всё это время :D Пропуск кадров действительно имеется:
2015-03-24_15-34-44.jpg
Так что вывод таков: выносить полностью куда-то в отдельный поток всю обработку данных. Или, может, у вас есть какие-то предложения, как ускорить обработку?
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2206
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Работа с IP камерой. (IP camera)

Сообщение Borjomy_1 »

В первую очередь очень тормозит CIN GetArrayByPointer, хотя его задача только скопировать 4Мб памяти. Но он тормозит больше, чем вся обработка и вывод Picture.
Есть такой пример https://decibel.ni.com/content/docs/DOC-15159
В нем делается копия данных через Marshal Copy (source, destination, startIndex, length). Может, ее как-то прикрутить вместо CIN? У меня не удается преобразовать ваш BufPtr в System.IntPtr Класс
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Работа с IP камерой. (IP camera)

Сообщение dadreamer »

Borjomy_1, посмотрите мой второй пример.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приборами»