Go语言实现Onvif客户端:11、查看网络接口规范wsdl及变焦、聚焦实现
文章目录
1. 前言
摄像头作为机器视觉的硬件组成,还是有很多可以挖掘的地方,找好一个细分领域一直深挖总会挖到意想不到的东西的。我们这次研究一下如何使用onvif进行摄像头的变焦(zoom)、聚焦(focusing)。
2. 变焦和聚焦基本概念
变焦(zoom):变焦是指改变镜头焦距,以获取不同大小的取景视野和透视感的操作。简单理解就是拍远景还是拍近景。
聚焦(focusing):聚焦也可以理解为对焦,对焦是指通过调节镜头对焦组镜片,确保拍摄图像清晰的操作。简单理解就是调整清晰度,看起来显得更清晰。
3. 如何搜索能力接口规范wsdl以及onvif哪个能力实现变焦和聚焦
之前我们说过onvif一般提供的能力包括但不限于:
DeviceMgmt(设备管理)
DeviceIO(设备IO服务)
Event(事件处理)
Analytics(视频分析)
AnalyticsDevice(分析设备)
Display(显示服务)
Imaging(图像配置)
Media(媒体配置)
PTZ(PTZ控制)
Receiver(接收端配置)
RemoteDiscovery(设备发现)
Recording(录像控制)
Replay(重放控制)
Search(记录搜索)
我们需要了解哪个能力的具体服务,则搜索对应的wsdl即可,比如变焦zoom属于PTZ能力的一部分,则直接搜索ptz.wsdl,而聚焦focus属于Imaging能力的一部分,则搜索Imaging.wsdl:
http://www.onvif.org/ver20/ptz/wsdl/ptz.wsdl
http://www.onvif.org/ver20/imaging/wsdl/imaging.wsdl
可以在这里找到所有的wsdl:
https://www.onvif.org/ch/profiles/specifications/
然后根据服务在对应语言库中搜索接口即可,一般来说各个语言都有onvif的实现库,比较常用c/c++、python、java、go等语言都有相关库或者框架。
4. 部分go实现代码
变焦:
这里延续我们之前使用的连续移动方式,可以方便扩展连续移动:
/**
* @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,
},
Zoom: onvif.Vector1D{
X: 0,
Space: "",
},
},
}
switch client.direction {
case UP:
ptzContinuousMoveReq.Velocity.PanTilt.Y = client.ptzSpeed
case DOWN:
ptzContinuousMoveReq.Velocity.PanTilt.Y = -client.ptzSpeed
case LEFT:
ptzContinuousMoveReq.Velocity.PanTilt.X = -client.ptzSpeed
case RIGHT:
ptzContinuousMoveReq.Velocity.PanTilt.X = client.ptzSpeed
case UpLeft:
ptzContinuousMoveReq.Velocity.PanTilt.X = -client.ptzSpeed
ptzContinuousMoveReq.Velocity.PanTilt.Y = client.ptzSpeed
case DownLeft:
ptzContinuousMoveReq.Velocity.PanTilt.X = -client.ptzSpeed
ptzContinuousMoveReq.Velocity.PanTilt.Y = -client.ptzSpeed
case UpRight:
ptzContinuousMoveReq.Velocity.PanTilt.X = client.ptzSpeed
ptzContinuousMoveReq.Velocity.PanTilt.Y = client.ptzSpeed
case DownRight:
ptzContinuousMoveReq.Velocity.PanTilt.X = client.ptzSpeed
ptzContinuousMoveReq.Velocity.PanTilt.Y = -client.ptzSpeed
case STOP:
return client.ptzStop()
case ZOOMSubtract:
ptzContinuousMoveReq.Velocity.Zoom.X = -client.ptzSpeed
case ZOOMAdd:
ptzContinuousMoveReq.Velocity.Zoom.X = client.ptzSpeed
default:
return ReturnInfo{PTZErr, "Unknown ptz direction."}
}
return client.sendReqGetResp(PTZErr, ptzContinuousMoveReq)
}
聚焦:
一旦使用了该方式对焦就会关闭自动对焦,所以对焦也就是聚焦控制一般最好不要使用,自动对焦够用了。
func (client *GoOnvifClient) ImagingControl(speed float32) ReturnInfo {
moveReq := imaging.Move{}
moveReq.VideoSourceToken = "VideoSource_1"
moveReq.Focus.Continuous.Speed = -2
//moveReq := imaging.GetMoveOptions{
// VideoSourceToken: "VideoSource_1",
//}
return client.sendReqGetResp(-60, moveReq)
}
5. 注意点
- 调焦是在PTZ能力下的,而其中聚焦这块的内容不是想象中在PTZ下,而是在图像Imagimg能力下
- Imaging能力和Media能力一样需要token,这里使用的是VideoSourceToken,而VideoSourceToken和Profile token一样都是在前面我们获取ProfileToken那个xml文件中解析的:
因此,demo中这些token可以写死,但在实际开发时需要注意动态获取。
6. 结果
目前变焦正常,但是聚焦不正常,我手里的海康和大华的两个样机都没有通过Imaging下Move的调用,大华的设备返回值正常,但是界面没有变化,海康的设备一直返回not support absolute,但是我使用的continuous,不明白为什么会报absolute的错误,初步怀疑是onvif协议没有完全适配,或者部分标准版本不统一。
各个厂商对onvif的支持没有想象中的那么好,协议兼容也让onvif变得有点鸡肋。
参考文章: