Go语言实现Onvif客户端:11、查看网络接口规范wsdl及变焦、聚焦实现

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变得有点鸡肋。

参考文章:

1、http://blog.leanote.com/post/jluyeyu/c8125278e4a4

2、https://zhuanlan.zhihu.com/p/82575181

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
实现一个 C# 的 Onvif 客户端,你需要遵循以下步骤: 1. 引用 Onvif 标准的 WSDL 文件 Onvif 标准定义了一组 Web Services Description Language (WSDL) 文件,你需要将这些文件添加到你的 C# 项目中。这些文件包含了 Onvif 标准所定义的服务接口和数据类型。 2. 生成客户端代理类 使用 Visual Studio 或者命令行工具,基于 WSDL 文件生成客户端代理类,这样你就可以使用 C# 代码调用 Onvif 标准定义的服务接口。 3. 创建客户端对象 使用生成的客户端代理类创建客户端对象,你需要提供 Onvif 设备的 IP 地址、端口号、用户名和密码等信息。 4. 调用服务接口 使用客户端对象调用 Onvif 标准定义的服务接口,例如获取设备信息、控制云台、获取视频流等操作。 下面是一个简单的示例代码,演示了如何使用 C# 实现 Onvif 客户端: ```csharp using System; using System.ServiceModel; using onvif.services; namespace onvif_client { class Program { static void Main(string[] args) { // Onvif 设备的 IP 地址、端口号、用户名和密码 string address = "http://192.168.1.100/onvif/device_service"; string username = "admin"; string password = "admin"; // 创建服务绑定和客户端对象 var binding = new BasicHttpBinding(); var endpoint = new EndpointAddress(address); var client = new DeviceClient(binding, endpoint); // 设置验证凭据 client.ClientCredentials.UserName.UserName = username; client.ClientCredentials.UserName.Password = password; try { // 调用服务接口 var response = client.GetDeviceInformation(new GetDeviceInformationRequest()); // 打印设备信息 Console.WriteLine("Manufacturer: {0}", response.Manufacturer); Console.WriteLine("Model: {0}", response.Model); Console.WriteLine("Serial Number: {0}", response.SerialNumber); } catch (Exception ex) { Console.WriteLine("Error: {0}", ex.Message); } finally { // 关闭客户端 client.Close(); } } } } ``` 以上示例代码演示了如何使用 Onvif 标准定义的 GetDeviceInformation 接口获取设备信息。你可以根据需要调用其他的服务接口实现更加复杂的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昵称系统有问题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值