Onvif协议控制球机云台

PTZ(Pan-Tilt-Zoom)控制云台的基本流程如下:

  1. 创建 ONVIF 设备服务对象:使用 ONVIF 协议连接到摄像头设备,并创建与设备交互的服务对象。
  2. 获取 PTZ 配置信息:通过 ONVIF 设备服务对象的 GetConfigurationOptions 方法获取摄像头支持的 PTZ 配置选项,包括 Pan、Tilt 和 Zoom 选项的范围和默认值等。
  3. 获取 PTZ 节点信息:通过 ONVIF 设备服务对象的 GetNodes 方法获取摄像头上所有的 PTZ 节点。
  4. 获取 PTZ 节点的状态:通过 ONVIF PTZ 服务对象的 GetStatus 方法获取 PTZ 节点的状态,包括当前云台的位置、缩放级别等信息。
  5. 控制云台移动:通过 ONVIF PTZ 服务对象的 ContinuousMove、RelativeMove 或 AbsoluteMove 等方法,控制云台的移动,达到调整摄像头视角的效果。
  6. 控制云台缩放:通过 ONVIF PTZ 服务对象的 ContinuousZoom、RelativeZoom 或 AbsoluteZoom 等方法,控制云台的缩放,调整摄像头的焦距。

实际进行球机控制会遇到的两个问题:

一、球机的时间要和电脑的时间是同步的,在算法验证里面如果不一致会导致返回用户名和密码错误致使无法使用Onvif协议。

二、由于库函数在获取值时返回的只有Zoom的值而无Pantilt的值,导致控制云台运动出错,故采用两种获取球机PTZ控制器配置的方法解决此问题。

通过Onvif对PTZ控制器控制的Python实际步骤:

需要导入的库和变量的初始化:

例如:

from time import sleep

from onvif import ONVIFCamera

import zeep

XMAX = 1

XMIN = -1

YMAX = 1

YMIN = -1

1.利用ONVIFCamera函数初始化对象

例如;mycam = ONVIFCamera('192.168.0.108', 80, 'admin', '8756933...')

2.利用create_service()创建服务对象

需要创建两个服务对象

media = mycam.create_media_service()#创建media服务对象

ptz = mycam.create_ptz_service()#创建ptz服务对象

3.创建zeep_pythonvalue()函数

例如;def zeep_pythonvalue(self, xmlvalue):

      return xmlvalue

在获取配置参数前需要运用编写的zeep_pythonvalue()函数

zeep.xsd.simple.AnySimpleType.pythonvalue = zeep_pythonvalue #

4.获取PTZ配置参数

 media_profile = media.GetProfiles()[0]

5.创建节点

例如: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})

6.通过GetConfigurations()再次获取PTZ配置参数 ,原media_profile中缺少pantilt,此时补上

    ptz_configuration_list = ptz.GetConfigurations()

    a = ptz_configuration_list[0].DefaultPTZSpeed

b = a.PanTilt

    #b为从PTZ控制器中提取的有关Pantilt的参数

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

request.Velocity.PanTilt=b

  1. 设计最大最小值

global XMAX, XMIN, YMAX, YMIN

XMAX = 1

XMIN = -1

YMAX = 1

YMIN = -1

  1. 调用设定的函数对云台进行控制

例如:

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

    print('move up...')

    request.Velocity.PanTilt.x = 0

    request.Velocity.PanTilt.y = YMAX

    request.Velocity.Zoom.x= 0

perform_move(ptz, request, timeout)

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})

本例子给了move_up如果是down则变化 request.Velocity.PanTilt.y=YMIN类推

  1. 调用设定的zoom函数对倍数进行控制

例如;

def zoom(ptz,request,zoomdata,timeout=1):

    """

    变焦

    :param zoom: 1为拉近或-1为远离

    :param timeout: 生效时间

    :return:

    """

    request.Velocity.PanTilt.x = 0

    request.Velocity.PanTilt.y = 0

    request.Velocity.Zoom.x=zoomdata

    print(request.Velocity)

perform_move(ptz, request, timeout)

调用时设置datazoom为-1则为远离,1则为放大。

  这篇博文的代码,通过onvif达到控制相机截图、移动到预置点、PTZ控制的功能,已验证,可以顺利跑通,对于新手很好用:

Python3-onvif协议之相机截图、相机获取预置点、移动到预置点 - 简书 (jianshu.com)

最后为博主改动的PTZ控制的原程序,此程序实现了左右上下转:

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
    request.Velocity.Zoom.x= 0
    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
    request.Velocity.Zoom.x= 0
    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
    request.Velocity.Zoom.x = 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
    request.Velocity.Zoom.x=0
    perform_move(ptz, request, timeout)


def continuous_move():
    mycam = ONVIFCamera('192.168.0.xx', 80, 'admin', 'password')
    #初始化
    media = mycam.create_media_service()
    #创建media服务对象
    ptz = mycam.create_ptz_service()
    #创建ptz服务对象
    zeep.xsd.simple.AnySimpleType.pythonvalue = zeep_pythonvalue
    media_profile = media.GetProfiles()[0]
    #获取ptz配置参数
    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})

    ptz_configuration_list = ptz.GetConfigurations()
    #获取ptz配置参数,原media_profile中缺少pantilt,此时补上
    a = ptz_configuration_list[0].DefaultPTZSpeed
    b = a.PanTilt
    #b为从PTZ控制器中提取的有关Pantilt的参数
    request.Velocity = ptz.GetStatus({'ProfileToken': media_profile.token}).Position

    request.Velocity.PanTilt=b
    print(request.Velocity)


    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
    XMAX = 1
    XMIN = -1
    YMAX = 1
    YMIN = -1

    # 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()
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: Onvif协议是一种用于网络视频监控设备之间通信的协议,能够提供一种简单、标准化的接口,使得大多数监控设备之间容易实现互操作。Java onvif协议是利用Java语言开发的一个基于Onvif协议控制云台的解决方案。 Java onvif协议可以帮助用户轻松地控制监控设备,特别是能够控制云台。它基于Onvif协议,提供了丰富的SDK接口,并且支持多种编程语言,如Java、C++和C#等,使得开发者能够轻松地开发出功能强大的监控设备控制软件。 Java onvif协议控制云台的工作原理是,首先需要获取云台控制权限,然后通过协议命令控制云台的运动,例如:上下、左右转动、缩小放大等。同时,Java onvif协议还支持多种云台协议,例如:Pelco-D、Pelco-P、Dahua等,能够与各种不同型号的云台进行适配。 在实际应用中,Java onvif协议控制云台的优点在于其易于集成、稳定性高、兼容性强,且具有较强的可扩展性,可以在不同场景下广泛应用。例如,在安防领域,Java onvif协议控制云台可以应用于视频监控、入侵报警、门禁等场景。在其他领域,例如:工业智能、交通管理等领域,Java onvif协议控制云台也具有广泛的应用前景。 ### 回答2: ONVIF是基于IP的开放式网络视频接口标准,旨在促进不同厂商的网络视频设备互相兼容和交互。Java是一种广泛使用的编程语言,可用于开发各种类型的应用程序,包括网络视频控制应用。 在Java中,我们可以使用ONVIF协议控制云台。这通常涉及使用ONVIF API和SOAP协议与网络摄像机通信。通过这些API和协议,我们可以执行各种操作,如控制云台的方向和速度,设置预置位和运动轨迹等。 使用Java编写控制云台的应用程序需要一定的编程知识和经验,尤其是在处理复杂的网络摄像机系统时。但是,一旦掌握了这些技能,您就可以轻松地编写能够高效地控制云台的应用程序,尤其是在监控、安防等场景下。 综上所述,Java onvif协议控制云台是一个具有挑战性和实用性的任务,需要正确的技能和工具,并且需要快速响应进行实时监测和恰当的调整。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值