Qt Onvif图片参数怎么使用

发布时间:2021-12-15 10:16:56 作者:iii
来源:亿速云 阅读:160
# Qt Onvif图片参数怎么使用

## 目录
1. [ONVIF协议与图片参数概述](#onvif协议与图片参数概述)
2. [Qt开发环境配置](#qt开发环境配置)
3. [ONVIF设备发现与鉴权](#onvif设备发现与鉴权)
4. [图片参数核心接口详解](#图片参数核心接口详解)
5. [实战:获取与设置图片参数](#实战获取与设置图片参数)
6. [常见问题与解决方案](#常见问题与解决方案)
7. [性能优化建议](#性能优化建议)
8. [完整代码示例](#完整代码示例)

<a id="onvif协议与图片参数概述"></a>
## 1. ONVIF协议与图片参数概述

ONVIF(Open Network Video Interface Forum)是网络视频设备的标准化接口协议,其中图片参数控制是视频处理的关键功能之一。主要涉及的图片参数包括:

- **亮度(Brightness)**:取值范围通常为0-100
- **对比度(Contrast)**:调整图像明暗对比
- **饱和度(Saturation)**:影响色彩鲜艳程度
- **锐度(Sharpness)**:控制边缘清晰度
- **白平衡(WhiteBalance)**:包括自动/手动模式
- **曝光(Exposure)**:包含自动曝光、曝光时间等

这些参数通过`Media`和`Imaging`服务进行控制,对应的WS-Discovery地址一般为:

http://{device_ip}/onvif/imaging_service


<a id="qt开发环境配置"></a>
## 2. Qt开发环境配置

### 2.1 必要组件安装
```bash
# 安装Qt ONVIF开发相关模块
sudo apt-get install qtbase5-dev libqt5websockets5-dev

2.2 项目配置文件(.pro)

QT += core gui network websockets xmlpatterns
CONFIG += c++11

# ONVIF相关库
LIBS += -lgsoap++
LIBS += -lgsoap

2.3 第三方库准备

推荐使用以下开源库简化开发: - gSOAP:用于SOAP协议处理 - QtSoap(可选):基于Qt的SOAP实现

// 示例:初始化gSOAP环境
struct soap *soap = soap_new();
soap_set_namespaces(soap, namespaces);

3. ONVIF设备发现与鉴权

3.1 设备发现流程

sequenceDiagram
    Qt应用->>+设备: WS-Discovery探测
    设备-->>-Qt应用: ProbeMatches响应

3.2 鉴权处理

ONVIF使用WS-Security进行鉴权,典型实现:

QString OnvifClient::createAuthHeader()
{
    QString nonce = QUuid::createUuid().toString().mid(1,36);
    QDateTime current = QDateTime::currentDateTime();
    QString created = current.toString("yyyy-MM-ddThh:mm:ss.zzzZ");
    
    return QString(
        "<Security s:mustUnderstand=\"1\" xmlns=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">"
        "<UsernameToken>"
        "<Username>%1</Username>"
        "<Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest\">%2</Password>"
        "<Nonce>%3</Nonce>"
        "<Created>%4</Created>"
        "</UsernameToken>"
        "</Security>")
        .arg(m_username)
        .arg(QString(QCryptographicHash::hash((nonce + created + m_password).toUtf8(), 
                    QCryptographicHash::Sha1).toBase64()))
        .arg(QString(nonce.toUtf8().toBase64()))
        .arg(created);
}

4. 图片参数核心接口详解

4.1 获取图片参数(GetImagingSettings)

<!-- 请求示例 -->
<GetImagingSettings xmlns="http://www.onvif.org/ver20/imaging/wsdl">
  <VideoSourceToken>video_source_1</VideoSourceToken>
</GetImagingSettings>

响应数据结构:

{
  "Brightness": 50,
  "Contrast": 30,
  "Saturation": 45,
  "Sharpness": 20,
  "WhiteBalance": {
    "Mode": "AUTO",
    "CrGain": 1.2,
    "CbGain": 1.1
  }
}

4.2 设置图片参数(SetImagingSettings)

必填参数说明: - ForcePersistence:true表示永久保存设置

void setImageSettings(QString token, float brightness)
{
    QString soap = QString(
        "<SetImagingSettings xmlns=\"http://www.onvif.org/ver20/imaging/wsdl\">"
        "<VideoSourceToken>%1</VideoSourceToken>"
        "<ImagingSettings>"
        "<Brightness>%2</Brightness>"
        "</ImagingSettings>"
        "<ForcePersistence>true</ForcePersistence>"
        "</SetImagingSettings>")
        .arg(token)
        .arg(brightness);
    
    sendSoapRequest(soap);
}

5. 实战:获取与设置图片参数

5.1 完整交互流程

  1. 发现设备
  2. 获取设备能力(GetCapabilities)
  3. 获取视频源令牌(GetVideoSources)
  4. 操作图片参数

5.2 参数调节界面实现

// 滑动条值变化处理
connect(ui->brightnessSlider, &QSlider::valueChanged, [=](int value){
    float normalized = value / 100.0f;  // 转换为0-1范围
    m_onvifClient->setBrightness(m_videoToken, normalized);
});

5.3 异步处理响应

建议使用Qt的信号槽机制:

// 声明信号
signals:
    void imageSettingsReceived(const ImageSettings &settings);

// 处理响应
void OnvifClient::handleResponse(const QByteArray &data)
{
    QXmlStreamReader xml(data);
    while(xml.readNextStartElement()){
        if(xml.name() == "GetImagingSettingsResponse"){
            ImageSettings settings;
            settings.brightness = xml.readElementText().toFloat();
            emit imageSettingsReceived(settings);
        }
    }
}

6. 常见问题与解决方案

6.1 错误代码处理

错误码 含义 解决方案
400 无效请求 检查XML格式
401 未授权 验证鉴权头
404 服务不存在 检查端点URL

6.2 典型问题排查

  1. 无响应

    • 检查防火墙设置
    • 验证设备是否支持ONVIF Profile S
  2. 参数设置不生效

    • 确认ForcePersistence参数
    • 检查设备是否处于自动模式

7. 性能优化建议

  1. 缓存机制
// 缓存视频源令牌
static QMap<QString, QString> s_tokenCache;

QString getCachedToken(const QString &key)
{
    if(!s_tokenCache.contains(key)){
        s_tokenCache[key] = fetchTokenFromDevice(key);
    }
    return s_tokenCache[key];
}
  1. 批量操作
<!-- 同时设置多个参数 -->
<SetImagingSettings>
  <ImagingSettings>
    <Brightness>50</Brightness>
    <Contrast>30</Contrast>
    <Sharpness>20</Sharpness>
  </ImagingSettings>
</SetImagingSettings>

8. 完整代码示例

设备发现类头文件

// onvifdiscover.h
#pragma once
#include <QObject>
#include <QUdpSocket>

class OnvifDiscover : public QObject
{
    Q_OBJECT
public:
    explicit OnvifDiscover(QObject *parent = nullptr);
    void startDiscovery();

signals:
    void deviceFound(const QString &endpoint);

private slots:
    void readPendingDatagrams();

private:
    QUdpSocket *m_socket;
};

图片参数管理实现

// onvifimaging.cpp
#include "onvifimaging.h"
#include <QNetworkRequest>
#include <QNetworkReply>

OnvifImaging::OnvifImaging(QObject *parent) 
    : QObject(parent)
{
    m_manager = new QNetworkAccessManager(this);
    connect(m_manager, &QNetworkAccessManager::finished, 
            this, &OnvifImaging::onReplyFinished);
}

void OnvifImaging::getSettings(const QString &token)
{
    QNetworkRequest request;
    request.setUrl(QUrl("http://192.168.1.100/onvif/imaging"));
    request.setRawHeader("Content-Type", "application/soap+xml");
    
    QString soap = QString(
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
        "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\">"
        "%1"  // 鉴权头
        "<soap:Body>"
        "<GetImagingSettings xmlns=\"http://www.onvif.org/ver20/imaging/wsdl\">"
        "<VideoSourceToken>%2</VideoSourceToken>"
        "</GetImagingSettings>"
        "</soap:Body>"
        "</soap:Envelope>")
        .arg(createAuthHeader())
        .arg(token);
        
    m_manager->post(request, soap.toUtf8());
}

总结:本文详细介绍了在Qt中使用ONVIF协议控制图片参数的全流程,从环境搭建到核心功能实现,再到性能优化。关键点包括: 1. 正确构造SOAP消息 2. 处理WS-Security鉴权 3. 使用Qt网络模块进行异步通信 4. 参数范围的标准化处理

建议开发者参考ONVIF官方规范文档(版本2.6)获取最新接口定义,并根据实际设备型号进行兼容性测试。 “`

推荐阅读:
  1. Qt怎么实现通用视频控件
  2. Qt音视频开发怎么设置Onvif时间

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

qt onvif

上一篇:Kafka的Log存储解析是怎样的

下一篇:Qt如何实现加载插件

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》