springboot集成海康SDK,设备抓图,热成像仪设置多个点代码获取,以及针对红外图点击某一点获取该点温度的需求

本文会介绍java对海康sdk的三个功能:

1、用代码实时抓图

2、用代码获取热成像仪21个点的坐标及其实时温度

3、针对海康热成像仪抓取的热图能够随便点击任意一个点就能获取其温度的功能。

第一个功能,抓图

抓图

在海康提供的sdk中取流后抓图调用的是

NET_DVR_RealPlay_V40命令本人jdk21一直抓图不成功,程序直接退出,后续调用
NET_DVR_RealPlay_V30抓图成功。

直接上代码

海康sdk集成到springboot中

依赖的路径

具体代码

功能二,获取21个配置点的坐标和温度

功能三,针对一张红外图点击任意一点,可以读取其温度

因为海康热成像仪只能导出最大256*192的温度矩阵,所以需要把抓到的图像素进行调整,如果你抓图是1280*960,需要把x和y除以5和256*192匹配。

功能一运行完会抓取一张红外图和一个csv的温度矩阵如图:

以上功能全部实现,海康的sdk可以去官方进行下载,我在里边做了相应的调整实现了相应的功能,如果按图不能实现欢迎各位留言,交流看到会进行回复

抓图和温度矩阵源码

import java.io.*;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.ydx.yemms.video.hk.NetSDKDemo.HCNetSDK;
/**
 * Created by panting6 on 2021/2/21.
 */
public class JpegWithAppendData {
    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
    public void jpegWithAppendData(int lUserID, int iChannelNum,String path,String newName)
    {
        boolean bRet = false;
        HCNetSDK.NET_DVR_JPEGPICTURE_WITH_APPENDDATA   m_strJpegWithAppendData = new HCNetSDK.NET_DVR_JPEGPICTURE_WITH_APPENDDATA();
        m_strJpegWithAppendData.dwSize = m_strJpegWithAppendData.size();
        HCNetSDK.BYTE_ARRAY ptrJpegByte = new HCNetSDK.BYTE_ARRAY(4 * 1024 *1024);
        HCNetSDK.BYTE_ARRAY ptrP2PDataByte = new HCNetSDK.BYTE_ARRAY(2 * 1024 *1024);
        HCNetSDK.BYTE_ARRAY ptrVisiblePicByte = new HCNetSDK.BYTE_ARRAY(40*1024*1024);
        m_strJpegWithAppendData.pJpegPicBuff =ptrJpegByte.getPointer();
        m_strJpegWithAppendData.pP2PDataBuff = ptrP2PDataByte.getPointer();
        m_strJpegWithAppendData.pVisiblePicBuff = ptrVisiblePicByte.getPointer();
        m_strJpegWithAppendData.dwJpegPicLen = 4 * 1024 *1024;
        m_strJpegWithAppendData.dwP2PDataLen = 2 * 1024 *1024;
        m_strJpegWithAppendData.dwVisiblePicLen = 40 * 1024 *1024;
        m_strJpegWithAppendData.write();

        bRet=hCNetSDK.NET_DVR_CaptureJPEGPicture_WithAppendData(lUserID,iChannelNum,m_strJpegWithAppendData);

        if(bRet==true)
        {
            m_strJpegWithAppendData.read();
//            System.out.println("NET_DVR_CaptureJPEGPicture_WithAppendData调用成功!图片和温度数据已保存在pic文件夹中,热成像有效区域:{"
//                    + m_strJpegWithAppendData.struThermalValidRect.fX + "," + m_strJpegWithAppendData.struThermalValidRect.fY
//                    + "," + m_strJpegWithAppendData.struThermalValidRect.fWidth + "," + m_strJpegWithAppendData.struThermalValidRect.fHeight + "},可见光有效区域:{"
//                    + m_strJpegWithAppendData.struVisibleValidRect.fX + "," + m_strJpegWithAppendData.struVisibleValidRect.fY + "," + m_strJpegWithAppendData.struVisibleValidRect.fWidth
//                    + "," + m_strJpegWithAppendData.struVisibleValidRect.fHeight + "}");
            //测温数据
            if (m_strJpegWithAppendData.dwP2PDataLen > 0)
            {
//                SimpleDateFormat sf = new SimpleDateFormat("yyyymmddHHmmss");
//                String newName = sf.format(new Date());
                File dir = new File(path);
                if (!dir.exists()){
                    dir.mkdir();
                }
                FileOutputStream fout;
                BufferedWriter fout1;
                try {
//                        fout = new FileOutputStream(".\\pic\\" + "测温" +newName+ ".data");
//                        ByteBuffer bufferss = m_strJpegWithAppendData.pP2PDataBuff.getByteBuffer(0, m_strJpegWithAppendData.dwP2PDataLen);
//                        byte[] bytess = new byte[m_strJpegWithAppendData.dwP2PDataLen];
//                        bufferss.rewind();
//                        bufferss.get(bytess);
//                        fout.write(bytess);
//                        fout.close();
                    fout1 = new BufferedWriter(new FileWriter(dir+ "/" + newName + ".csv"));
                    String tempdata ="";
                    byte[] byTempData = new byte[4];
                    for (int i = 0; i < m_strJpegWithAppendData.dwJpegPicHeight; i++)
                    {
                        for (int j = 0; j < m_strJpegWithAppendData.dwJpegPicWidth; j++)
                        {
                            ByteBuffer TempDatabuffers = m_strJpegWithAppendData.pP2PDataBuff.getByteBuffer((j +i*m_strJpegWithAppendData.dwJpegPicWidth) * 4 , 4);
                            TempDatabuffers.get(byTempData);
                            int l;
                            l = byTempData[0];
                            l &= 0xff;
                            l |= ((long) byTempData[1] << 8);
                            l &= 0xffff;
                            l |= ((long) byTempData[2] << 16);
                            l &= 0xffffff;
                            l |= ((long) byTempData[3] << 24);
                            //System.out.println("行数:" + i + "列数:" + j + "温度数据:" + Float.intBitsToFloat(l));
                            tempdata =" " + Float.intBitsToFloat(l);
                            fout1.write(tempdata);
                            fout1.write(",");
                        }fout1.newLine();
                    }fout1.close();
                } catch (FileNotFoundException e) {
                    System.out.println("路径不存在");
                } catch (IOException e) {
                    System.out.println("异常");
                }
            }
            //测温图片
            if (m_strJpegWithAppendData.dwJpegPicLen > 0)
            {
//                SimpleDateFormat sf = new SimpleDateFormat("yyyymmddHHmmss");
//                String newName = sf.format(new Date());
                FileOutputStream pic;
//                FileOutputStream pic1;
//                FileOutputStream pic2;
                try {
                    pic = new FileOutputStream(path+"/" + newName + ".jpg");
//                    pic1 = new FileOutputStream(".\\pic\\" + "测温_T"+newName + ".data");
//                    pic2 = new FileOutputStream(".\\pic\\" + "测温_V"+newName + ".jpg");
                    ByteBuffer buffers = m_strJpegWithAppendData.pJpegPicBuff.getByteBuffer(0, m_strJpegWithAppendData.dwJpegPicLen);
                    ByteBuffer buffers1 = m_strJpegWithAppendData.pVisiblePicBuff.getByteBuffer(0, m_strJpegWithAppendData.dwVisiblePicLen);
                    byte[] bytes = new byte[m_strJpegWithAppendData.dwJpegPicLen];
                    byte[] bytes1 = new byte[m_strJpegWithAppendData.dwVisiblePicLen];
                    buffers.rewind();
                    buffers.get(bytes);
                    buffers1.rewind();
                    buffers1.get(bytes1);
                    pic.write(bytes);
//                    pic1.write(bytes);
//                    pic2.write(bytes1);
                    pic.close();
//                    pic1.close();
//                    pic2.close();

                } catch (FileNotFoundException e) {
                    System.out.println("路径不存在");
                } catch (IOException e) {
                    System.out.println("异常");
                }
            }
        }
        else
        {
            System.out.println( "抓图叠加温度信息失败,错误码"+ hCNetSDK.NET_DVR_GetLastError());
        }
    }
}

从温度矩阵图中算出最大值和最小值和平均值

 public Map<String, Object> getMaxAndMin(String csvPath) {
        String filePath = csvPath;
        int rows = 192; // 行数
        int cols = 256; // 列数

        double[][] matrix = new double[rows][cols];
        double sum = 0;
        // CSV文件路径
        Map<String, Object> map = new HashMap<>();
        File file = new File(filePath);
        if (file.exists()) {
            try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
                String line;
                int row = 0;
                double max = Double.NEGATIVE_INFINITY;
                double min = Double.POSITIVE_INFINITY;
                while ((line = br.readLine()) != null) {
                    String[] values = line.split(",");
                    for (String value : values) {
                        double d = Double.parseDouble(value);
                        max = Math.max(max, d);
                        min = Math.min(min, d);
                    }
                    for (int col = 0; col < values.length; col++) {
                        matrix[row][col] = Double.parseDouble(values[col]);
                        sum += matrix[row][col];
                    }
                    row++;
                }
                // 计算平均值
                double average = sum / (rows * cols);
                map.put("max", String.format("%.1f", max).toString());
                map.put("min", String.format("%.1f", min).toString());
                map.put("average", String.format("%.1f", average).toString());
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println(filePath + "文件不存在");
        }
        return map;
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux中集成海康SDKSpring Boot可以通过以下步骤进行: 1. 首先,确保已经在Linux系统上安装了JDK和Spring Boot。这可以通过使用包管理器(如apt-get或yum)或手动下载和安装的方式来实现。 2. 接下来,从海康官方网站下载并获取最新的海康SDK的Linux版本。将下载的SDK文件解压到合适的目录中。 3. 在Spring Boot项目的依赖管理文件(如pom.xml)中,添加引用海康SDK的依赖项。这可以通过在dependencies标签中添加相关的依赖项来实现。注意在添加依赖项之前,需要首先将SDK文件安装到本地Maven仓库或者提供引用其他本地存储库的路径。 4. 在Spring Boot应用程序的Java代码中,使用SDK提供的API实现与海康设备(如摄像头)的交互。根据需要,可以调用不同的SDK功能,例如视频流的获取设备状态的查询等等。可以根据SDK提供的文档和示例代码来学习使用SDK的API。 5. 在Spring Boot应用程序的配置文件中,提供与海康SDK相关的配置参数,如设备的IP地址、端口号、用户名、密码等等。这些配置参数的具体内容可以根据实际情况进行调整。 6. 最后,通过运行Spring Boot应用程序,可以实现与海康设备集成。可以使用Spring Boot提供的web服务来提供与设备交互的接口,如获取视频流、控制设备等等。 需要注意的是,集成海康SDK可能面临一些挑战,如SDK与Linux的兼容性、依赖项的版本问题等等。在遇到问题时,可以参考SDK的文档、搜索相关的解决方案或者与SDK的技术支持团队取得联系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值