Python: IP камеры

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Python: IP камеры

Непрочитанное сообщение Olej » 25 сен 2019, 21:25

Про программы и протоколы работы с IP-камерами видеонаблюдения есть отдельная огромная тема: IP камеры видеонаблюдения.
А здесь только о том, как к этим протоколам (ONVIF & RTSP) подобраться из программного кода на Python.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python: IP камеры

Непрочитанное сообщение Olej » 25 сен 2019, 21:29

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/IP-camera$ python3 -m pip search onvif
onvif (0.2.0)               - Python Client for ONVIF Camera
onvif-zeep (0.2.12)         - Python Client for ONVIF Camera
onvif-py3 (0.1.3)           - Python Client for ONVIF Camera
onvif-zeep-async (0.2.0)    - Async Python Client for ONVIF Camera
camera-discovery (1.0.11)   - A package to discover all onvif cameras on your network
sensecam-discovery (2.0.2)  - A package to discover all onvif cameras on your network

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/IP-camera/Partizan_IP$ python3 -m pip search rtsp
rtsp (1.1.6)                                   - RTSP client
Gstreamer-Timelapse-RTSP-Server (0.0.1.post1)  - Utility for serving a timelapse over RTSP
rtsp-curl (0.6)                                - Convert rtsp.c to rtsp_curl.py
live555 (1.0)                                  - Basic wrapper around live555 to load RTSP video streams
pynvr (0.1.12)                                 - Network Video Recorder for recording h264 rtsp IP cameras
hikvision_client (0.5)                         - A graphical client software for Hikvision (and other RTSP-enabled) IP cameras

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python: IP камеры

Непрочитанное сообщение Olej » 25 сен 2019, 21:32

ONVIF:

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/IP-camera$ sudo pip3 install onvif 
[sudo] пароль для olej: 
Collecting onvif
  Downloading https://files.pythonhosted.org/packages/fc/69/70c3cec902cac1dea2cfa40d1b2d959645daf383187f0a1061ec1fb60dec/onvif-0.2.0.tar.gz (163kB)
     |████████████████████████████████| 163kB 760kB/s 
Collecting suds-passworddigest (from onvif)
  Downloading https://files.pythonhosted.org/packages/c0/4b/3a7bfb60ec93467c8bd0cd23262a871e50a093171d7e7caf2a39aebe7cd6/suds_passworddigest-0.1.2.zip
    ERROR: Command errored out with exit status 1:
     command: /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-rd6rvg21/suds-passworddigest/setup.py'"'"'; __file__='"'"'/tmp/pip-install-rd6rvg21/suds-passworddigest/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base pip-egg-info
         cwd: /tmp/pip-install-rd6rvg21/suds-passworddigest/
    Complete output (5 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-rd6rvg21/suds-passworddigest/setup.py", line 18, in <module>
        long_description=file(
    NameError: name 'file' is not defined
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
WARNING: You are using pip version 19.2.2, however version 19.2.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Т.е. этот более-менее описанный пакет не годег под Python 3;

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/IP-camera$ sudo pip2 install onvif
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Collecting onvif
  Using cached https://files.pythonhosted.org/packages/fc/69/70c3cec902cac1dea2cfa40d1b2d959645daf383187f0a1061ec1fb60dec/onvif-0.2.0.tar.gz
Collecting suds-passworddigest (from onvif)
  Using cached https://files.pythonhosted.org/packages/c0/4b/3a7bfb60ec93467c8bd0cd23262a871e50a093171d7e7caf2a39aebe7cd6/suds_passworddigest-0.1.2.zip
Collecting suds>=0.4 (from onvif)
  Downloading https://files.pythonhosted.org/packages/bc/d6/960acce47ee6f096345fe5a7d9be7708135fd1d0713571836f073efc7393/suds-0.4.tar.gz (104kB)
    100% |████████████████████████████████| 112kB 700kB/s 
Building wheels for collected packages: onvif, suds-passworddigest, suds
  Building wheel for onvif (setup.py) ... done
  Stored in directory: /root/.cache/pip/wheels/4b/97/c3/46cdd1b29639e9df0af9c25f1d86f48dccf34136fc53b85811
  Building wheel for suds-passworddigest (setup.py) ... done
  Stored in directory: /root/.cache/pip/wheels/63/39/1b/4a1714cb69d518cb86ad350d8df881d4280ac4e94bd02d5e95
  Building wheel for suds (setup.py) ... done
  Stored in directory: /root/.cache/pip/wheels/4b/15/96/768b567825a502ba3e308d50e531ee89911af21dec1958e2c5
Successfully built onvif suds-passworddigest suds
Installing collected packages: suds, suds-passworddigest, onvif
Successfully installed onvif-0.2.0 suds-0.4 suds-passworddigest-0.1.2
You are using pip version 19.0.3, however version 19.2.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Можно использовать с Python 2

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python: IP камеры

Непрочитанное сообщение Olej » 25 сен 2019, 21:34

Olej писал(а): Можно использовать с Python 2

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/IP-camera$ python2
Python 2.7.16 (default, Apr  6 2019, 01:42:57) 
[GCC 8.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import onvif
>>> from onvif import ONVIFCamera
>>> from onvif import ONVIFService, ONVIFError
>>> camera = ONVIFCamera('192.168.1.10', 8899, u'admin', '', '/usr/local/wsdl')
>>> response = camera.devicemgmt.GetDeviceInformation()
>>> response
(reply){
   Manufacturer = "Partizan"
   Model = "HI3518E_50H10L_S39"
   FirmwareVersion = "V4.02.R12.C6206510.10010.130300..ONVIF 2.4"
   SerialNumber = "b5704599fd5d0240"
   HardwareId = "00001"
 }

>>> date = camera.devicemgmt.GetSystemDateAndTime()
>>> date
(SystemDateTime){
   DateTimeType = "Manual"
   DaylightSavings = True
   TimeZone = 
      (TimeZone){
         TZ = "EAT-3"
      }
   UTCDateTime = 
      (DateTime){
         Time = 
            (Time){
               Hour = 13
               Minute = 40
               Second = 29
            }
         Date = 
            (Date){
               Year = 2019
               Month = 9
               Day = 25
            }
      }
   LocalDateTime = 
      (DateTime){
         Time = 
            (Time){
               Hour = 16
               Minute = 40
               Second = 29
            }
         Date = 
            (Date){
               Year = 2019
               Month = 9
               Day = 25
            }
      }
 }

>>> media = camera.create_media_service()

>>> camera.devicemgmt.GetDeviceInformation()
(reply){
   Manufacturer = "Partizan"
   Model = "HI3518E_50H10L_S39"
   FirmwareVersion = "V4.02.R12.C6206510.10010.130300..ONVIF 2.4"
   SerialNumber = "b5704599fd5d0240"
   HardwareId = "00001"
 }

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/IP-camera$ python2
Python 2.7.16 (default, Apr  6 2019, 01:42:57) 
[GCC 8.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from onvif import ONVIFCamera,  ONVIFService, ONVIFError
>>> camera = ONVIFCamera('192.168.1.10', 8899, u'admin', '', '/usr/local/wsdl')
>>> camera.devicemgmt.GetDeviceInformation()
(reply){
   Manufacturer = "Partizan"
   Model = "HI3518E_50H10L_S39"
   FirmwareVersion = "V4.02.R12.C6206510.10010.130300..ONVIF 2.4"
   SerialNumber = "b5704599fd5d0240"
   HardwareId = "00001"
 }
>>> media = camera.create_media_service()
>>> imag = camera.create_imaging_service()
>>> camera.get_definition( 'media' )
(http://192.168.1.10:8899/onvif/Media, '/usr/local/wsdl/media.wsdl')
>>> camera.get_definition( 'imaging' )
(http://192.168.1.10:8899/onvif/imaging, '/usr/local/wsdl/imaging.wsdl')
>>> profiles = media.GetProfiles()
>>> len( profiles )
3
>>> token = media.GetVideoEncoderConfigurations()
>>> len( token )
2
>>> ss=media.GetSnapshotUri( {"ProfileToken" : "001"} )
>>> type( ss )
<type 'instance'>

Код: Выделить всё

olej@ACER:~$ onvif-cli --help
usage: onvif-cli [-h] --host HOST [--port PORT] -u USER -a PASSWORD [-w WSDL]
                 [-e ENCRYPT] [-v] [--cache-location CACHE_LOCATION]
                 [--cache-duration CACHE_DURATION]
                 [service] [operation] [params]

ONVIF Client Command Line Interface

positional arguments:
  service               Service defined by ONVIF WSDL document
  operation             Operation to be execute defined by ONVIF WSDL document
  params                JSON format params passed to the operation.E.g.,
                        "{"Name": "NewHostName"}"

optional arguments:
  -h, --help            show this help message and exit
  --host HOST           ONVIF camera host, e.g. 192.168.2.123, www.example.com
  --port PORT           Port number for camera, default: 80
  -u USER, --user USER  Username for authentication
  -a PASSWORD, --password PASSWORD
                        Password for authentication
  -w WSDL, --wsdl WSDL  directory to store ONVIF WSDL documents
  -e ENCRYPT, --encrypt ENCRYPT
                        Encrypt password or not
  -v, --verbose         increase output verbosity
  --cache-location CACHE_LOCATION
                        location to cache suds objects, default to /tmp/onvif/
  --cache-duration CACHE_DURATION
                        how long will the cache be exist

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python: IP камеры

Непрочитанное сообщение Olej » 27 сен 2019, 21:45

Olej писал(а):

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/IP-camera/Partizan_IP$ python3 -m pip search rtsp
rtsp (1.1.6)                                   - RTSP client
Gstreamer-Timelapse-RTSP-Server (0.0.1.post1)  - Utility for serving a timelapse over RTSP
rtsp-curl (0.6)                                - Convert rtsp.c to rtsp_curl.py
live555 (1.0)                                  - Basic wrapper around live555 to load RTSP video streams
pynvr (0.1.12)                                 - Network Video Recorder for recording h264 rtsp IP cameras
hikvision_client (0.5)                         - A graphical client software for Hikvision (and other RTSP-enabled) IP cameras
Домашняя страница проекта RTSP Package
Features
- fetch a single image as Pillow Image
- open RTSP stream and poll most recent frame as Pillow Image
- preview stream in OpenCV

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/IP-camera/python-onvif$ sudo python3 -m pip install rtsp
[sudo] пароль для olej: 
Collecting rtsp
  Downloading https://files.pythonhosted.org/packages/d8/99/b494875950fcb2f13a5e8b7f8a8e7c487620259708964463fadd8836b6e7/rtsp-1.1.6-py3-none-any.whl
Collecting opencv-python (from rtsp)
  Downloading https://files.pythonhosted.org/packages/44/35/6db0fa2e644922533ddc2a3c41d1a86dabefce89d9db85ec31dcc69dc2e3/opencv_python-4.1.1.26-cp37-cp37m-manylinux1_x86_64.whl (28.7MB)
     |████████████████████████████████| 28.7MB 2.9MB/s 
Requirement already satisfied: pillow in /usr/local/lib/python3.7/dist-packages/Pillow-5.4.0-py3.7-linux-x86_64.egg (from rtsp) (5.4.0)
Requirement already satisfied: numpy>=1.14.5 in /usr/local/lib/python3.7/dist-packages (from opencv-python->rtsp) (1.16.1)
Installing collected packages: opencv-python, rtsp
Successfully installed opencv-python-4.1.1.26 rtsp-1.1.6
Numpy, Pillow и OpenCV у меня уже установлены. Возможно вам придётся их установить.

Код: Выделить всё

olej@ACER:~$ pip3 list | grep Pillow
Pillow                  5.4.0      

olej@ACER:~$ pip3 list | grep ^numpy
numpy                   1.16.1     

olej@ACER:~$ pip3 list | grep opencv
opencv-python           4.1.1.26   

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python: IP камеры

Непрочитанное сообщение Olej » 27 сен 2019, 21:56

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/IP-camera/python-onvif$ cat ex1.py
#!/bin/env python3
# -*- coding: utf-8 -*- 

import rtsp
client = rtsp.Client( rtsp_server_uri = 'rtsp://192.168.1.10:554/user=admin_password=6QNMIQGe_channel=1_stream=1.sdp' )
client.read().show()
client.close()
Откуда взялась строчка RTSP источника? Это наружная камера с фиксированным фокусом с ИК подсветкой Partizan IPO-1SP SE, см. IP камеры видеонаблюдения.

P.S. Но очень важно, чтов описании пакета сказано:
Special URIs are also recognized for convenience:
- integers will load a local USB or webcam starting with interface 0 via OpenCV e.g. rtsp.Client(0)
- 'picam' uses a Raspberry Pi camera as source e.g. rtsp.Client('picam')

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/IP-camera/python-onvif$ ./ex1.py
...
Это изображение в полной темноте с ИК-подсветкой.
Вложения
ex1.png

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Python: IP камеры

Непрочитанное сообщение Olej » 27 сен 2019, 22:05

Непрерывны просмотр потока:

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/IP-camera/python-onvif$ cat ex2.py 
#!/bin/env python3
# -*- coding: utf-8 -*- 

import rtsp

with rtsp.Client( rtsp_server_uri = 'rtsp://192.168.1.10:554/user=admin_password=6QNMIQGe_channel=1_stream=1.sdp' ) as client:
    client.preview()
То что кадр-пример затемнён - так это уже с настройками нужно разбираться.
Вложения
ex2.png
ex2.png (19.77 КБ) 2088 просмотров

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей