要点:
重点参考项目:Onvif(Python)将相机调整到预置点
参考项目:Python3-onvif协议之相机获取预置点、移动到预置点
一 定义调整相机到预置点
from onvif import ONVIFCamera # 导入ONVIFCamera模块
import zeep # 导入zeep模块
import time # 导入time模块
import requests # 导入requests模块
from requests.auth import HTTPDigestAuth # 导入HTTPDigestAuth类
def zeep_pythonvalue(self, xmlvalue):
return xmlvalue
class Onvif_hik(object):
def __init__(self, ip: str, username: str, password: str):
self.ip = ip # 相机的IP地址
self.username = username # 相机的用户名
self.password = password # 相机的密码
zeep.xsd.simple.AnySimpleType.pythonvalue = zeep_pythonvalue
self.save_path = "./{}T{}.jpg".format(self.ip, str(time.time())) # 截图保存路径
def content_cam(self):
"""
链接相机地址
:return: 是否连接成功的布尔值
"""
try:
self.mycam = ONVIFCamera(self.ip, 80, self.username, self.password) # 创建ONVIFCamera对象
self.media = self.mycam.create_media_service() # 创建媒体服务
self.media_profile = self.media.GetProfiles()[0] # 获取配置信息
self.ptz = self.mycam.create_ptz_service() # 创建控制台服务
return True # 连接成功
except Exception as e:
return False # 连接失败
def Snapshot(self):
"""
截图
:return: 无
"""
res = self.media.GetSnapshotUri({'ProfileToken': self.media_profile.token}) # 获取截图的URI
response = requests.get(res.Uri, auth=HTTPDigestAuth(self.username, self.password)) # 发送HTTP请求获取截图
with open(self.save_path, 'wb') as f: # 保存截图到文件
f.write(response.content)
def get_presets(self):
"""
获取预置点列表
:return: 预置点列表--所有的预置点
"""
presets = self.ptz.GetPresets({'ProfileToken': self.media_profile.token}) # 获取所有预置点
return presets
def goto_preset(self, presets_token: int):
"""
移动到指定预置点
:param presets_token: 目的位置的token,获取预置点返回值中
:return: 无
"""
try:
self.ptz.GotoPreset({'ProfileToken': self.media_profile.token, "PresetToken": presets_token}) # 移动到指定预置点位置
except Exception as e:
print(e)
def zoom(self, zoom: str, timeout: int = 0.1):
"""
变焦
:param zoom: 拉近或远离
:param timeout: 生效时间
:return: 无
"""
request = self.ptz.create_type('ContinuousMove') # 创建变焦控制请求
request.ProfileToken = self.media_profile.token # 设置请求的配置信息
request.Velocity = {"Zoom": zoom} # 设置变焦速度
self.ptz.ContinuousMove(request) # 发
time.sleep(timeout) # 等待生效时间
self.ptz.Stop({'ProfileToken': request.ProfileToken}) # 停止变焦
1.1 实际执行调整相机到预置点
# 创建Onvif_hik对象
camera = Onvif_hik("192.168.1.100", "admin", "password")
# 连接相机
if camera.content_cam():
print("相机连接成功")
else:
print("相机连接失败")
# 获取预置点列表
presets = camera.get_presets()
print("预置点列表:")
for preset in presets:
print("名称: {}, Token: {}".format(preset.Name, preset.token))
# 移动到指定的预置点
preset_token = "预置点的Token" # 替换为实际的预置点的token
camera.goto_preset(preset_token)
# 停止变焦
camera.zoom("Stop")