Onvif PTZControl 问题
Onvif PTZControl troubles
我正在使用 ONVIF 协议来控制网络摄像机。目前卡在不同相机的变焦控制上。我正在使用 PTZBinding wsdl [https://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl],尝试了 ContinuousMove 和 RelativeMove 函数,但它似乎在不同的相机上以不同的方式工作。
ContinuousMove 函数采用速度和超时,RelativeMove 函数采用矢量和速度。
我。例如,第一个摄像头与 ContinousMove 完美配合,但与 RelativeMove 配合使用时,它始终应用 maximum/minimus 缩放,第二个摄像头则相反。
没有尝试 AbsoluteMove,因为我找不到获取当前缩放值的方法。
找不到通用的方法来控制多个相机的变焦,请求您的帮助。
任何建议都会有帮助,如果需要我会提供源代码。
通过使用 GetStatus 获取当前缩放值,然后使用 AbsoluteMove 进行控制,解决了这个问题。有源码:
public void StartZoom (Direction direction)
{
if (zoomEnabled_)
{
var ptzStatus_ = ptzClient_.GetStatus(profile_.token);
moveVector_.PanTilt = ptzStatus_.Position.PanTilt;
moveVector_.Zoom = ptzStatus_.Position.Zoom;
var zoomSpace = options_.Spaces.AbsoluteZoomPositionSpace;
var minZoom = zoomSpace[0].XRange.Min;
var maxZoom = zoomSpace[0].XRange.Max;
moveVelocity_.Zoom.x = 0;
if (direction.HasFlag(Direction.ZoomIn))
{
if (ptzStatus_.Position.Zoom.x + 1 / 20F <= maxZoom)
{
moveVelocity_.Zoom.x = velocityZoomIn_;
moveVector_.Zoom.x += 1 / 20F;
}
else
{
moveVector_.Zoom.x = maxZoom;
}
}
else if (direction.HasFlag(Direction.ZoomOut))
{
if (ptzStatus_.Position.Zoom.x - 1 / 20F >= minZoom)
{
moveVelocity_.Zoom.x = velocityZoomOut_;
moveVector_.Zoom.x -= 1 / 20F;
}
else
{
moveVector_.Zoom.x = minZoom;
}
}
ptzClient_.AbsoluteMove(profile_.token, moveVector_, moveVelocity_);
}
}
我正在使用 ONVIF 协议来控制网络摄像机。目前卡在不同相机的变焦控制上。我正在使用 PTZBinding wsdl [https://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl],尝试了 ContinuousMove 和 RelativeMove 函数,但它似乎在不同的相机上以不同的方式工作。
ContinuousMove 函数采用速度和超时,RelativeMove 函数采用矢量和速度。
我。例如,第一个摄像头与 ContinousMove 完美配合,但与 RelativeMove 配合使用时,它始终应用 maximum/minimus 缩放,第二个摄像头则相反。 没有尝试 AbsoluteMove,因为我找不到获取当前缩放值的方法。 找不到通用的方法来控制多个相机的变焦,请求您的帮助。
任何建议都会有帮助,如果需要我会提供源代码。
通过使用 GetStatus 获取当前缩放值,然后使用 AbsoluteMove 进行控制,解决了这个问题。有源码:
public void StartZoom (Direction direction)
{
if (zoomEnabled_)
{
var ptzStatus_ = ptzClient_.GetStatus(profile_.token);
moveVector_.PanTilt = ptzStatus_.Position.PanTilt;
moveVector_.Zoom = ptzStatus_.Position.Zoom;
var zoomSpace = options_.Spaces.AbsoluteZoomPositionSpace;
var minZoom = zoomSpace[0].XRange.Min;
var maxZoom = zoomSpace[0].XRange.Max;
moveVelocity_.Zoom.x = 0;
if (direction.HasFlag(Direction.ZoomIn))
{
if (ptzStatus_.Position.Zoom.x + 1 / 20F <= maxZoom)
{
moveVelocity_.Zoom.x = velocityZoomIn_;
moveVector_.Zoom.x += 1 / 20F;
}
else
{
moveVector_.Zoom.x = maxZoom;
}
}
else if (direction.HasFlag(Direction.ZoomOut))
{
if (ptzStatus_.Position.Zoom.x - 1 / 20F >= minZoom)
{
moveVelocity_.Zoom.x = velocityZoomOut_;
moveVector_.Zoom.x -= 1 / 20F;
}
else
{
moveVector_.Zoom.x = minZoom;
}
}
ptzClient_.AbsoluteMove(profile_.token, moveVector_, moveVelocity_);
}
}