云台控制也是onvif功能中最常用的,最常用的功能排第一的是拿到视频流地址,排第二的就是云台控制了,云台控制的含义就是对带云台的摄像机进行上下左右的移动,一般云台摄像机都是带有一个小电机,一旦收到485或者网络来的正确的指令以后就触发单片机程序,然后单片机程序驱动电机进行转动,所以相对来说云台摄像机比普通的摄像机更耗电,当然价格也更贵。
云台控制的发送命令除了用户信息玩主要就三个核心参数xyz,通过这三个参数的组合来实现云台和焦距的控制,云台的转动主要就是改变xy的值,焦距的控制通过改变z的值来实现。
云台控制说明
onvif主要的功能
onvif的处理流程
void frmVideoMain::moveRelative(double x, double y, double z)
{
OnvifDevice *device = getCurrentDevice();
if (device != 0) {
QString profileToken = device->getProfile();
device->moveRelative(profileToken, x, y, z);
qDebug() << "相对移动" << AppData::CurrentUrl << profileToken;
}
}
void frmVideoMain::moveAbsolute(double x, double y, double z)
{
OnvifDevice *device = getCurrentDevice();
if (device != 0) {
QString profileToken = device->getProfile();
device->moveAbsolute(profileToken, x, y, z);
qDebug() << "绝对移动" << AppData::CurrentUrl << profileToken;
}
}
void frmVideoMain::mousePressed(int position)
{
QString str;
if (position == 0) {
str = "底部";
} else if (position == 1) {
str = "左下角";
} else if (position == 2) {
str = "左侧";
} else if (position == 3) {
str = "左上角";
} else if (position == 4) {
str = "顶部";
} else if (position == 5) {
str = "右上角";
} else if (position == 6) {
str = "右侧";
} else if (position == 7) {
str = "右下角";
} else if (position == 8) {
str = "中间";
}
DeviceHelper::addMsg(QString("按下云台 %1").arg(str));
}
void frmVideoMain::mouseReleased(int position)
{
QString str;
if (position == 0) {
str = "底部";
} else if (position == 1) {
str = "左下角";
} else if (position == 2) {
str = "左侧";
} else if (position == 3) {
str = "左上角";
} else if (position == 4) {
str = "顶部";
} else if (position == 5) {
str = "右上角";
} else if (position == 6) {
str = "右侧";
} else if (position == 7) {
str = "右下角";
} else if (position == 8) {
str = "中间";
}
DeviceHelper::addMsg(QString("松开云台 %1").arg(str));
mousePtz(position);
}
void frmVideoMain::mousePtz(int position)
{
//根据按下的不同部位发送云台控制命令
//1. x、y、z 范围都在0-1之间。
//2. x为负数,表示左转,x为正数,表示右转。
//3. y为负数,表示下转,y为正数,表示上转。
//4. z为正数,表示拉近,z为负数,表示拉远。
//5. 通过x和y的组合,来实现云台的控制。
//6. 通过z的组合,来实现焦距控制。
//计算速度,转为小数
double speed = (double)ui->sliderPtzSpeed->value() / 10;
if (position == 0) {
moveRelative(0.0, -speed, 0.0);
} else if (position == 1) {
moveRelative(-speed, -speed, 0.0);
} else if (position == 2) {
moveRelative(-speed, 0.0, 0.0);
} else if (position == 3) {
moveRelative(-speed, speed, 0.0);
} else if (position == 4) {
moveRelative(0.0, speed, 0.0);
} else if (position == 5) {
moveRelative(speed, speed, 0.0);
} else if (position == 6) {
moveRelative(speed, 0.0, 0.0);
} else if (position == 7) {
moveRelative(speed, -speed, 0.0);
} else if (position == 8) {
moveAbsolute(0.0, 0.0, 0.0);
}
}