本文简单介绍一下python37版本通过onvif协议控制摄像头云台移动。
首先准备环境,需要安装onvif-zeep
直接上代码
from onvif import ONVIFCamera
import zeep
def zeep_pythonvalue(self, xmlvalue):
return xmlvalue
cameraConnection = ONVIFCamera("ip", "port", "username", "password")
media = cameraConnection.create_media_service()
# Create ptz service object
ptz = cameraConnection.create_ptz_service()
# Get target profile
zeep.xsd.simple.AnySimpleType.pythonvalue = self.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 = 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
requesta = self.ptz.create_type('AbsoluteMove')
requesta.ProfileToken = media_profile.token
ptz.Stop({'ProfileToken': media_profile.token})
if requesta.Position is None:
requesta.Position = self.ptz.GetStatus({'ProfileToken': media_profile.token}).Position
requesta.Position.PanTilt.space = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].URI
requesta.Position.Zoom.space = ptz_configuration_options.Spaces.AbsoluteZoomPositionSpace[0].URI
if requesta.Speed is None:
requesta.Speed = ptz.GetStatus({'ProfileToken': media_profile.token}).Position
requesta.Speed.PanTilt.space = ptz_configuration_options.Spaces.AbsolutePanTiltPositionSpace[0].URI
requesta.Speed.Zoom.space = ptz_configuration_options.Spaces.AbsoluteZoomPositionSpace[0].URI
requestr = self.ptz.create_type('RelativeMove')
requestr.ProfileToken = media_profile.token
ptz.Stop({'ProfileToken': media_profile.token})
if requestr.Translation is None:
requestr.Translation = self.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 = self.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
#绝对移动
requesta.Position.PanTilt.x = 0.1
requesta.Position.PanTilt.y = 0.1
requesta.Position.Zoom = 0 #取值范围在0~1之间
ptz.AbsoluteMove(requesta)
#相对移动
requestr.Translation.PanTilt.x = float(0.1)
requestr.Translation.PanTilt.y = float(-0.1)
requestr.Translation.Zoom = float(0.1)
requestr.Speed.PanTilt.x = 1
requestr.Speed.PanTilt.y = 1
requestr.Speed.Zoom = 1
ptz.RelativeMove(requestr)
#持续移动
request.Velocity.PanTilt.x = 0.1
request.Velocity.PanTilt.y = 0.1
request.Velocity.Zoom = 0
ptz.ContinuousMove(request)
time.sleep(timeout)
ptz.Stop({'ProfileToken': request.ProfileToken})