海康威视网络摄像头SDK二次开发(QT版本)

2023-05-16

暂时使用到的主要功能有四个:1.连接相机,2.实时显示,3.取图(bmp格式),4.关闭相机

在官网下载对应的win64的SDK,在库文件中运行demo.exe确保硬件连接正常。
在程序中导入库

1. 连接相机

使用到的主要SDK接口:NET_DVR_Init(初始化SDK),NET_DVR_Login(用户登录)

    //连接相机,连接成功返回userID,返回-1为初始化SDK失败,返回-2为登录失败
    Q_INVOKABLE int camera_Connect(QString ip, int port = 8000, QString name = "admin", QString password = "*****");
    
    private:
    Ui::MainWidget *ui;
    int m_userID=-10;				//记录连接是否成功,成功则返回正确ID
    bool m_Connect = false;
    LONG m_IRealPlayHandle=-100;    //记录显示是否成功,成功则返回正确句柄


int MainWidget::camera_Connect(QString ip, int port, QString name, QString password)
{
    //QString 转 char * 
    // ip name password
    char* ch_ip;
    char* ch_name;
    char* ch_password;
    QByteArray ba_ip = ip.toLatin1();
    QByteArray ba_name = name.toLatin1();
    QByteArray ba_password = password.toLatin1();
    ch_ip = ba_ip.data();
    ch_name = ba_name.data();
    ch_password = ba_password.data();

    //初始化SDK
    bool isok = NET_DVR_Init();
    if (isok == false)
    {
        qDebug() << "NET_DVR_Init error;error number is " << NET_DVR_GetLastError();
        return -1;
    }
    //设置连接时间与重连时间
    NET_DVR_SetConnectTime(2000, 1);
    NET_DVR_SetReconnect(10000, true);

    NET_DVR_DEVICEINFO DeviceInfoTmp;   //设备信息
    long userID = NET_DVR_Login(ch_ip, port, ch_name, ch_password, &DeviceInfoTmp);
    //long userID = NET_DVR_Login("192.168.1.64", 8000, "admin", "a12345678", &DeviceInfoTmp);
    if (userID < 0)
    {
        qDebug() << "NET_DVR_Login error;" << "error number is " << NET_DVR_GetLastError();
        return -2;
    }
    qDebug() << "Login userID:" << userID;

    m_Connect = true;
    m_userID = userID;
    return userID;
}

2. 实时显示

需要调用实时显示之后,后续才能保存图片成功
使用到的主要的SDK接口:NET_DVR_RealPlay_V40

public:
	//实时显示(需要先显示才能存图)
    Q_INVOKABLE bool camera_DisPlayCapture();
private:
    //实时显示在控件上(hWnd传入控件ID)
    long display_pic(long userID, HWND hWnd, NET_DVR_PREVIEWINFO struPlayInfo);
bool MainWidget::camera_DisPlayCapture()
{
    if (m_userID >= 0)
    {
        HWND hWnd = (HWND)ui->label->winId();	//成功时,即可实时显示在该label上
        NET_DVR_PREVIEWINFO struPlayInfo = { 0 };   //初始化
        //此为登录时返回的ID
        long userID = m_userID;
        long IRealPlayHandle = display_pic(userID, hWnd, struPlayInfo);
        qDebug() << "camera_DisPlayCapture:IRealPlayHandle=" << IRealPlayHandle;
        m_IRealPlayHandle = IRealPlayHandle;
        return true;
    }
    else
    {
        qDebug() << ("HKCAMERA->camera_DisPlayCapture:m_userID < 0,not Connect");
        return false;
    }
}


long MainWidget::display_pic(long userID, HWND hWnd, NET_DVR_PREVIEWINFO struPlayInfo)
{
    struPlayInfo = { 0 };
    struPlayInfo.hPlayWnd = hWnd;//需要 SDK 解码时句柄设为有效值,仅取流不解码时可设为空
    struPlayInfo.lChannel = 1;//预览通道号
    struPlayInfo.dwStreamType = 0;//码流类型:0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推
    struPlayInfo.dwLinkMode = 0;//0- TCP 方式,1- UDP 方式,2- 多播方式,3- RTP 方式,4-RTP/RTSP,5-RSTP/HTTP
    struPlayInfo.bBlocked = 1;//0- 非阻塞取流,1- 阻塞取流

    long IRealPlayHandle = NET_DVR_RealPlay_V40(userID, &struPlayInfo, NULL, NULL);

    if (IRealPlayHandle < 0)
    {
        qDebug()  << "NET_DVR_RealPlay_V40 error;error number " << NET_DVR_GetLastError();
        NET_DVR_Logout(userID);
        return 0;
    }
    else
        return IRealPlayHandle;
}

3. 取图(bmp格式)

使用到的SDK接口:NET_DVR_CapturePicture

    //保存图片:第二个参数是显示时返回的m_IRealPlayHandle(也可能是连接时返回的m_userID,测试时这两个值都可行)
    Q_INVOKABLE bool camera_SavePicture(QString filename, int IrealHandl);


bool MainWidget::camera_SavePicture(QString filename, int IrealHandl)
{
    if (!m_Connect)
        return false;
    if (m_IRealPlayHandle < 0)
        return false;

    QString capImagePath = filename;
    QDir m_capImagePath(capImagePath);
    if (m_capImagePath.exists())
        QFile::remove(capImagePath);

    char* ch_filename;
    QByteArray ba_filename = filename.toLatin1();
    ch_filename = ba_filename.data();

    bool pic_status = NET_DVR_CapturePicture(IrealHandl, ch_filename);

    if (pic_status)
    {
        qDebug() << "camera_SavePicture save pic :" << filename << "success";
    }
    else
    {
        qDebug() << "camera_SavePicture save pic :" << filename << "false";
    }

    return pic_status;
}

4. 关闭相机

使用到的SDK的接口:NET_DVR_Logout,NET_DVR_Cleanup

bool MainWidget::camera_Disconnect()
{
    m_Connect = false;
    bool status1 = NET_DVR_Logout(m_userID);
    bool status2 = NET_DVR_Cleanup();
    return status1&& status2;
}

借鉴博客:源博客链接,借鉴此博客完成连接和实时显示的功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

海康威视网络摄像头SDK二次开发(QT版本) 的相关文章

随机推荐

  • 在柱状图中找最大矩形——O(n)时间复杂度java实现

    最近在刷leetcode xff0c 又碰到了这道题 xff0c 想起来当时算法有些瑕疵 xff0c 所以将最新的AC代码更新在最上面做个对比 xff0c 具体思路见注释 public class Solution 思路 主要是使用一个栈来
  • 记一次Hive平台清洗数据

    场景 xff08 简化 xff09 现有文章表Article和评论表Comment xff1b 一篇文章可以有多个评论 xff1b 文章表Article主要字段 xff08 articleId xff09 xff1b 评论表Comment主
  • UART协议及串口回环

    UART协议及串口回环 一 异步通信的分类1 UART xff08 通用异步收发器 xff09 2 RS4223 RS4854 Modbus5 接口标准 二 UART协议要求1 空闲状态2 起始位3 数据位4 校验位5 停止位6 波特率7
  • 使用MapReduce实现遗传算法

    摘要 xff1a 遗传算法在大规模问题的求解中得到越来越多的应用 传统的基于MPI的并行遗传算法需要知道机器架构的细节 另一方面 xff0c 由Google提出的MapReduce可用于开发具有扩展性和容错能力的应用 xff0c 是一个强大
  • 2021-03-08

    解决大疆无人机电池电压不平衡出现电池错误提示无法起飞 一个简单的笨办法 xff0c 处理某块电芯偏低 xff0c 而另一块明显偏高 xff0c 经平衡和数据修正后 xff0c 在使用中反复 xff0c 说明各电芯之间容量发生物理不可逆的容量
  • 如何学习编程语言-API学习

    作为一个本科非计算机科班出身编程水平又很菜的我来说 xff0c 很多学习方法都需要我自己去总结摸索 xff0c 我的老师朋友可以帮我解决具体的问题 xff0c 给我提供足够的资源 xff0c 但是最关键的细节把握和吸收消化还是需要我自己去完
  • 49天精通Java,第9天,java final关键字

    nbsp 目录 一 final nbsp 1 修饰引用 nbsp 2 修饰方法 3 修饰类 二 Java中的对象析构与finalize方法
  • 正点原子----Linux设备树详解

    linux设备树 1 什么是设备树2 DTS DTB DTC的关系3 如何编译设备树4 DTS基本结构4 1 语法4 2 设备树在系统中的体现4 3 尝试自己添加节点4 4 尝试对根节点追加信息 5 设备树特殊节点5 1 chosen子节点
  • 《嵌入式实时操作系统µC/OS-II》学习笔记(二)

    第三章 xff1a 内核结构 临界段 xff1a 也就是需要保证原子操作的代码段 由这里的说法 xff0c 绝大多数或者说所有的 xff08 xff09 内核都是都是使用开关中断的方式来处理 在 uC OS II 中 xff0c 使用 OS
  • SHELL-----脚本执行 、定义变量、特殊变量、read的用法、命令结果赋值给变量

    一 三种脚本执行方法 1 sh script sh bash script sh 没有执行权限时 2 path script sh script sh 绝对路径 xff0c 当前目录下 3 source script sh script s
  • Mybatis-查询数据传入传出和CRUD

    Mybatis 查询语句的入参类型 基本类型 javabean类型 xff1a 使用时要与 属性名对应 根据对象的属性名获取属性值 map类型 xff1a 匹配參數集合map中key的名字 数组 list类型 xff1a foreach遍历
  • Ubuntu18.04上编译并跑通VINS-Fusion

    VINS Fusion github 地址 xff1a GitHub HKUST Aerial Robotics VINS Fusion An optimization based multi sensor state estimator
  • 北邮人论坛求职版面:各种经验总结

    http bbs byr cn article WorkLife 886969 p 61 2 我觉得技术工作优先级是 0 xff09 业务前途 xff0c 决定你的上升空间 1 xff09 技术方向 xff0c 决定你在人力市场上的价格 2
  • Centos7防火墙常用命令

    一 系统防火墙 1 启动防火墙 systemctl start firewalld 2 关闭防火墙 systemctl stop firewalld 3 查看状态 systemctl status firewalld 4 开机启用防火墙 s
  • java操作hbase

    java 对 Hbase 的操作 一 引入pom span class token comment lt https mvnrepository com artifact org apache hbase hbase client gt s
  • 怎么用vnc访问自己电脑,并且同时又是同一个会话?

    1 运行 vncserver alwaysshared 网友也用这样的 xff1a vncserver alwaysshared 1 geometry 1440 900 2 在ubuntu的系统工具中有个 xff1a 桌面共享 最上面的两个
  • VMware Workstation+Ubuntu20.04LTS虚拟机+VMware Tools安装的那些事(有手就会)

    VMware Workstation 16 43 Ubuntu20 04虚拟机 43 VMware Tools安装的那些事 安装系统的选项 xff1a 1 实体机 xff1a 可能会出现硬件不支持 所以说不推荐 2 双系统 每次开机登录需要
  • 一篇文章带你彻底吃透Java NIO

    目录 一 I O模型 二 BIO NIO AIO应用场景 三 BIO编程简单流程 四 NIO核心 五 BIO与NIO比较 六 NIO 三大核心原理示意图 七 缓冲区 buffer 1 常用Buffer子类一览 2 buffer四大属性 3
  • 图像物体分类与检测算法综述

    图像物体分类与检测算法综述 转自 计算机学报 目录 图像物体分类与检测算法综述 目录图像物体分类与检测概述物体分类与检测的难点与挑战物体分类与检测数据库物体分类与检测发展历程 图像物体分类与检测是计算机视觉研究中的两个重要的基本问题 xff
  • 海康威视网络摄像头SDK二次开发(QT版本)

    暂时使用到的主要功能有四个 xff1a 1 连接相机 xff0c 2 实时显示 xff0c 3 取图 xff08 bmp格式 xff09 xff0c 4 关闭相机 在官网下载对应的win64的SDK xff0c 在库文件中运行demo ex