使用ONVIF协议控制海康威视球机

 运行前应检测摄像头是否开启onvif协议,并添加添加用户:

               配置->网络->高级配置->集成协议:

                        开启开放型网络视频接口

                        添加用户

import time
import zeep
import requests
from onvif import ONVIFCamera
from requests.auth import HTTPDigestAuth


def zeep_pythonvalue(self, xmlvalue):
    return xmlvalue


# ########################## Move Camera ##########################
class CameraZoom:

    def __init__(self, ip="172.22.49.9", port=80, username="abcd", password="123456"):
        mycam = ONVIFCamera(ip, port, username, password)
        mycam.devicemgmt.GetServices(False)
        media = mycam.create_media_service()        # Create media service object
        self.ptz = mycam.create_ptz_service()            # Create self.ptz service object

        # Get target profile
        zeep.xsd.simple.AnySimpleType.pythonvalue = zeep_pythonvalue
        media_profile = media.GetProfiles()[0]
        self.ptz.Stop({'ProfileToken': media_profile.token})

        # Get PTZ configuration options for getting continuous move range
        config = self.ptz.create_type('GetConfigurationOptions')
        config.ConfigurationToken = media_profile.PTZConfiguration.token
        ptz_configuration_options = self.ptz.GetConfigurationOptions(config)

        # RelativeMove
        self.requestr = self.ptz.create_type('RelativeMove')
        self.requestr.ProfileToken = media_profile.token
        if self.requestr.Translation is None:
            self.requestr.Translation = self.ptz.GetStatus({'ProfileToken': media_profile.token}).Position
            self.requestr.Translation.PanTilt.space = ptz_configuration_options.Spaces.RelativePanTiltTranslationSpace[0].URI
            self.requestr.Translation.Zoom.space = ptz_configuration_options.Spaces.RelativeZoomTranslationSpace[0].URI
        if self.requestr.Speed is None:
            self.requestr.Speed = self.ptz.GetStatus({'ProfileToken': media_profile.token}).Position
            self.requestr.Speed.PanTilt.space = ptz_configuration_options.Spaces.RelativePanTiltTranslationSpace[0].URI
            self.requestr.Speed.Zoom.space = ptz_configuration_options.Spaces.RelativeZoomTranslationSpace[0].URI

        # AbsoluteMove
        self.requesta = self.ptz.create_type('AbsoluteMove')
        self.requesta.ProfileToken = media_profile.token
        if self.requesta.Position is None:
            self.requesta.Position = self.ptz.GetStatus({'ProfileToken': media_profile.token}).Position
            self.requesta.Position.PanTilt.space = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].URI
            self.requesta.Position.Zoom.space = ptz_configuration_options.Spaces.AbsoluteZoomPositionSpace[0].URI
        if self.requesta.Speed is None:
            self.requesta.Speed = self.ptz.GetStatus({'ProfileToken': media_profile.token}).Position
            self.requesta.Speed.PanTilt.space = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].URI
            self.requesta.Speed.Zoom.space = ptz_configuration_options.Spaces.AbsoluteZoomPositionSpace[0].URI

        # CurrentStatus
        params = self.ptz.create_type('GetStatus')
        params.ProfileToken = media_profile.token
        self.res = self.ptz.GetStatus(params)

        # variables
        self.default = False
        self.defaultx = None
        self.defaulty = None
        self.defaultzoom = None
        self.x_speed = 3
        self.y_speed = 3
        self.zoom_speed = 3

        self.zoomflag = 0


    def addFlag(self):
        self.zoomflag += 1


    def preformRelativeMove(self, xshift, yshift, zoom):

        # record origin position
        if self.default is False:
            # set default
            cx, cy, cz = self.getCurrentStatus()
            self.default = True
            self.defaultx = cx
            self.defaulty = cy
            self.defaultzoom = cz

        # RelativeMove
        self.requestr.Translation.PanTilt.x = xshift
        self.requestr.Speed.PanTilt.x = self.x_speed
        self.requestr.Translation.PanTilt.y = yshift
        self.requestr.Speed.PanTilt.y = self.y_speed
        self.requestr.Translation.Zoom = zoom
        self.requestr.Speed.Zoom = self.zoom_speed

        self.ptz.RelativeMove(self.requestr)
        print('finish relative_move')


    def preformAbsoluteMove(self):
        # AbsoluteMove

        if self.default is True:
            self.requesta.Position.PanTilt.x = self.defaultx
            self.requesta.Speed.PanTilt.x = self.x_speed
            self.requesta.Position.PanTilt.y = self.defaulty
            self.requesta.Speed.PanTilt.y = self.y_speed
            self.requesta.Position.Zoom = self.defaultzoom
            self.requesta.Speed.Zoom = self.zoom_speed

            self.ptz.AbsoluteMove(self.requesta)
            print('finish absolute_move')

        else:
            print('default is False, do not perform absolute move')

        # reset
        self.default = False
        self.defaultx = None
        self.defaulty = None
        self.defaultzoom = None

        self.zoomflag = 0


    def getCurrentStatus(self):
        #获取当前位置信息

        pantilt = self.res['Position']['PanTilt']
        zoom = self.res['Position']['Zoom']
        
        cx = pantilt['x']
        cy = pantilt['y']
        cz = zoom['x']

        return (cx, cy, cz)



测试脚本

from camera_zoom import CameraZoom

cam = CameraZoom()

for i in range(100):

    num = int(input("2:down, 4:left, 8:up, 6:right, 1:enlarge, 3:shrink -> "))

    if num == 2:
        cam.preformRelativeMove(0, -0.04, 0)

    elif num == 4:
        cam.preformRelativeMove(-0.04, 0, 0)

    elif num == 6:
        cam.preformRelativeMove(0.04, 0, 0)

    elif num == 8:
        cam.preformRelativeMove(0, 0.04, 0)

    elif num == 1:
        cam.preformRelativeMove(0, 0, 0.02)

    elif num == 3:
        cam.preformRelativeMove(0, 0, -0.02)

    else:
        break

其他相关代码

import time
from onvif import ONVIFCamera
import zeep
import requests
from requests.auth import HTTPDigestAuth
 
 
def zeep_pythonvalue(self, xmlvalue):
    return xmlvalue


def continuous_move():
    x = 0#0.001                   # 360 : (left)-1 ~ +1(right)
    y = -0.004                   # 180 : (up)-1 ~ +1(down)
    zoom = 0#0.02                      # (min)0 ~ 1(max)

    mycam = ONVIFCamera("172.22.49.9", 80, "abcd", "wl123456")
    # 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
    config = ptz.create_type('GetConfigurationOptions')
    config.ConfigurationToken = media_profile.PTZConfiguration.token
    ptz_configuration_options = ptz.GetConfigurationOptions(config)
    
    request = self.ptz.create_type('ContinuousMove')
    request.ProfileToken = media_profile.token
    ptz.Stop({'ProfileToken': media_profile.token})
    if request.Velocity is None:
        request.Velocity = self.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
    
    #持续移动
    request.Velocity.PanTilt.x = x
    request.Velocity.PanTilt.y = y
    request.Velocity.Zoom = zoom

    ptz.ContinuousMove(request)
    time.sleep(timeout)
    ptz.Stop({'ProfileToken': request.ProfileToken})
    print('finish continuous_move')



def relative_move():
    x = 0#0.004                   # 360 : (left)-1 ~ +1(right)
    x_speed = 1
    y = 0.004                   # 180 : (up)-1 ~ +1(down)
    y_speed = 1
    zoom = 0#0.02                      # (min)0 ~ 1(max)
    zoom_speed = 1


    mycam = ONVIFCamera("172.22.49.9", 80, "abcd", "wl123456")
    # 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
    config = ptz.create_type('GetConfigurationOptions')
    config.ConfigurationToken = media_profile.PTZConfiguration.token
    ptz_configuration_options = ptz.GetConfigurationOptions(config)

    requestr = ptz.create_type('RelativeMove')
    requestr.ProfileToken = media_profile.token
    ptz.Stop({'ProfileToken': media_profile.token})

    if requestr.Translation is None:
        requestr.Translation = ptz.GetStatus({'ProfileToken': media_profile.token}).Position
        requestr.Translation.PanTilt.space = ptz_configuration_options.Spaces.RelativePanTiltTranslationSpace[0].URI
        requestr.Translation.Zoom.space = ptz_configuration_options.Spaces.RelativeZoomTranslationSpace[0].URI
    if requestr.Speed is None:
        requestr.Speed = ptz.GetStatus({'ProfileToken': media_profile.token}).Position
        requestr.Speed.PanTilt.space = ptz_configuration_options.Spaces.RelativePanTiltTranslationSpace[0].URI
        requestr.Speed.Zoom.space = ptz_configuration_options.Spaces.RelativeZoomTranslationSpace[0].URI

    #相对移动
    requestr.Translation.PanTilt.x = x
    requestr.Speed.PanTilt.x = x_speed
    requestr.Translation.PanTilt.y = y
    requestr.Speed.PanTilt.y = y_speed
    requestr.Translation.Zoom = zoom
    requestr.Speed.Zoom = zoom_speed

    ptz.RelativeMove(requestr)
    print('finish relative_move')


#坐标跳转
def absolute_move():
    x = -0.415                    # 360 : (left)-1 ~ +1(right)
    x_speed = 2
    y = -0.374                   # 180 : (up)-1 ~ +1(down)
    y_speed = 2
    zoom = 0.4                      # (min)0 ~ 1(max)
    zoom_speed = 1
 
    mycam = ONVIFCamera("172.22.49.9", 80, "abcd", "wl123456")
    # 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
    config = ptz.create_type('GetConfigurationOptions')
    config.ConfigurationToken = media_profile.PTZConfiguration.token
    ptz_configuration_options = ptz.GetConfigurationOptions(config)

    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
        request.Position.PanTilt.space = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].URI
        request.Position.Zoom.space = ptz_configuration_options.Spaces.AbsoluteZoomPositionSpace[0].URI
    if request.Speed is None:
        request.Speed = ptz.GetStatus({'ProfileToken': media_profile.token}).Position
        request.Speed.PanTilt.space = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].URI
        request.Speed.Zoom.space = ptz_configuration_options.Spaces.AbsoluteZoomPositionSpace[0].URI
 
    request.Position.PanTilt.x = x
    request.Speed.PanTilt.x = x_speed
    request.Position.PanTilt.y = y
    request.Speed.PanTilt.y = y_speed
    request.Position.Zoom = zoom
    request.Speed.Zoom = zoom_speed

    ptz.AbsoluteMove(request)
    print('finish absolute_move')


#抓图
def snap():
    # Get target profile
    zeep.xsd.simple.AnySimpleType.pythonvalue = zeep_pythonvalue
    mycam = ONVIFCamera("172.22.49.9", 80, "abcd", "wl123456")
    media = mycam.create_media_service()  # 创建媒体服务
    media_profile = media.GetProfiles()[0]  # 获取配置信息
    res = media.GetSnapshotUri({'ProfileToken': media_profile.token})
    response = requests.get(res.Uri, auth=HTTPDigestAuth("zhy", "zhy12345"))
    res = "{_time}.jpg".format(_time=time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime(time.time())))
    with open(res, 'wb') as f:  # 保存截图
        f.write(response.content)
 
 
#预置位跳转
def gotoPreset():
    zeep.xsd.simple.AnySimpleType.pythonvalue = zeep_pythonvalue
    mycam = ONVIFCamera("172.22.49.9", 80, "abcd", "wl123456")
    media = mycam.create_media_service()
    ptz = mycam.create_ptz_service()
    params = ptz.create_type('GotoPreset')
    media_profile = media.GetProfiles()[0]  # 获取配置信息
    print(media_profile.token)
    params.ProfileToken = media_profile.token
    params.PresetToken = 1
    re = ptz.GotoPreset(params)
    print(re)
 
 
#获取当前位置信息
def getStatus():
    mycam = ONVIFCamera("172.22.49.9", 80, "abcd", "wl123456")
    media = mycam.create_media_service()
    ptz = mycam.create_ptz_service()

    zeep.xsd.simple.AnySimpleType.pythonvalue = zeep_pythonvalue
    media_profile = media.GetProfiles()[0]  # 获取配置信息

    params = ptz.create_type('GetStatus')
    print(f"media_profile.token is {media_profile.token}")
    params.ProfileToken = media_profile.token
    res = ptz.GetStatus(params)
    print(f"res is {res}")
 
 
if __name__ == '__main__':
#    absolute_move()
#    snap()
#    gotoPreset()
    relative_move()
    getStatus()


  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答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协议控制云台是一个具有挑战性和实用性的任务,需要正确的技能和工具,并且需要快速响应进行实时监测和恰当的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值