参考:https://github.com/quatanium/python-onvif

在《海康相机之onvif测试工具使用》这篇文章中,介绍了利用onvif测试工具来调试海康相机,并且介绍了如何配置海康相机。

本文将介绍如何调用onvif协议的接口,来实现代码控制海康相机云台转动,查询的大多数代码是使用C++来实现,感觉有点复杂,本文直接采用python接口来实现。C版本的请查看《ONVIF协议开发之网络摄像头云台控制(C版)》

1 安装python-onvif

1.1 pip安装

python官方已经提供了onvif包的安装,因此可直接通过pip来安装,如下

pip2 install onvif

要注意这里pip必须对应python2,如果对应是python3可能会有问题,因此为了避免这种问题,建议采用如下的源码安装

1.2 源码安装

git clone https://github.com/quatanium/python-onvif

cd python-onvif

python2 setup.py install

1.3 安装测试

安装成功后,运行python2,输入以下语句,不报错即安装成功

from onvif import ONVIFCamera

2 连续运动(python2版本)

在python-onvif安装包中,有examples文件夹,其中有个continuous_move.py文件,代码如下

from time import sleep

from onvif import ONVIFCamera

XMAX = 1

XMIN = -1

YMAX = 1

YMIN = -1

def perform_move(ptz, request, timeout):

# Start continuous move

ptz.ContinuousMove(request)

# Wait a certain time

sleep(timeout)

# Stop continuous move

ptz.Stop({'ProfileToken': request.ProfileToken})

def move_up(ptz, request, timeout=1):

print 'move up...'

request.Velocity.PanTilt._x = 0

request.Velocity.PanTilt._y = YMAX

perform_move(ptz, request, timeout)

def move_down(ptz, request, timeout=1):

print 'move down...'

request.Velocity.PanTilt._x = 0

request.Velocity.PanTilt._y = YMIN

perform_move(ptz, request, timeout)

def move_right(ptz, request, timeout=1):

print 'move right...'

request.Velocity.PanTilt._x = XMAX

request.Velocity.PanTilt._y = 0

perform_move(ptz, request, timeout)

def move_left(ptz, request, timeout=1):

print 'move left...'

request.Velocity.PanTilt._x = XMIN

request.Velocity.PanTilt._y = 0

perform_move(ptz, request, timeout)

def continuous_move():

mycam = ONVIFCamera('192.168.0.112', 80, 'admin', '12345')

# Create media service object

media = mycam.create_media_service()

# Create ptz service object

ptz = mycam.create_ptz_service()

# Get target profile

media_profile = media.GetProfiles()[0]

# Get PTZ configuration options for getting continuous move range

request = ptz.create_type('GetConfigurationOptions')

request.ConfigurationToken = media_profile.PTZConfiguration._token

ptz_configuration_options = ptz.GetConfigurationOptions(request)

request = ptz.create_type('ContinuousMove')

request.ProfileToken = media_profile._token

ptz.Stop({'ProfileToken': media_profile._token})

# Get range of pan and tilt

# NOTE: X and Y are velocity vector

global XMAX, XMIN, YMAX, YMIN

XMAX = ptz_configuration_options.Spaces.ContinuousPanTiltVelocitySpace[0].XRange.Max

XMIN = ptz_configuration_options.Spaces.ContinuousPanTiltVelocitySpace[0].XRange.Min

YMAX = ptz_configuration_options.Spaces.ContinuousPanTiltVelocitySpace[0].YRange.Max

YMIN = ptz_configuration_options.Spaces.ContinuousPanTiltVelocitySpace[0].YRange.Min

# move right

move_right(ptz, request)

# move left

move_left(ptz, request)

# Move up

move_up(ptz, request)

# move down

move_down(ptz, request)

if __name__ == '__main__':

continuous_move()

将第43行函数里的IP、用户名、密码修改为自己相机的参数,比如我的相机参数如下

mycam = ONVIFCamera('192.168.170.*', 80, 'admin', '**')

然后运行python2 continuous_move.py,相机云台即可分别实现右左上下运动,参考此代码我们便可以编写我们自己的运动控制程序

============2019.8.15更新=============

3 连续运动(python3版本)

前端时间经过测试,把Python3版本的调通了,安装方法如下

pip3 install --upgrade onvif_zeep

连续运动代码

from time import sleep

from onvif import ONVIFCamera

import zeep

XMAX = 1

XMIN = -1

YMAX = 1

YMIN = -1

def zeep_pythonvalue(self, xmlvalue):

return xmlvalue

def perform_move(ptz, request, timeout):

# Start continuous move

ptz.ContinuousMove(request)

# Wait a certain time

sleep(timeout)

# Stop continuous move

ptz.Stop({'ProfileToken': request.ProfileToken})

def move_up(ptz, request, timeout=1):

print('move up...')

request.Velocity.PanTilt.x = 0

request.Velocity.PanTilt.y = YMAX

perform_move(ptz, request, timeout)

def move_down(ptz, request, timeout=1):

print('move down...')

request.Velocity.PanTilt.x = 0

request.Velocity.PanTilt.y = YMIN

perform_move(ptz, request, timeout)

def move_right(ptz, request, timeout=1):

print('move right...')

request.Velocity.PanTilt.x = XMAX

request.Velocity.PanTilt.y = 0

perform_move(ptz, request, timeout)

def move_left(ptz, request, timeout=1):

print('move left...')

request.Velocity.PanTilt.x = XMIN

request.Velocity.PanTilt.y = 0

perform_move(ptz, request, timeout)

def continuous_move():

mycam = ONVIFCamera('192.168.170.**', 80, 'admin', '**')

# Create media service object

media = mycam.create_media_service()

# Create ptz service object

ptz = mycam.create_ptz_service()

# Get target profile

zeep.xsd.simple.AnySimpleType.pythonvalue = zeep_pythonvalue

media_profile = media.GetProfiles()[0]

# Get PTZ configuration options for getting continuous move range

request = ptz.create_type('GetConfigurationOptions')

request.ConfigurationToken = media_profile.PTZConfiguration.token

ptz_configuration_options = ptz.GetConfigurationOptions(request)

request = ptz.create_type('ContinuousMove')

request.ProfileToken = media_profile.token

ptz.Stop({'ProfileToken': media_profile.token})

if request.Velocity is None:

request.Velocity = ptz.GetStatus({'ProfileToken': media_profile.token}).Position

request.Velocity = ptz.GetStatus({'ProfileToken': media_profile.token}).Position

request.Velocity.PanTilt.space = ptz_configuration_options.Spaces.ContinuousPanTiltVelocitySpace[0].URI

request.Velocity.Zoom.space = ptz_configuration_options.Spaces.ContinuousZoomVelocitySpace[0].URI

# Get range of pan and tilt

# NOTE: X and Y are velocity vector

global XMAX, XMIN, YMAX, YMIN

XMAX = ptz_configuration_options.Spaces.ContinuousPanTiltVelocitySpace[0].XRange.Max

XMIN = ptz_configuration_options.Spaces.ContinuousPanTiltVelocitySpace[0].XRange.Min

YMAX = ptz_configuration_options.Spaces.ContinuousPanTiltVelocitySpace[0].YRange.Max

YMIN = ptz_configuration_options.Spaces.ContinuousPanTiltVelocitySpace[0].YRange.Min

# move right

move_right(ptz, request)

# move left

move_left(ptz, request)

# Move up

move_up(ptz, request)

# move down

move_down(ptz, request)

if __name__ == '__main__':

continuous_move()

4 绝对运动(python3版本)

仿照连续运动的实例,结合onvif协议,可以写绝对运动的控制程序

from time import sleep

from onvif import ONVIFCamera

import zeep

XMAX = 1

XMIN = -1

YMAX = 1

YMIN = -1

def zeep_pythonvalue(self, xmlvalue):

return xmlvalue

def perform_move(ptz, request, timeout):

# Start continuous move

ptz.ContinuousMove(request)

# Wait a certain time

sleep(timeout)

# Stop continuous move

ptz.Stop({'ProfileToken': request.ProfileToken})

def absolute_move():

pan = 0

pan_speed = 1

tilt = 0

tilt_speed = 1

zoom = 1

zoom_speed = 1

mycam = ONVIFCamera('192.168.170.**', 80, 'admin', '**')

# Create media service object

media = mycam.create_media_service()

# Create ptz service object

ptz = mycam.create_ptz_service()

# Get target profile

zeep.xsd.simple.AnySimpleType.pythonvalue = zeep_pythonvalue

media_profile = media.GetProfiles()[0]

# Get PTZ configuration options for getting absolute move range

request = ptz.create_type('GetConfigurationOptions')

request.ConfigurationToken = media_profile.PTZConfiguration.token

# ptz_configuration_options = ptz.GetConfigurationOptions(request)

request = ptz.create_type('AbsoluteMove')

request.ProfileToken = media_profile.token

ptz.Stop({'ProfileToken': media_profile.token})

if request.Position is None:

request.Position = ptz.GetStatus({'ProfileToken': media_profile.token}).Position

if request.Speed is None:

request.Speed = ptz.GetStatus({'ProfileToken': media_profile.token}).Position

request.Position.PanTilt.x = pan

request.Speed.PanTilt.x = pan_speed

request.Position.PanTilt.y = tilt

request.Speed.PanTilt.y = tilt_speed

request.Position.Zoom = zoom

request.Speed.Zoom = zoom_speed

ptz.AbsoluteMove(request)

print('finish')

if __name__ == '__main__':

absolute_move()

python控制摄像头云台_python-onvif实现客户端控制相机云台相关推荐

  1. python控制摄像头拍照_python+opencv+pyqt5控制摄像头在Qlabel上显示

    import cv2 import numpy as numpy from PIL import * import sys from PyQt5.QtWidgets import * from PyQ ...

  2. python读取摄像头数据_python 读取摄像头数据并保存的实例

    python如何能采集多个摄像头的数据 .要用opencv吗?听说这个问题不好解决啊只有把自己过得像王后一样,才能吸引你想要的国王. 可以,用PYQT+CV2,四个USB连接成功,程序如下,UI要自己 ...

  3. 用python实现流程自动化_Python自动化开发 - 流程控制

    一.拾遗主题 1.变量 理解变量在计算机内存中的表示 >>> a = "ABC" Python解释器干了两件事情: 在内存中创建了一个'ABC'的字符串: 在内存 ...

  4. python while语法结构_python语法之流程控制(if while for)

    一.python语法之流程控制 1.1什么是流程控制? 流程控制即控制流程,具体指控制程序的执行流程,而程序的执行流程分为三种结构:顺序结构(之前我们写的代码都是顺序结构).分支结构(判断).循环结构 ...

  5. python 高性能http服务器_Python高性能HTTP客户端

    Python中有许多HTTP客户端.使用最广泛且最容易的是requests. 持续连接 持续连接是自HTTP 1.1以来的标准,尽管许多应用程序并未使用它们.以简单模式使用请求时(例如使用get函数) ...

  6. python获取摄像头型号_python opencv设置摄像头分辨率以及各个参数的方法_python

    下面就为大家分享一篇python opencv设置摄像头分辨率以及各个参数的方法,具有很好的参考价值,希望对大家有所帮助.一起过来看看吧 1,为了获取视频,你应该创建一个 VideoCapture 对 ...

  7. python opencv 摄像头亮度_Python 下opencv 应用: 摄像头参数设置

    为了取得好的图片效果,我们需要设置摄像头的参数. 假如摄像流为 cap, 那么设置参数是cap.set(参数编号,参数) 获取参数值的函数是  cap.get(参数编号) 看一段摄像头参数设置读取的例 ...

  8. python控制led屏_python轮询机制控制led实例

    我就废话不多说了,大家还是直接看代码吧! # -*- coding:utf-8 -*- # File: ceshitianqi import urllib2 import json import ti ...

  9. python socket通信 心跳_Python Socket 多客户端心跳监测 | kTWO-个人博客

    # coding:utf8 import socket import time import thread #接受心跳包 def get_hart(host, port): global clien_ ...

  10. python网络编程证书_python 网络编程——客户端

    网络通信的基本接口是socket,它扩展了操作系统的基本I/O到网络网络通信.socket可以通过socket()函数来建立,通过connect()函数来连接.得到了socket,可以确定本地和远程端 ...

最新文章

  1. 秒杀系统怎么设计?8张图带你搞定!
  2. R语言使用magick包的image_border函数和image_background函数自定义图像的边界和背景(Change image border and background)
  3. ubuntu 为用户添加组
  4. matlab-画图函数:scatter和plot
  5. 回溯法:批量作业调度
  6. 实现div里的img图片水平垂直居中
  7. .NET平台及C#面向对象编程
  8. 程序员在编程中遇到的奇葩弱智问题(转)
  9. 更新.xsd后,rdlc 数据源更新不了
  10. 计算机键盘快速指南,菜鸟必看 Windows键盘快捷键入门指南
  11. java docx4j 使用教程_使用Docx4j操作PPT指南系列(二)
  12. 06_JavaEE回顾笔记Ⅱ
  13. __attribute__ 关键字小结
  14. 【新年礼物】分享十个珍藏学习编程的网站,助大家2022如虎添翼
  15. NLP揭秘:除了宝石,女儿也是灭霸的真爱(附代码)
  16. 大陆、港澳台身份证、护照、军官证的正则表达式
  17. 代码随想录贪心算法——买卖股票的最佳时机含手续费
  18. MySQL数据库 - 初识MySQL
  19. 快速一站式搭建免费个人网站/博客 /Blog
  20. 软件设计的三重境界:守-破-离

热门文章

  1. 电脑键盘部分按键失灵_笔记本电脑部分按键失灵,可能的原因有哪些?
  2. 浅谈MATLAb中imcrop()函数
  3. This request has been blocked; the content must be served over HTTPS.
  4. html style设置靠右,css怎么设置右对齐
  5. 毛毛虫 树形DP
  6. 数据可视化专属配色方案
  7. [实用技巧]如何关闭VS中烦人的reference提示
  8. .frx文件扩展的细节-文件扩展名 数据库
  9. 程序员那些你不知道的事:高收入程序员年薪高于50万,近四成程序员单身
  10. bzoj1488[HNOI2009] 图的同构