Go语言实现Onvif客户端:8、摄像头PTZ控制(云台控制)


文章目录

  • Go语言实现Onvif客户端:8、摄像头PTZ控制(云台控制)
    • 1、PTZ简单再介绍
    • 2、代码
    • 3、结果

1、PTZ简单再介绍

之前学习Onvif协议的时候我们已经对PTZ有了基本的了解,这里当我们实现PTZ控制的时候再简单做一下介绍说明,主要针对我们这里实现的PTZ的说明。

PTZ:Pan/Tilt/Zoom,对于枪机的话基本就是固定一个位置或者水平移动,但是球机除了水平移动外,还可以旋转(没有跳跃),此外摄像头还有变焦的功能,目前我们暂时只实现简单的水平移动和旋转,变焦的接口等有需要也可以类似封装。而移动一般包含绝对移动、相对移动和连续移动三种方式,我们暂时使用连续移动,通过移动后调用停止也可以模拟其它两种移动的效果。

连续移动就设置移动或变焦的速度即可。就2d移动坐标来说:以原点坐标(x=0,y=0)进行相对移动控制,那么上(x=0,y=正的相对位置)下(x=0,y=负的相对位置)左(x=负的相对位置,y=0)右(x=正的相对位置,y=0)左上(x=负的相对位置,y=正的相对位置)左下(x=负的相对位置,y=负的相对位置)右上(x=正的相对位置,y=正的相对位置)右下(x=正的相对位置,y=负的相对位置)

2、代码

/*** @Description: 摄像头云台控制,包括模式设置和移动方向控制* @time: 2021-03-30 11:14:14* @receiver client:onvif客户端* @param direction:云台移动方向,通过PTZDirection接口传入封装后的方向值进行方向传递* @param moveMode:云台移动模式,通过MoveMode接口传入封装后的模式值进行模式控制* @return returnInfo:结果Code码和Info信息,Code码为0则成功,否则失败,通过获取Info查看失败原因*/
func (client *GoOnvifClient) PTZControl(direction PTZDirection, moveMode moveMode) returnInfo {if client.localSelectProfileToken == "" {return returnInfo{PTZErr, "profile token is nil."}}if moveMode == CONTINUOUS || moveMode == DISCONTINUOUS {client.ptzMoveMode = moveMode} else {client.ptzMoveMode = DISCONTINUOUS}switch direction {case UP, DOWN, LEFT, RIGHT, UP_LEFT, DOWN_LEFT, UP_RIGHT, DOWN_RIGHT, STOP:client.direction = directionres := client.ptzControl()if res.Code != 0 {return res}if moveMode == DISCONTINUOUS {time.Sleep(1 * time.Second)res = client.ptzStop()if res.Code != 0 {return res}}default:return returnInfo{PTZErr, "direction err."}}return returnInfo{OK, "ptz control success!"}
}/*** @Description: 根据输入的Profile token和PTZ速度、方向进行PTZ控制* @time: 2021-03-25 14:31:55* @receiver client* @return returnInfo*/
func (client *GoOnvifClient) ptzControl() returnInfo {ptzContinuousMoveReq := ptz.ContinuousMove{ProfileToken: onvif.ReferenceToken(client.localSelectProfileToken),Velocity: onvif.PTZSpeed{PanTilt: onvif.Vector2D{X: 0,Y: 0,},},}switch client.direction {case UP:ptzContinuousMoveReq.Velocity.PanTilt.Y = client.ptzSpeedcase DOWN:ptzContinuousMoveReq.Velocity.PanTilt.Y = -client.ptzSpeedcase LEFT:ptzContinuousMoveReq.Velocity.PanTilt.X = -client.ptzSpeedcase RIGHT:ptzContinuousMoveReq.Velocity.PanTilt.X = client.ptzSpeedcase UP_LEFT:ptzContinuousMoveReq.Velocity.PanTilt.X = -client.ptzSpeedptzContinuousMoveReq.Velocity.PanTilt.Y = client.ptzSpeedcase DOWN_LEFT:ptzContinuousMoveReq.Velocity.PanTilt.X = -client.ptzSpeedptzContinuousMoveReq.Velocity.PanTilt.Y = -client.ptzSpeedcase UP_RIGHT:ptzContinuousMoveReq.Velocity.PanTilt.X = client.ptzSpeedptzContinuousMoveReq.Velocity.PanTilt.Y = client.ptzSpeedcase DOWN_RIGHT:ptzContinuousMoveReq.Velocity.PanTilt.X = client.ptzSpeedptzContinuousMoveReq.Velocity.PanTilt.Y = -client.ptzSpeedcase STOP:return client.ptzStop()default:return returnInfo{PTZErr, "Unknown ptz direction."}}return client.sendReqGetResp(PTZErr, ptzContinuousMoveReq)
}/*** @Description: 根据输入的Profile token设置PTZ停止* @time: 2021-03-25 14:29:43* @receiver client* @return returnInfo*/
func (client *GoOnvifClient) ptzStop() returnInfo {stopReq := ptz.Stop{ProfileToken: onvif.ReferenceToken(client.localSelectProfileToken),}return client.sendReqGetResp(PTZErr, stopReq)
}

调用,我们可以选择在循环中调用,也可以做一个web服务,从web界面上获取控制参数:

//设置速度后循环进行ptz控制,初始化时设置了默认速度0.2
PTZ:for {//断续模式移动一次1s后会调用停止进行停止,连续模式则会绕着指定的方向一直移动fmt.Println("选择控制模式,1:连续移动,0:断续移动,2:退出PTZ")moveMode := uint(0)fmt.Scanln(&moveMode)switch moveMode {case 2:break PTZdefault:}direction := uint(0)fmt.Println("输入PTZ:1:上;2:下;3:左;4:右;5:左上;6:左下;7:右上;8:右下;9:停")fmt.Scanln(&direction)switch direction {case 1, 2, 3, 4, 5, 6, 7, 8, 9:res = client.PTZControl(client.PTZDirection(direction), client.MoveMode(moveMode))if res.Code != 0 {fmt.Println(res.Info)return}default:continue}}

3、结果

Go语言实现Onvif客户端:8、摄像头PTZ控制(云台控制)相关推荐

  1. Go语言实现Onvif客户端:9、预置点删改查及跳转

    Go语言实现Onvif客户端:9.预置点删改查及跳转 文章目录 Go语言实现Onvif客户端:9.预置点删改查及跳转 1.前言 2.代码 3.结果 1.前言 我们可以根据摄像头的所拍的位置设置预置点. ...

  2. Onvif/RTSP摄像头直播中云台控制

    LiveNVR支持预置位控制,包括转到指定预置位,设置指定预置位,删除指定预置位 预置位在安防领域有较为普遍的应用,可以进行很多既定位置的跳转,很方便 之前我们说过如何用Onvif协议进行设备的发现, ...

  3. SkeyeVSS国标视频汇聚云服务使用Onvif、GB28181协议对监控摄像机设备进行PTZ云台控制

    SkeyeVSS平台可在复杂的网络环境中,将分散的各类视频资源进行统一汇聚.整合.集中管理,实现视频资源的鉴权管理.按需调阅.全网分发.智能分析等.平台可支持多协议.多类型设备接入,包括国标GB281 ...

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

    介绍 在安防摄像头中,不仅仅涉及到固定摄像头的枪击,同样还包含可以360°转动的球机.因此对球机的云台方向控制是Onvif协议开发过程中必不可少的过程 球机的云台控制主要包含:八个方向(上.下.左.右 ...

  5. ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)

    概要:   目前ONVIF协议家族设备已占据数字监控行业半壁江山以上,亲,作为开发者的你还在犹豫是否了解下吗?本文介绍了ONVIF客户端从设备搜索,鉴权,能力获取,媒体信息获取,URI地址获取的整套流 ...

  6. 【视频开发】ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)

    转载地址:http://blog.csdn.net/gubenpeiyuan/article/details/25618177 概要:           目前ONVIF协议家族设备已占据数字监控行业 ...

  7. ONVIF协议开发之网络摄像头云台控制(C版)

    在之前的文章中(<python-onvif实现客户端控制相机云台>),介绍过用python实现基于onvif协议的相机云台控制,考虑到嵌入式端的执行效率问题,还是需要实现C/C++版本的接 ...

  8. onvif学习笔记8:最近写的一个ONVIF客户端的心得小结

    最近,利用业余时间编写一个简单的ONVIF客户端MFC程序,这里记录一下过程. 语言选择 在之前调查过,有用QT实现的,有用python实现的,虽然正在学python,无奈才看了3天的书,没自信去搞. ...

  9. Onvif协议学习:14、球机云台控制PTZ

    Onvif协议学习:14.球机云台控制PTZ 文章目录 Onvif协议学习:14.球机云台控制PTZ 一.介绍 二.代码实现 八个方向.放下及缩小控制 聚焦控制 原文链接:https://blog.c ...

最新文章

  1. SUST_ACM_2019届暑期ACM集训热身赛题解
  2. leetcode算法题--二维区域和检索 - 矩阵不可变
  3. python创建项目包
  4. win10系统下安装mysql
  5. v4l2视频采集摄像头
  6. 中国版MSN慈善缘何遇冷:白领网民参与只为时尚(转自--竞报)
  7. 算法题10 最长等差序列问题
  8. STM8 ADC转换模式-------单次模式
  9. 2021 前端面试经常被问到 Javascript+HTML5+CSS+ 框架问题(89 篇资料总结)
  10. OpenCV-闭运算(CLOSE)
  11. 自治系统间的路由协议--BGP详细介绍
  12. Linux查找启动的隐藏服务,Linux服务器入侵检测排查方法
  13. Mac用bootcamp安装Windows 11双系统
  14. SLG手游策略游戏-分析思维
  15. manjaro install ftp server
  16. 2.1 被隐藏了的过程
  17. RS485通信----基本原理+电路图
  18. 计算机手动配置信息,手动修改并设置电脑开机画面入您所愿
  19. 抖音不搞「盲目」社交
  20. el-table设置表头样式

热门文章

  1. CH582M 模拟iic 驱动 QMI8658笔记(避免失败坑)
  2. 计算机基础中的分层教学,计算机应用基础分层教学研究
  3. Unicode(UTF-8, UTF-16)的简单理解
  4. 工业网络基础知识物理层简述
  5. 中鸣循迹机器人_中鸣机器人RIC创新任务挑战赛.DOC
  6. mathpix替代品
  7. 对机会平等与结果平等的思考
  8. MPLS解决BGP路由黑洞
  9. pytorch pso优化cnn-lstm 智慧海洋-渔船轨迹识别
  10. Cisco Packet Tracer 三层交换机与两层交换机的配置