首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何执行ContinuousMove与python的onvif相机?

如何执行ContinuousMove与python的onvif相机?
EN

Stack Overflow用户
提问于 2022-06-09 22:07:20
回答 2查看 323关注 0票数 0

我试图使用python3 zeep包执行onvif命令,并使大多数命令正常工作。但由于我是新来的,不熟悉onvif (特别是PTZ ),我还没能让它开始工作。我会提供我试过的代码:

代码语言:javascript
复制
import time
from zeep import Client
from zeep.wsse.username import UsernameToken

ptz_wsdl = "D:\Projects\camera\zeep\wsdl\ptz.wsdl"
ip = "192.168.1.12"
port = "2020"
username = "onviftest"
password = "onviftest"

xaddr = "http://"+ip+":"+port+"/onvif/ptz_service"

ptz_client = Client(wsdl=ptz_wsdl, wsse=UsernameToken(username, password, use_digest=True))
ptz = ptz_client.create_service("{http://www.onvif.org/ver20/ptz/wsdl}PTZBinding", xaddr)

token = ptz.GetConfigurations()[0]["token"]
node = ptz.GetNodes()[0]

move = ptz.ContinuousMove(token, velocity)

time.sleep(5)

print(move)

和GetNodes()输出:

代码语言:javascript
复制
{
    'Name': 'PTZNODE',
    'SupportedPTZSpaces': {
        'AbsolutePanTiltPositionSpace': [
            {
                'URI': 'http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace',
                'XRange': {
                    'Min': -170.0,
                    'Max': 170.0
                },
                'YRange': {
                    'Min': -32.0,
                    'Max': 35.0
                }
            }
        ],
        'AbsoluteZoomPositionSpace': [],
        'RelativePanTiltTranslationSpace': [
            {
                'URI': 'http://www.onvif.org/ver10/tptz/PanTiltSpaces/TranslationGenericSpace',
                'XRange': {
                    'Min': -170.0,
                    'Max': 170.0
                },
                'YRange': {
                    'Min': -32.0,
                    'Max': 35.0
                }
            }
        ],
        'RelativeZoomTranslationSpace': [],
        'ContinuousPanTiltVelocitySpace': [
            {
                'URI': 'http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace',
                'XRange': {
                    'Min': -1.0,
                    'Max': 1.0
                },
                'YRange': {
                    'Min': -1.0,
                    'Max': 1.0
                }
            }
        ],
        'ContinuousZoomVelocitySpace': [],
        'PanTiltSpeedSpace': [
            {
                'URI': 'http://www.onvif.org/ver10/tptz/PanTiltSpaces/GenericSpeedSpace',
                'XRange': {
                    'Min': 0.0,
                    'Max': 0.0
                }
            }
        ],
        'ZoomSpeedSpace': [],
        'Extension': None,
        '_attr_1': None
    },
    'MaximumNumberOfPresets': 8,
    'HomeSupported': True,
    'AuxiliaryCommands': [],
    'Extension': None,
    'token': 'PTZNODETOKEN',
    'FixedHomePosition': None,
    '_attr_1': {
}
}

如你所见,这款相机支持连续移动.我的代码不完整(速度对象需要x、y和空间),因为我尝试了各种创建速度对象的方法,结果总是有一些错误。可以在代码中添加什么来使其工作?我的python可能不如我还在学习,因为我只知道javascript,但由于我的ST板,我现在不得不为onvif命令编写python。

如有任何帮助,我们将不胜感激:)

更新:我尝试了下面的代码,没有移动的相机和区域没有任何。

代码语言:javascript
复制
from zeep import Client
from zeep.wsse.username import UsernameToken

ptz_wsdl = "D:\Projects\camera\zeep\wsdl\ptz.wsdl"
media_wsdl = "D:\Projects\camera\zeep\wsdl\media.wsdl"

ip = "192.168.1.12"
port = "2020"
username = "onviftest"
password = "onviftest"

xaddr = "http://"+ip+":"+port+"/onvif/ptz_service"

media_client = Client(wsdl=media_wsdl, wsse=UsernameToken(username, password, use_digest=True))
media = media_client.create_service("{http://www.onvif.org/ver10/media/wsdl}MediaBinding", xaddr)

ptz_client = Client(wsdl=ptz_wsdl, wsse=UsernameToken(username, password, use_digest=True))
ptz = ptz_client.create_service("{http://www.onvif.org/ver20/ptz/wsdl}PTZBinding", xaddr)

profile = media.GetProfiles()[0]

ptz_config = ptz.GetConfigurationOptions(profile.PTZConfiguration.token)

velocity = {
    "PanTilt": {
        "x": ptz_config.Spaces.ContinuousPanTiltVelocitySpace[0].XRange.Max,
        "y": ptz_config.Spaces.ContinuousPanTiltVelocitySpace[0].YRange.Max,
        "space": ptz_config.Spaces.ContinuousPanTiltVelocitySpace[0].URI,
    },
    # "Zoom": None
}

res = ptz.ContinuousMove(profile.token, velocity )
print(res)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-10 21:13:09

经过多次尝试,我才能让它发挥作用:

代码语言:javascript
复制
from zeep import Client
from zeep.wsse.username import UsernameToken

ptz_wsdl = "D:\Projects\camera\zeep\wsdl\ptz.wsdl"
media_wsdl = "D:\Projects\camera\zeep\wsdl\media.wsdl"

ip = "192.168.1.12"
port = "2020"
username = "onviftest"
password = "onviftest"

xaddr = "http://"+ip+":"+port+"/onvif/ptz_service"

media_client = Client(wsdl=media_wsdl, wsse=UsernameToken(
    username, password, use_digest=True))
media = media_client.create_service(
    "{http://www.onvif.org/ver10/media/wsdl}MediaBinding", xaddr)

ptz_client = Client(wsdl=ptz_wsdl, wsse=UsernameToken(
    username, password, use_digest=True))
ptz = ptz_client.create_service(
    "{http://www.onvif.org/ver20/ptz/wsdl}PTZBinding", xaddr)

profile = media.GetProfiles()[0]

ptz_config = ptz.GetConfigurationOptions(profile.PTZConfiguration.token)

velocity = {
    "PanTilt": {
        "x": ptz_config.Spaces.ContinuousPanTiltVelocitySpace[0].XRange.Min,
        "y": ptz_config.Spaces.ContinuousPanTiltVelocitySpace[0].YRange.Min,
    },
}

ptz.ContinuousMove(profile.token, Velocity=velocity)
票数 0
EN

Stack Overflow用户

发布于 2022-06-10 12:06:51

希望这能有所帮助

代码语言:javascript
复制
ptz_request = {"ProfileToken": media_profile.PTZConfiguration.token,
               "Velocity": {"PanTilt": {"y": 0.0,
                                        "x": 0
                                        },
                            "Zoom": -1.0
                            },
               }
ptz.ContinuousMove(ptz_request)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72567143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档