预置位在视频监控系统中是不可或缺的存在,响应预置位功能的前提是要带预置位的云台球机,有些普通的云台球机其实不带预置位的,这个要检查清楚,硬件上不支持该功能的,你再怎么点也没反应。在这个视频监控系统的使用过程中,就有不少的用户会问这个问题,为啥他点了云台没法应之类的,前提是要硬件支持才行啊。
预置位是将被监视的重点区域与球机的运行状况联系在一起的方式。当用户通过控制设备操作终端的监控云台监视目标时,操作人员可以把当前监视目标设置一个预置位,比如一个动点云台,可以365或360度全方位旋转监视;操作人员可以把一个窗口、柜台、办公桌、出入口、存车处等需要监视的地点设置为预置位;设置好的预置位可以通过控制设备软件操作把当前位置保存在终端监控云台的解码器上。当用户需要快速监视某个监视目标时候;可以通过控制设备的调用命令来调出需要监视的位置。这就是预置位功能的含义。
预置位的相关处理有获取预置位(一堆预置位信息集合,一般是1-255预置位编号带预置位名称)、调用预置位(相当于主动触发一个预置位,让球机主动移动到该预置位的位置)、添加预置位(即可传入预置位编号和名称添加预置位,也可对现有预置位的位置信息进行替换)、删除预置位(将现有预置位的位置信息删除)、设置起始位(球机一般有个HOME位置作为起始位置,也可以手动切换球机移动到某个合适的位置然后设置成起始位置,以便移动发生变化后,先回到起始位置)、调用起始位(将当前画面对应的位置信息作为起始位置)。预置位编号一般是1-255,部分球机可能还能做到1000,预置位名称也相当于别名,可以是中文方便标识记忆。
onvif主要的功能
onvif的处理流程
#include "onvifptz.h" OnvifPtz::OnvifPtz(QObject *parent) : QObject(parent) { device = 0; } void OnvifPtz::setDevice(OnvifDevice *device) { this->device = device; } bool OnvifPtz::ptzControl(quint8 type, const QString &profileToken, double x, double y, double z) { QString name = "PtzStop"; QString flag = "云台停止移动"; if (type == 1) { name = "PtzAbsoluteMove"; flag = "云台绝对移动"; } else if (type == 2) { //xy=0表示此时控制焦距缩放 if (x == 0.0 && y == 0.0) { name = "PtzRelativeMoveZoom"; flag = "云台相对焦距"; } else { name = "PtzRelativeMove"; flag = "云台相对移动"; } } else if (type == 3) { //xy=0表示此时控制焦距缩放 if (x == 0.0 && y == 0.0) { name = "PtzContinuousMoveZoom"; flag = "云台连续焦距"; } else { name = "PtzContinuousMove"; flag = "云台连续移动"; } } QString file = OnvifHelper::getFile(QString(":/onvifsend/%1.xml").arg(name)); QString userToken = device->getUserToken(); if (type == 1) { file = file.arg(userToken).arg(profileToken).arg(x).arg(y).arg(z); } else if (type == 2 || type == 3) { if (name.endsWith("Zoom")) { file = file.arg(userToken).arg(profileToken).arg(z); } else { file = file.arg(userToken).arg(profileToken).arg(x).arg(y); } } else { file = file.arg(userToken).arg(profileToken); } QByteArray dataSend = file.toUtf8(); QNetworkReply *reply = device->request->post(device->ptzUrl, dataSend); QByteArray dataReceive; bool ok = device->checkData(reply, dataReceive, flag); return ok; } bool OnvifPtz::ptzPreset(quint8 type, const QString &profileToken, const QString &presetToken, const QString &presetName) { QString name = "PtzGotoPreset"; QString flag = "调用预置位"; if (type == 1) { name = "PtzSetPreset"; flag = "添加预置位"; } else if (type == 2) { name = "PtzRemovePreset"; flag = "删除预置位"; } else if (type == 3) { name = "PtzGotoHomePosition"; flag = "调用起始位"; } else if (type == 4) { name = "PtzSetHomePosition"; flag = "设置起始位"; } QString file = OnvifHelper::getFile(QString(":/onvifsend/%1.xml").arg(name)); if (type == 1) { file = file.arg(device->getUserToken()).arg(profileToken).arg(presetToken).arg(presetName); } else if (type == 0 || type == 2) { file = file.arg(device->getUserToken()).arg(profileToken).arg(presetToken); } else if (type == 3 || type == 4) { file = file.arg(device->getUserToken()).arg(profileToken); } QByteArray dataSend = file.toUtf8(); QNetworkReply *reply = device->request->post(device->ptzUrl, dataSend); QByteArray dataReceive; bool ok = device->checkData(reply, dataReceive, flag); return ok; } QList<OnvifPresetInfo> OnvifPtz::getPresets(const QString &profileToken) { QList<OnvifPresetInfo> presets; if (device->mediaUrl.isEmpty()) { return presets; } QString file = OnvifHelper::getFile(":/onvifsend/PtzGetPresets.xml"); file = file.arg(device->getUserToken()).arg(profileToken); QByteArray dataSend = file.toUtf8(); QNetworkReply *reply = device->request->post(device->mediaUrl, dataSend); QByteArray dataReceive; bool ok = device->checkData(reply, dataReceive, "获取预置位"); if (ok) { //解析预置位信息 OnvifQuery query; if (query.setData(dataReceive)) { presets = query.getPresets(); } } return presets; }
原文:https://blog.51cto.com/u_15246509/2950418