ONVIF PTZ控制

初学小结使用Onvif协议进行PTZ控制 近期由于项目原因接触到了Onvif协议,使用Onvif协议进行PTZ控制。 具体的Onvif协议是什么,PTZ是什么我就不介绍了,主要实现功能的步骤简单的介绍下(主要介绍ContinuousMove功能): 1、通过设备服务地址(形如http://xx/onvif/device_service),调用GetCapabilities函数接口,获取到Media的URL; 2、通过Media的UR 阅读详情

转载自:https://blog.youkuaiyun.com/X_Jiner/article/details/76263771

一、获取设备能力集

球机都有自己的能力集,在要对球机发送调用命令前可以先获取设备能力集:

 struct _tds__GetCapabilities            Capabilities;
 struct _tds__GetCapabilitiesResponse    CapabilitiesResponse;
 soap_wsse_add_UsernameTokenDigest(soap, NULL, username, password);//依然记得要在这之前加上鉴权操作
 soap_call___tds__GetCapabilities(soap, DeviceXAddr, NULL, &Capabilities, &CapabilitiesResponse);
 
  • 1
  • 2
  • 3
  • 4

二、PTZ介绍

简单介绍PTZ表示的是什么:

  • P:Pan水平转动角度
  • T:Tilt垂直转动角度
  • Z:缩放倍数

  我用http的80端口传输时用的是PTZ绝对位置,范围是:P:(0,18000)T:(0,9000)z:(0-200)。
  而用onvif控球,其发送的是归一化后的绝对位置,P:(-1,1)T:(-1,1),Z:(0,1)。在发送之前,将PTZ值先归一化即可。
  

三、控球命令

控球用AbsoluteMove(绝对移动)命令
soap_call___tptz__AbsoluteMove(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct _tptz__AbsoluteMove *tptz__AbsoluteMove, struct _tptz__AbsoluteMoveResponse *tptz__AbsoluteMoveResponse)
 
  • 1
ContinuousMove(沿某方向持续移动)命令
soap_call___tptz__ContinuousMove(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct _tptz__ContinuousMove *tptz__ContinuousMove, struct _tptz__ContinuousMoveResponse *tptz__ContinuousMoveResponse);
 
  • 1
RelativeMove(相对移动)命令
soap_call___tptz__RelativeMove(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct _tptz__RelativeMove *tptz__RelativeMove, struct _tptz__RelativeMoveResponse *tptz__RelativeMoveResponse);
 
  • 1

四、结构体描述

绝对位置移动结构体SOAP_TYPE__tptz__AbsoluteMove定义如下:

struct _tptz__AbsoluteMove {
        /** Required element 'ProfileToken' of XSD type 'tt:ReferenceToken' */
        char *ProfileToken;
        /** Required element 'Position' of XSD type 'tt:PTZVector' */
        struct tt__PTZVector *Position;//转动位置结构体成员
        /** Optional element 'Speed' of XSD type 'tt:PTZSpeed' */
        struct tt__PTZSpeed *Speed;//转动速度结构体成员
};
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

其中ProfileToken是一个标识。可以用获取配置文件函数soap_call___trt__GetProfiles获得,函数定义:

soap_call___trt__GetProfiles(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct _trt__GetProfiles *trt__GetProfiles, struct _trt__GetProfilesResponse *trt__GetProfilesResponse)
 
  • 1

tt__PTZVector为转动位置结构体:

struct tt__PTZVector {
        /** Optional element 'tt:PanTilt' of XSD type 'tt:Vector2D' */
        struct tt__Vector2D *PanTilt;//2维坐标结构体
        /** Optional element 'tt:Zoom' of XSD type 'tt:Vector1D' */
        struct tt__Vector1D *Zoom;//1维坐标结构体
};
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

tt__PTZSpeed为转动速度结构体

struct tt__PTZSpeed {
        /** Optional element 'tt:PanTilt' of XSD type 'tt:Vector2D' */
        struct tt__Vector2D *PanTilt;
        /** Optional element 'tt:Zoom' of XSD type 'tt:Vector1D' */
        struct tt__Vector1D *Zoom;
};
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

tt__Vector2D 2维坐标:

struct tt__Vector2D {
        /** Required attribute 'x' of XSD type 'xsd:float' */
        float x;   //Pan
        /** Required attribute 'y' of XSD type 'xsd:float' */
        float y;   //Tilt
         /** Optional attribute 'space' of XSD type 'xsd:anyURI' */
        //URI:一般填入"http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace"即可
        char *space;
};
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

tt__Vector1D 1维坐标:

struct tt__Vector1D {
        /** Required attribute 'x' of XSD type 'xsd:float' */
        float x;
        /** Optional attribute 'space' of XSD type 'xsd:anyURI' */
        char *space;
};

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

五、简例

1、soap结构初始化
soap_p = soap_new();
soap_set_namespaces(soap_p, namespaces);
 
  • 1
  • 2
2、鉴权(用户认证)
soap_wsse_add_UsernameTokenDigest(soap_p, NULL, "admin", "ADMIN123456");
 
  • 1
3、配置文件获取(profiletoken)
struct _trt__GetProfiles            req;
struct _trt__GetProfilesResponse    rep;
soap_call___trt__GetProfiles(soap, MediaXAddr, NULL, &req, &rep);
if (rep.__sizeProfiles > 0) 
{           
     // 分配缓存
      (*profiles) = (struct tagProfile *)malloc(rep.__sizeProfiles * sizeof(struct tagProfile));
      SOAP_ASSERT(NULL != (*profiles));
      memset((*profiles), 0x00, rep.__sizeProfiles * sizeof(struct tagProfile));
}
for(i = 0; i < rep.__sizeProfiles; i++)
 {    
      // 提取所有配置文件信息(我们所关心的)
    struct tt__Profile *ttProfile = &rep.Profiles[i];
    struct tagProfile *plst = &(*profiles)[i];
    if (NULL != ttProfile->token) 
    {                                         
        // 配置文件Token
         strncpy(plst->token, ttProfile->token, sizeof(plst->token) - 1);
    }
 }

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
4、为结构体分配内存并填充结构体

在发送命令之前要为结构体_tptz__AbsoluteMove 和_tptz__AbsoluteMoveResponse申请内存空间,其成员也需要分配内存:

soap_malloc(struct soap *soap, size_t n)
......//为结构体分配内存
 
  • 1
  • 2

然后填充结构体:

soap_default__tptz__AbsoluteMove(soap_p, &AbsoluteMove);//内存清零
soap_default__tptz__AbsoluteMoveResponse(soap_p, &AbsoluteMoveResponse);

AbsoluteMove.ProfileToken = (char*)soap_malloc(soap_p, 128);
strcpy(AbsoluteMove.ProfileToken, "Profile_1");//profiletoken

AbsoluteMove.Position->PanTilt = (tt__Vector2D*)soap_malloc(soap_p, sizeof(struct tt__Vector2D));
AbsoluteMove.Position->PanTilt->x = -0.9798;//P这里是随便写的几个数
AbsoluteMove.Position->PanTilt->y = 0.6768;//T
AbsoluteMove.Position->PanTilt->xmlns = (char*)soap_malloc(soap_p, 128);
strcpy(AbsoluteMove.Position->PanTilt->xmlns, "http://www.onvif.org/ver10/schema");
AbsoluteMove.Speed->PanTilt = (tt__Vector2D*)soap_malloc(soap_p, sizeof(struct tt__Vector2D));;
AbsoluteMove.Speed->PanTilt->x = 1.0;//P方向转速
AbsoluteMove.Speed->PanTilt->y = 1.0;//T方向转速
AbsoluteMove.Speed->PanTilt->xmlns = (char*)soap_malloc(soap_p, 128);
strcpy(AbsoluteMove.Speed->PanTilt->xmlns, "http://www.onvif.org/ver10/schema");

AbsoluteMove.Position->Zoom =(tt__Vector1D*) soap_malloc(soap_p, sizeof(struct tt__Vector1D));
AbsoluteMove.Position->Zoom->x = 0.7646;//Z
AbsoluteMove.Position->Zoom->xmlns = (char*)soap_malloc(soap_p, 128);
strcpy(AbsoluteMove.Position->Zoom->xmlns, "http://www.onvif.org/ver10/schema");
AbsoluteMove.Speed->Zoom = (tt__Vector1D*)soap_malloc(soap_p, sizeof(struct tt__Vector1D));;
AbsoluteMove.Speed->Zoom->x = 1.0;//Z缩放速度
AbsoluteMove.Speed->Zoom->xmlns = (char*)soap_malloc(soap_p, 128);
strcpy(AbsoluteMove.Speed->Zoom->xmlns, "http://www.onvif.org/ver10/schema");
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
5、发送调用命令
soap_call___tptz__AbsoluteMove(soap_p, ball_onvifserver, NULL, &AbsoluteMove, &AbsoluteMoveResponse);
 
  • 1
6、soap结构清理
    soap_destroy(soap_p);
    soap_end(soap_p);
    soap_done(soap_p);
 
  • 1
  • 2
  • 3
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-258a4616f7.css" rel="stylesheet">
                  </div>
ONVIF PTZ控制海康云台相机 之前帮一个算法朋友弄的 ONVIF控制海康云台相机代码在无人车上要应用. 主要是鉴权没弄过,折腾onvif的人肯定会碰到,所以特别记录一下. 开始本来是在X64的WIN32或ubuntu工控机平台弄海康摄像头控制的,因为有SDK的直接支持. 结果无人车主控选的是NVIDIA XAIVER arm下控制云台,这就想起了用ONVIF了. ONVIF无非就是用gsoap+rtsp来折腾的 就把gsoap库先下载和onvif官方下载对应的文件wsdl接口.如果是搞过webservice的活应该有所了解, g 阅读详情

相关推荐

ONVIF PTZ云台控制--RelativeMove

上周弄了一周都没有弄出来,今天又去研究了下ONVIF Device Test Tool。终于有所发现了。首先肯定是soap,关于鉴权的soap就不展开说了。然后是获取能力。这里我是获取了所有能力。接着是GetProfiles,为了得到在控制PTZ时的token。代码已经调试通了某华和某康的IPC。一开始我们用的是某华,在GetProfiles是的地址是PTZ的。但是在兼容某康时,变成了为实现可选项...

carry19930413的博客 7438

gSOAP+onvif初探(三):PTZ控球

一、获取设备能力集球机都有自己的能力集,在要对球机发送调用命令前可以先获取设备能力集: struct _tds__GetCapabilities Capabilities; struct _tds__GetCapabilitiesResponse CapabilitiesResponse; soap_wsse_add_UsernameTokenDigest(soap,

X_Jiner的博客 1万+

SOAP学习之二:全网最简单的ONVIF协议IPC云台PTZ控制VC++代码--不使用gsoap!!

程序使用VC++实现了单独的PTZ控制,代码量非常少,个人认为是目前我能看到的唯一使用 soap toolkit实现的PTZ控制代码。全部代码展现,希望对搞IPC的有所帮助

weixin_48341920的博客 2465

Onvif协议:IPC客户端开发之PTZ控制

编码流程 1、通过设备服务地址(形如http://xx/onvif/device_service),调用GetCapabilities函数接口,获取到Media的URL; 2、通过Media的URL,调用GetProfiles函数接口,获取到ProfileToken; 3、对_tptz__AbsoluteMove结构体进行填充; 4、调用soap_call___tptz__AbsoluteMove函数接口实现摄像头转动功能; 实践 ONVIF PTZ云台控制–RelativeMove 初学小结使用Onvif

OceanStar的博客 1万+

Onvif协议PTZ控制全解析:从AbsoluteMove到ContinuousMove的实战技巧

本文深入解析Onvif协议中PTZ控制的三种核心移动方式:AbsoluteMove、RelativeMove和ContinuousMove。通过对比其本质区别与适用场景,并结合实战代码示例,指导开发者如何精准调用预置位、实现流畅手动摇杆控制及高级微调,为集成IPC摄像机提供清晰的开发路径与技巧。

yhn4567890的博客 866

c#通过onvif协议实现视频查看,截图录像ptz控制

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Diagnostics; using System.Runtime.InteropServices; using S

6722

JAVA实现onvif的ptz控制_使用Onvif协议进行设备PTZ云台控制

接上一篇使用Onvif协议最重要的应用就是对设备进行PTZ云台控制,PTZ控制包含转动、变焦等,这里我们主要讨论常用的转动和变焦(也就是放大缩小)流程要进行设备PTZ控制,我们首先需要获取到设备的Device Service Address和此设备的用户名密码前两个流程和获取流地址一样获取设备能力Capabilities获取设备的能力,并且可以获取到Media和PTZ的URI,使用这两个URL可以...

weixin_31115971的博客 3452

java 使用onvif协议 PTZ 登录认证,获取摄像头位置, 控制摄像头转动,digest认证,拍照截图

本文章主要包括:onvif 协议登录授权,获取摄像头位置,绝对定位转动摄像头,onvif与osd相互转化,digest认证,摄像头拍照截图

莫失莫忘的博客 5065

JAVA实现onvif的ptz控制,ONVIF和PTZ访问IP摄像机

I'm in trouble here about the ONVIF IP Camera specification. I've built a program that is able to use the standard to contact cameras and send them standard media/device requests.The problem is that I...

weixin_39611666的博客 948

Onvif协议PTZ控制全解析:从协议原理到Python实现

本文全面解析Onvif协议中PTZ控制的原理与实现,从设备发现到命令发送的完整流程,提供详细的Python代码示例,包括绝对移动、连续移动和预设位管理等核心功能,帮助开发者快速掌握智能安防领域的PTZ控制技术。

weixin_30500105的博客 254

Onvif的PTZ控制

PTZ服务用于控制视频编码设备的云台全方位(上下、左右)移动及镜头变倍、变焦控制。PTZ服务的WSDL应用详见PTZ WSDL文件。 PTZ控制原则遵循媒体配置模式 主要由三部分组成: PTZ Node –用于管理PTZ设备和功能的低级PTZ实体 PTZ Configuration –保存某个PTZ节点的PTZ配置 PTZ Control Operation –PTZ,预设和状态操作 一个具有PTZ功能的NVT可能有一个或许多个PTZ节点,一个PTZ节点可以是一个机械PTZ设备驱动,也可以是一个上传到视频

道亦无名 5474

使用Onvif协议进行设备PTZ云台控制

接上一篇使用Onvif协议最重要的应用就是对设备进行PTZ云台控制,PTZ控制包含转动、变焦等,这里我们主要讨论常用的转动和变焦(也就是放大缩小)流程要进行设备PTZ控制,我们首先需要获取到设备的Device Service Address和此设备的用户名密码前两个流程和获取流地址一样获取设备能力Capabilities获取设备的能力,并且可以获取到Media和PTZ的URI,使用这两个URL可以进

xcyle的口袋 2万+

7-Onvif协议:IPC客户端之PTZ控制

在安防摄像头中,不仅仅涉及到固定摄像头的枪击,同样还包含可以360°转动的球机。因此对球机的云台方向控制是Onvif协议开发过程中必不可少的过程。

weixin_56438859的博客 5328

ONVIF获取265的rtsp地址,ptz控制记录

1、获取url、ptz或imaging的一般流程 《1》、注意   GetCapabilities是向下兼容的接口只能获取到设备支持的最基本功能。GetServices接口能获取到设备支持的所有功能,H265格式的RTSP地址的获取必须通过该接口获得。 原文: 《2》、onvif test工具的对比 2、获取profiles   以获取H265的为例,需要onvif开发框架支持265,该环境搭建看参考6.1 void GetProfileUsedMedia2() { char media_a

洛的博客 3019

onvif ptz控制 soap协议

onvif ptz控制 soap协议, 视频监控方面, 大的监控公司源码. 仅供学习

Ollama最新快速上手指南:从安装到精通本地AI模型部署

想让Ollama跑你的"私房模型"?三种主流格式全支持,总有一款适合你!GGUF格式(推荐新手首选)创建Modelfile文件:执行创建命令:运行你的专属模型:PyTorch/Safetensors格式(适合进阶玩家)先用库测试模型能否正常加载确保模型结构完整后再导入Ollama官方文档有详细转换指南专业小贴士GGUF格式最轻量,PyTorch最灵活,Safetensors最安全遇到问题?试试用llama.cpp进行格式转换7B参数模型推荐使用q4_0量化级别想让AI用马里奥。

全世界的博客 2309

ONVIF系列笔记-PTZ的控制

ONVIF系列笔记-设备发现机制 ONVIF系列笔记-功能接口地址的获取 ONVIF系列笔记-流地址的获取 ONVIF系列笔记-PTZ的控制 ONVIF系列笔记-调焦切换及背光控制 SFX流媒体解决方案 占位,后续添加相关资料 监控平台解决方案 为了解决各行各业基于安防监控衍生出的相关设备或平台的对接需求,我们推出了集设备/平台汇聚、平台级联、设备管理、设备控制(PTZ)、报警管理、实时/历史流调阅、存储为一体的全栈解决方案 – SfxMCP汇聚平台。本方案支持各类专网/私网相关的应用,同时也兼容专网/私

inpilen的专栏 909

OpenFoam实用技巧——starccm网格高效转换openfoam格式全解析

本文详细解析了如何利用OpenFOAM官方工具`ccm26toFoam`,将STAR-CCM+生成的高质量网格高效、稳定地转换为OpenFOAM格式。内容涵盖从STAR-CCM+正确导出网格、执行转换命令、解读转换日志,到转换后关键的边界条件修复与网格质量检查等全流程,旨在帮助用户规避常见错误,实现无缝工作流衔接。

weixin_28309571的博客 457

Java OnVif应用PTZ控制

介绍Java程序OnVif常用方法

androidforwell的博客 826

[QMT和ptrade量化交易小白入门]-112、小市值热点概念交易策略,回测5年20倍

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1081

数字后端:版图基础seal ring

seal ring结构是为了防止划片或封装对芯片造成破坏,从而在芯片与划片道(scribe line)之间添加的一圈保护环

m0_61544122的博客 1万+

cgo+gSoap+onvif学习总结:6、进行PTZ控制

cgo+gSoap+onvif学习总结:6、进行PTZ控制 文章目录cgo+gSoap+onvif学习总结:6、进行PTZ控制1. 前言2. gSoap生成c代码框架3. 实现c代码实例并运行3.1 c代码3.2 cmake3.3 运行结果4. 实现cgo代码示例并运行4.1 相关代码4.2 cmake4.3 运行结果5. 整体项目结构6. 最后 1. 前言 接下来我们进行简单的ptz控制,进行一些基础的上、下、左、右、左上、左下、右上、右下、停止等的控制,ptz的模式我们仍使用连续移动方式,对于ptz的

逍遥游的博客 1870

Visual Studio Code ADT Extension 能不能连接 ECC,答案是可以,但真正的门槛在 ABAP 后端版本

Visual Studio Code 版 ABAP Development Tools(ADT)支持连接传统 SAP ECC 系统,关键不在于系统名称,而在于底层 SAP NetWeaver AS ABAP 版本是否达到最低要求(7.31 SP04 及以上)。只要系统已支持 Eclipse ADT,即可无缝使用 VS Code ADT,无需升级后端。SAP 通过复用原有 ADT 技术栈,将兼容性逻辑置于客户端,实现对老系统的持续支持。尽管初期侧重 ABAP Cloud 模型,但 1.1 及后续版本已全面覆盖

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 55
下一篇: 转载一个大神的Makefile
chi_qing
博客等级 码龄18年 0粉丝 0原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值