VS2022调试通过海康摄像头烟火识别SDK的实现

 更新时间:2022年02月07日 16:23:03   作者:zhangchao19890805  
本文主要介绍了VS2022调试通过海康摄像头烟火识别SDK的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

下面是我根据海康官方文档代码,放到VS 2022 版本中调试通过后的代码:

#include <stdio.h>
#include <iostream>
#include "Windows.h"
#include "HCNetSDK.h"

using namespace std;

//时间解析宏定义
#define GET_YEAR(_time_)      (((_time_)>>26) + 2000) 
#define GET_MONTH(_time_)     (((_time_)>>22) & 15)
#define GET_DAY(_time_)       (((_time_)>>17) & 31)
#define GET_HOUR(_time_)      (((_time_)>>12) & 31) 
#define GET_MINUTE(_time_)    (((_time_)>>6)  & 63)
#define GET_SECOND(_time_)    (((_time_)>>0)  & 63)



BOOL CALLBACK MessageCallback(LONG lCommand, NET_DVR_ALARMER* pAlarmer, char* pAlarmInfo, DWORD dwBufLen, void* pUser)
{
    
    switch (lCommand)
    {
    case COMM_FIREDETECTION_ALARM: //火点检测报警
    {
        printf("fire192.168.1.31 \n");
            
        NET_DVR_FIREDETECTION_ALARM struFireDetection = { 0 };
        memcpy(&struFireDetection, pAlarmInfo, sizeof(NET_DVR_FIREDETECTION_ALARM));
        printf("火点检测报警: RelativeTime:%d, AbsTime:%d, PTZ{PanPos:%d, TiltPos:%d, ZoomPos:%d}, \
        PicDataLen:%d, DevInfo{DevIP:%s, Port:%d, Channel:%d, IvmsChannel:%d}, \
        FireMaxTemperature:%d, TargetDistance:%d, fireRectInfo{fX:%f,fY:%f,fWidth%f,fHeight%f}, \
        fireMaxTemperaturePoint{fX:%f,fY:%f}\n", struFireDetection.dwRelativeTime, \
            struFireDetection.dwAbsTime, struFireDetection.wPanPos, struFireDetection.wTiltPos, \
            struFireDetection.wZoomPos, struFireDetection.dwPicDataLen, \
            struFireDetection.struDevInfo.struDevIP.sIpV4, struFireDetection.struDevInfo.wPort, \
            struFireDetection.struDevInfo.byChannel, struFireDetection.struDevInfo.byIvmsChannel, \
            struFireDetection.wFireMaxTemperature, struFireDetection.wTargetDistance, \
            struFireDetection.struRect.fX, struFireDetection.struRect.fY, struFireDetection.struRect.fWidth, \
            struFireDetection.struRect.fHeight, struFireDetection.struPoint.fX, struFireDetection.struPoint.fY);

        
        NET_DVR_TIME struAbsTime = { 0 };
        struAbsTime.dwYear = GET_YEAR(struFireDetection.dwAbsTime);
        struAbsTime.dwMonth = GET_MONTH(struFireDetection.dwAbsTime);
        struAbsTime.dwDay = GET_DAY(struFireDetection.dwAbsTime);
        struAbsTime.dwHour = GET_HOUR(struFireDetection.dwAbsTime);
        struAbsTime.dwMinute = GET_MINUTE(struFireDetection.dwAbsTime);
        struAbsTime.dwSecond = GET_SECOND(struFireDetection.dwAbsTime);

        //保存报警抓拍图片
        if (struFireDetection.dwPicDataLen > 0 && struFireDetection.pBuffer != NULL)
        {
            char cFilename[256] = { 0 };
            HANDLE hFile;
            DWORD dwReturn;

            char chTime[128];
            sprintf_s(chTime, "%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d", struAbsTime.dwYear, struAbsTime.dwMonth, struAbsTime.dwDay, struAbsTime.dwHour, struAbsTime.dwMinute, struAbsTime.dwSecond);

            sprintf_s(cFilename, "FireDetectionPic[%s][%s].jpg", struFireDetection.struDevInfo.struDevIP.sIpV4, chTime);
            LPCWSTR tmp;
            // begin added by zhangchao
            tmp = L"FireDetectionPic31.jpg";
            // end  added by zhangchao
            //printf("%s", tmp);

            hFile = CreateFile(tmp, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
            if (hFile == INVALID_HANDLE_VALUE)
            {
                break;
            }
            WriteFile(hFile, struFireDetection.pBuffer, struFireDetection.dwPicDataLen, &dwReturn, NULL);
            CloseHandle(hFile);
            hFile = INVALID_HANDLE_VALUE;
        }
    }
    break;
    default:
        printf("other192.168.1.31 \n");
        printf("其他报警,报警信息类型: %d\n", lCommand);
        break;
    }

    return TRUE;
}



void RunCam(const char* ip) {
    //---------------------------------------
    // 初始化
    NET_DVR_Init();
    //设置连接时间与重连时间
    NET_DVR_SetConnectTime(2000, 1);
    NET_DVR_SetReconnect(10000, true);

    //---------------------------------------
    // 注册设备
    LONG lUserID;

    //登录参数,包括设备地址、登录用户、密码等
    NET_DVR_USER_LOGIN_INFO struLoginInfo = { 0 };
    struLoginInfo.bUseAsynLogin = 0; //同步登录方式
    strcpy_s(struLoginInfo.sDeviceAddress, ip);
    struLoginInfo.wPort = 8000; //设备服务端口
    strcpy_s(struLoginInfo.sUserName, "your_username"); //设备登录用户名
    strcpy_s(struLoginInfo.sPassword, "your_password"); //设备登录密码

    //设备信息, 输出参数
    NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = { 0 };

    lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);
    if (lUserID < 0)
    {
        printf("Login failed, error code: %d\n", NET_DVR_GetLastError());
        NET_DVR_Cleanup();
        return;
    }

    //设置报警回调函数
    NET_DVR_SetDVRMessageCallBack_V31(MessageCallback, NULL);
    

    //启用布防
    LONG lHandle;
    NET_DVR_SETUPALARM_PARAM  struAlarmParam = { 0 };
    struAlarmParam.dwSize = sizeof(struAlarmParam);
    //火点检测不需要设置其他报警布防参数,不支持

    lHandle = NET_DVR_SetupAlarmChan_V41(lUserID, &struAlarmParam);
    if (lHandle < 0)
    {
        printf("NET_DVR_SetupAlarmChan_V41 error, %d\n", NET_DVR_GetLastError());
        NET_DVR_Logout(lUserID);
        NET_DVR_Cleanup();
        return;
    }

    Sleep(50000); //等待过程中,如果设备上传报警信息,在报警回调函数里面接收和处理报警信息


    //撤销布防上传通道
    if (!NET_DVR_CloseAlarmChan_V30(lHandle))
    {
        printf("NET_DVR_CloseAlarmChan_V30 error, %d\n", NET_DVR_GetLastError());
        NET_DVR_Logout(lUserID);
        NET_DVR_Cleanup();
        return;
    }

    //注销用户
    NET_DVR_Logout(lUserID);
    //释放SDK资源
    NET_DVR_Cleanup();
}


void main() {
    RunCam("192.168.1.31");
    return;
}

如何配置VS 2022 ?

第一步:打开窗口顶部 【项目】菜单,选中 【<某某项目>属性】。

第二步:在打开的对话框中,左侧菜单选择 【C/C++】=> 【常规】,选中右侧附加包含目录中,点击右侧出现的向下箭头,点击编辑,在打开的对话框中如下填写:

在这里插入图片描述

其中 D:\ws\vc\emptycam\hkheader 文件夹放着海康的头文件,分别是: DataType.h、DecodeCardSdk.h、HCNetSDK.h、plaympeg4.h。

第三步:左侧菜单选择 【链接器】=> 【常规】。右侧选中附加库目录,点击右侧小三角,点击编辑,打开对话框。

在这里插入图片描述

文件夹 D:\ws\vc\emptycam\hkdll 是放海康dll文件的地方。文件如下图所示:

在这里插入图片描述

第四步:左侧菜单选择 【链接器】=> 【输入】。右侧选中【附加依赖项】点击右侧小三角,点击编辑,打开对话框。内容按照图片里的文字进行填写。

在这里插入图片描述

 到此这篇关于VS2022调试通过海康摄像头烟火识别SDK的实现的文章就介绍到这了,更多相关VS2022海康摄像头烟火识别SDK内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c语言中main函数用法及知识点总结

    c语言中main函数用法及知识点总结

    在本篇文章里小编给大家分享的是一篇关于c语言中main函数用法及知识点总结内容,有需要的朋友们可以跟着学习参考下。
    2021-10-10
  • C语言超详细讲解数据结构中双向带头循环链表

    C语言超详细讲解数据结构中双向带头循环链表

    带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单
    2022-04-04
  • C语言sizeof与字符串处理与动态内存分配及main函数参数详解

    C语言sizeof与字符串处理与动态内存分配及main函数参数详解

    这篇文章主要介绍了C语言字符串处理函数、sizeof、动态内存分配函数、main函数参数问题,static在修饰变量的时候,如果是修饰全局变量,则跟全局变量功能一样,通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 详解C++中虚析构函数的作用及其原理分析

    详解C++中虚析构函数的作用及其原理分析

    这篇文章主要介绍了C++中虚析构函数的作用及其原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • codeblocks 对‘cv::waitKey(int)’未定义的引用方式

    codeblocks 对‘cv::waitKey(int)’未定义的引用方式

    今天小编就为大家分享一篇codeblocks 对‘cv::waitKey(int)’未定义的引用方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • C++使用boost::lexical_cast进行数值转换

    C++使用boost::lexical_cast进行数值转换

    这篇文章介绍了C++使用boost::lexical_cast进行数值转换的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • VC实现获取当前正在运行的进程

    VC实现获取当前正在运行的进程

    这篇文章主要介绍了VC实现获取当前正在运行的进程,涉及VC针对系统进程的相关操作技巧,需要的朋友可以参考下
    2015-05-05
  • 浅析C++11新特性的Lambda表达式

    浅析C++11新特性的Lambda表达式

    C++11 新增了很多特性,lambda 表达式是其中之一,本文涉及到C++11这次更新中较为重要的lambda表达式。有需要的朋友们可以参考学习。
    2016-08-08
  • 电脑开机时间的计算代码

    电脑开机时间的计算代码

    这几天我琢磨着一件事,那就是怎么计算我的PC从开机到现在的总时间。终于,看看这个函数:GetTickCount();
    2013-05-05
  • 在vs2017上配置AppGameKit库的图文教程

    在vs2017上配置AppGameKit库的图文教程

    这篇文章主要介绍了在vs2017上配置AppGameKit库的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04

最新评论