海康威视热成像实时测温java - 23版

news2025/1/11 17:43:42

在20年写了一篇实时测温demo博客,看来帮了不少人。今天刚好又有需求,需要采温。也碰到了不少问题,特此记录

1、环境

摄像头:海康 型号:DS-2TD2528T-7/Q  序列:EA0406775

服务器:winServer 

JDK8

2、调试

之前写的demo下载下来。

先把lib 放在D盘下,这边的lib仅限于win64的,如果是其他平台。

海康官网平台下载

后续把账号密码一改,直接发布试一下。

结果

排查故障

询问海康

配置开启功能

登录之后,配置

有些用户会发现,没有本地这一项,那么请看下图。下载插件,刷新即可。

等我配置好之后,重启之后还是code11。静下心来,自己研究程序。

应该是哪里传值不对。

海康的人让我下载Demo看下,其实就是他们的一个测试exe。间接了解海康测温原理,抓图分析。这个工具可以很明显是摄像头没有配置好,还是程序有问题。

这边可以看到,是程序自己没有配置好。

开始琢磨。byRuleID 规则ID是1,我不是很明白 ,dwChan通道ID 是2没有问题。

最后查看相关文档,规则ID 普通模式下只能是0。专家模式下如果只获取对应ID的温度就输入对应规则ID。看图

普通模式和专家模式是互斥的。

最后程序调整下。成功了

3、上代码

runnable

/**
 * @author cmy
 * @date 2023/9/14 14:03
 */
@Slf4j
public class ReadDataThread implements Runnable {

    HCNetSDK hCNetSDK;
    ThermInfoCallback thermInfoCallback;
    DeviceBean bean;

    public ReadDataThread(HCNetSDK hCNetSDK, ThermInfoCallback thermInfoCallback, DeviceBean bean){
        this.hCNetSDK = hCNetSDK;
        this.thermInfoCallback = thermInfoCallback;
        this.bean = bean;
    }

    @Override
    public void run() {
        HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();

        NativeLong lUserID = new NativeLong(-1);
        lUserID = hCNetSDK.NET_DVR_Login_V30(bean.getIp(),
                bean.getPort(), bean.getUserName(), bean.getPassWord(), m_strDeviceInfo);

        if (lUserID.longValue() == -1){
            log.error(bean.getIp()+"登录失败,错误码为"+hCNetSDK.NET_DVR_GetLastError());
            return;
        }else{
            log.info(bean.getIp()+"登录成功!"+lUserID);
        }


        HCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND thermometry = new HCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND();
        thermometry.dwSize = thermometry.size();
        thermometry.byRuleID = 0;
        thermometry.dwChan = 2;
        thermometry.write();
        Pointer pUserData = new Memory(37);
        //TODO 传数据
        pUserData.setString(0, bean.getIp());
        pUserData.setInt(13,222);



        while (true){
            NativeLong lHandle = hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, 3629, thermometry.getPointer(), thermometry.size(), thermInfoCallback, pUserData);

            if (lHandle.intValue() < 0){
                log.error(bean.getIp()+"NET_DVR_GET_REALTIME_THERMOMETRY failed, error code: "+ hCNetSDK.NET_DVR_GetLastError());
                break;
            }else{
                log.info(bean.getIp()+"NET_DVR_GET_REALTIME_THERMOMETRY is successful!");
            }
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }



//        if(!hCNetSDK.NET_DVR_StopRemoteConfig(lHandle)){
//            log.error(bean.getIp()+"NET_DVR_StopRemoteConfig failed, error code:"+ hCNetSDK.NET_DVR_GetLastError());
//        }
//
//        boolean logoutStatus = hCNetSDK.NET_DVR_Logout(lUserID);
//        if(logoutStatus){
//            log.info(bean.getIp()+"Logout success");
//        }else{
//            log.error(bean.getIp()+"Logout fail");
//        }
    }
}

main

static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;

    @Override
    public void run() {
        boolean initStatus = hCNetSDK.NET_DVR_Init();
        if(initStatus){
            log.info("初始化成功");
        }else{
            log.error("初始化失败"+hCNetSDK.NET_DVR_GetCardLastError_Card());
        }
        hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
        hCNetSDK.NET_DVR_SetReconnect(10000, true);
        hCNetSDK.NET_DVR_SetLogToFile(3,"D:\\log",false);


        List<DeviceBean> deviceList = new ArrayList<>(3);
        deviceList.add(new DeviceBean("192.168.1.70",(short) 8000,"admin","a12345678"));
        deviceList.add(new DeviceBean("192.168.1.81",(short) 8000,"admin","a12345678"));
        deviceList.add(new DeviceBean("192.168.1.91",(short) 8000,"admin","a12345678"));




            for(DeviceBean bean : deviceList){
                new Thread(new ReadDataThread(hCNetSDK, new ThermInfoCallback(), bean)).start();
            }


    }

callback

@Slf4j
public class ThermInfoCallback implements HCNetSDK.FRemoteConfigCallback {
    @Override
    public void invoke(int dwType, Pointer pBuffer, int dwBufLen, Pointer pUserData) {

        log.info("dwType:"+dwType+"dwBufLen:"+dwBufLen+"pUserData:"+pUserData.getString(0));

        switch (dwType){
            case 0:
                HCNetSDK.REMOTECONFIGSTATUS struCfgStatus  = new HCNetSDK.REMOTECONFIGSTATUS();
                struCfgStatus.write();
                Pointer pCfgStatus = struCfgStatus.getPointer();
                pCfgStatus.write(0, pBuffer.getByteArray(0, struCfgStatus.size()), 0,struCfgStatus.size());
                struCfgStatus.read();

                int iStatus = 0;
                for(int i=0;i<4;i++)
                {
                    int ioffset = i*8;
                    int iByte = struCfgStatus.byStatus[i]&0xff;
                    iStatus = iStatus + (iByte << ioffset);
                }

                switch (iStatus){
                    case 1000:
                        log.error("实时测温回调成功,dwStatus:" + iStatus);
                        break;
                    case 1001:
                        log.error("正在获取实时测温回调数据中,dwStatus:" + iStatus);
                        break;
                    case 1002:
                        int iErrorCode = 0;
                        for(int i=0;i<4;i++)
                        {
                            int ioffset = i*8;
                            int iByte = struCfgStatus.byErrorCode[i]&0xff;
                            iErrorCode = iErrorCode + (iByte << ioffset);
                        }
                        log.error(pUserData.getString(0)+"获取实时测温回调数据失败, dwStatus:" + iStatus + "错误号:" + iErrorCode);
                        break;
                    default:
                        break;
                }
                break;
            case 2:
                HCNetSDK.NET_DVR_THERMOMETRY_UPLOAD m_struThermometryInfo = new HCNetSDK.NET_DVR_THERMOMETRY_UPLOAD();
                m_struThermometryInfo.write();
                Pointer pInfoV30 = m_struThermometryInfo.getPointer();
                pInfoV30.write(0, pBuffer.getByteArray(0, m_struThermometryInfo.size()), 0,m_struThermometryInfo.size());
                m_struThermometryInfo.read();

                if(m_struThermometryInfo.byRuleCalibType == 0){
                    System.out.println("点测温信息:"+ m_struThermometryInfo.struPointThermCfg.fTemperature);
                }
                if(m_struThermometryInfo.byRuleCalibType == 1 || m_struThermometryInfo.byRuleCalibType == 2){
                    log.info("框/线测温信息:fMaxTemperature__"+m_struThermometryInfo.struLinePolygonThermCfg.fMaxTemperature);
                    log.info("   fMinTemperature__"+m_struThermometryInfo.struLinePolygonThermCfg.fMinTemperature);
                    log.info("  fAverageTemperature__"+m_struThermometryInfo.struLinePolygonThermCfg.fAverageTemperature);
                    log.info("   fTemperatureDiff__"+m_struThermometryInfo.struLinePolygonThermCfg.fTemperatureDiff);
                    log.info("    fCenterPointTemperature__"+m_struThermometryInfo.fCenterPointTemperature);
                }
                break;
            default:
                break;
        }

    }
}

在此说明一下pUserData传值到callback,看此博客Pointer传值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1017214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode168. Excel表列名称

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题解&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码如下&#xff1a; class Solution {public String convertToTitle(int columnNumber) {StringBuild…

【无公网IP】安装Wnmp并结合内网穿透,实现灵活可靠的外网访问内网服务!

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包&#xff0c;安装完成后即可得到一个Nginx MyS…

pytorch迁移学习训练图像分类

pytorch迁移学习训练图像分类 一、环境配置二、迁移学习关键代码三、完整代码四、结果对比 代码和图片等资源均来源于哔哩哔哩up主&#xff1a;同济子豪兄 讲解视频&#xff1a;Pytorch迁移学习训练自己的图像分类模型 一、环境配置 1&#xff0c;安装所需的包 pip install …

工业检测 ocr

采用OpenCV和深度学习的钢印识别_菲斯奇的博客-CSDN博客采用OpenCV和深度学习的钢印识别[这个帖子标题党了很久&#xff0c;大概9月初立贴&#xff0c;本来以为比较好做&#xff0c;后来有事情耽搁了&#xff0c;直到现在才有了一些拿得出手的东西。肯定不会太监的。好&#xf…

RL 暂态电路与磁能

前言 RL 电路是一个电阻 R 和 自感线圈 L 组成的 RL 电路&#xff0c;在连接或者接通电源U 的时候&#xff0c;由于自感电动势的作用&#xff0c;电路中的电流不会瞬间改变&#xff0c;而是一个连续的渐变的过程&#xff0c;通常这个时间很短暂&#xff0c;所以被称为暂态过程…

MySQL 面试题——MySQL 基础

目录 1.什么是 MySQL&#xff1f;有什么优点&#xff1f;2.MySQL 中的 DDL 与 DML 是分别指什么&#xff1f;3.✨数据类型 varchar 与 char 有什么区别&#xff1f;4.数据类型 BLOB 与 TEXT 有什么区别&#xff1f;5.DATETIME 和 TIMESTAMP 的异同&#xff1f;6.✨MySQL 中 IN …

xss-labs实操

文章目录 1.Level2.Level23.Level34.Level45.Level56.Level67.Level78.Level89.Level910.Level1011.Level1112.Level1213.Level13 1.Level 无过滤法 2.Level2 “>闭合 “>&submit搜索 通过观察发现alert里的引号没了&#xff0c;是不是被过滤了呢 因为如果该语句类…

leetcode:69. x 的平方根

一、题目 函数原型&#xff1a;int mySqrt(int x) 二、思路 利用二分查找思想&#xff0c;在0与x区间进行查找。 设置左边界 left &#xff08;初始值为0&#xff09;&#xff0c;右边界 right&#xff08;初始值为x&#xff09;和中值 mid &#xff08;值为区间的中间值&#…

VCP-DCV VMware vSphere:安装、配置和管理[V8.x]

VMware官方授权合作活动&#xff0c;全国招生&#xff01; VCP-DCV VMware vSphere&#xff1a;安装、配置和管理[V8.x] 课程名称&#xff1a;VMware vSphere安装、配置和管理[V8.x] 培训课时&#xff1a;40课时 培训天数&#xff1a;5天 课程介绍&#xff1a;本课程重点讲…

MySQL优化技巧:提升数据库性能

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

盐碱地改良通用技术 铁尾砂改良学习

声明 本文是学习GB-T 42828.1-2023 盐碱地改良通用技术 第1部分&#xff1a;铁尾砂改良. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件描述了铁尾砂改良盐碱地技术的技术原理&#xff0c;规定了技术要求、田间管理和效果评价。 本文…

计算机d3dx9_43.dll丢失怎么解决,简单的5个解决方法分享

在当今这个高度依赖计算机技术的时代&#xff0c;我们的生活和工作都离不开各种软件的支持。然而&#xff0c;有时候我们可能会遇到一些棘手的问题&#xff0c;比如计算机中的某个dll文件丢失&#xff0c;导致程序无法正常运行。最近&#xff0c;我就遇到了这样一个问题&#x…

无涯教程-JavaScript - TRANSPOSE函数

描述 TRANSPOSE函数将单元格的垂直范围作为水平范围返回,反之亦然。必须将TRANSPOSE函数作为数组公式输入,该范围必须具有与行范围和列范围相同的行和列数。 您可以使用TRANSPOSE在工作表上移动数组或范围的垂直和水平方向。 语法 TRANSPOSE (array)键入函数后,按CTRL SHI…

【计算机视觉】Vision Transformers算法介绍合集(二)

文章目录 一、Transformer in Transformer二、Bottleneck Transformer三、Pyramid Vision Transformer v2四、Class-Attention in Image Transformers五、Co-Scale Conv-attentional Image Transformer六、XCiT七、Focal Transformers八、CrossViT九、ConViT十、CrossTransform…

【C++】map,set简单操作的封装实现(利用红黑树)

文章目录 一、STL中set与map的源码二、 红黑树结点的意义三、仿函数的妙用四、set&#xff0c;map定义迭代器的区别五、map&#xff0c;set迭代器的基本操作&#xff1a;1.begin&#xff08;&#xff09; end&#xff08;&#xff09;2.operator3.operator-- 六、迭代器拷贝构造…

A Framework to Evaluate Fusion Methods for Multimodal Emotion Recognition

题目A Framework to Evaluate Fusion Methods for Multimodal Emotion Recognition译题一种评估多模态情感识别融合方法的框架时间2022年仅用于记录学习&#xff0c;不作为商用 一种评估多模态情感识别融合方法的框架 摘要&#xff1a;情绪识别的多模态方法考虑了预测情绪的几…

2023/9/17周报

摘要 本周阅读了两篇论文&#xff0c;其一为一种基于空气质量时频域特征提取的hybrid预测方法&#xff0c;另一篇为基于烛台与视觉几何群模型的 PM2.5 变化趋势特征提取与分类预测方法。在第一篇文章中&#xff0c;通过小波变化&#xff0c;对数据进行分频&#xff0c;并设计了…

详解3dMax中渲染线框的两种简单方法

在3dMax中渲染线框是你在某个时候想要完成的事情&#xff0c;例如为了演示分解步骤&#xff0c;或是仅仅为了在模型上创建线框覆盖的独特效果。为三维模型渲染线框最常见的原因是能够在模型上显示干净的拓扑。这篇文章将带你了解在3dMax中渲染三维模型线框的两种最常见、最简单…

太炫酷,3分钟学会,视频倒放技能

一&#xff0c;视频倒放 视频倒放是一种有趣的视频编辑技术&#xff0c;可以为您的视频带来一些特殊的效果。通过倒放视频&#xff0c;您可以实现以下效果&#xff08;如果有其它需要的软件和技术&#xff0c;可以私信小编&#xff1b;更多精彩可关注微信公众号&#xff1a;黑…

推荐一个高质量专栏:「前端面试必备」

文章目录 专栏作者介绍专栏介绍目录&#xff08;前25篇&#xff09;目录&#xff08;后25篇&#xff09;专栏文章部分摘抄JavaScriptVue网络请求和HTTPNode.jswebpackBabelVite微信小程序Vuexuni-appGitECharts前端工程化 写在结尾 专栏作者介绍 &#x1f90d; 前端开发工程师&…