Java热成像温湿度采集从0到1

配置Intellij IDEA

第一个java程序:
/**
 * @Author:Romulus
 * @Date:2022/9/6-09-06-1:18
 * @Description:PACKAGE_NAME
 * @version:1.0
 */
public class version1 {
    public static void main(String[] args){
        System.out.println("Hello,My first Java Project");
    }
}

运行结果:
在这里插入图片描述

python版本

参考A
参考B
参考1
参考2
参考3

源码

#!D:/workplace/python
# -*- coding: utf-8 -*-
# @File  : main0906.py
# @Author:Romulushe
# @Time    : 2022/9/6 22:39
# @Software: PyCharm
# @Use: PyCharm
# coding=utf-8
'''
HKCam.py
'''
import os
import platform
from HCNetSDK import *
from PlayCtrl import *
import numpy as np
import time
import cv2


class HKCam(object):
    def __init__(self, camIP, username, password, devport=8000):
        # 登录的设备信息
        self.DEV_IP = create_string_buffer(camIP.encode())
        self.DEV_PORT = devport
        self.DEV_USER_NAME = create_string_buffer(username.encode())
        self.DEV_PASSWORD = create_string_buffer(password.encode())
        self.WINDOWS_FLAG = False if platform.system() != "Windows" else True
        self.funcRealDataCallBack_V30 = None
        self.recent_img = None  # 最新帧
        self.n_stamp = None  # 帧时间戳
        self.last_stamp = None  # 上次时间戳
        # 加载库,先加载依赖库
        if self.WINDOWS_FLAG:
            os.chdir(r'./lib/win')
            self.Objdll = ctypes.CDLL(r'./HCNetSDK.dll')  # 加载网络库
            self.Playctrldll = ctypes.CDLL(r'./PlayCtrl.dll')  # 加载播放库
        else:
            os.chdir(r'./lib/linux')
            self.Objdll = cdll.LoadLibrary(r'./libhcnetsdk.so')
            self.Playctrldll = cdll.LoadLibrary(r'./libPlayCtrl.so')
        # 设置组件库和SSL库加载路径
        self.SetSDKInitCfg()
        # 初始化DLL
        self.Objdll.NET_DVR_Init()
        # 启用SDK写日志
        self.Objdll.NET_DVR_SetLogToFile(3, bytes('./SdkLog_Python/', encoding="utf-8"), False)
        os.chdir(r'../../')
        # 登录
        (self.lUserId, self.device_info) = self.LoginDev()
        self.Playctrldll.PlayM4_ResetBuffer(self.lUserId, 1)
        print(self.lUserId)
        if self.lUserId < 0:
            err = self.Objdll.NET_DVR_GetLastError()
            print('Login device fail, error code is: %d' % self.Objdll.NET_DVR_GetLastError())
            # 释放资源
            self.Objdll.NET_DVR_Cleanup()
            exit()
        else:
            print(f'摄像头[{camIP}]登录成功!!')
        self.start_play()
        time.sleep(1)

    def start_play(self, ):
        # global funcRealDataCallBack_V30
        self.PlayCtrl_Port = c_long(-1)  # 播放句柄
        # 获取一个播放句柄
        if not self.Playctrldll.PlayM4_GetPort(byref(self.PlayCtrl_Port)):
            print(u'获取播放库句柄失败')
        # 定义码流回调函数

        self.funcRealDataCallBack_V30 = REALDATACALLBACK(self.RealDataCallBack_V30)
        # 开启预览
        self.preview_info = NET_DVR_PREVIEWINFO()
        self.preview_info.hPlayWnd = 0
        self.preview_info.lChannel = 1  # 通道号
        self.preview_info.dwStreamType = 0  # 主码流
        self.preview_info.dwLinkMode = 0  # TCP
        self.preview_info.bBlocked = 1  # 阻塞取流
        # 开始预览并且设置回调函数回调获取实时流数据
        self.lRealPlayHandle = self.Objdll.NET_DVR_RealPlay_V40(self.lUserId, byref(self.preview_info),
                                                                self.funcRealDataCallBack_V30, None)
        if self.lRealPlayHandle < 0:
            print('Open preview fail, error code is: %d' % self.Objdll.NET_DVR_GetLastError())
            # 登出设备
            self.Objdll.NET_DVR_Logout(self.lUserId)
            # 释放资源
            self.Objdll.NET_DVR_Cleanup()
            exit()

    def SetSDKInitCfg(self, ):
        # 设置SDK初始化依赖库路径
        # 设置HCNetSDKCom组件库和SSL库加载路径
        # print(os.getcwd())
        if self.WINDOWS_FLAG:
            strPath = os.getcwd().encode('gbk')
            sdk_ComPath = NET_DVR_LOCAL_SDK_PATH()
            sdk_ComPath.sPath = strPath
            self.Objdll.NET_DVR_SetSDKInitCfg(2, byref(sdk_ComPath))
            self.Objdll.NET_DVR_SetSDKInitCfg(3, create_string_buffer(strPath + b'\libcrypto-1_1-x64.dll'))
            self.Objdll.NET_DVR_SetSDKInitCfg(4, create_string_buffer(strPath + b'\libssl-1_1-x64.dll'))
        else:
            strPath = os.getcwd().encode('utf-8')
            sdk_ComPath = NET_DVR_LOCAL_SDK_PATH()
            sdk_ComPath.sPath = strPath
            self.Objdll.NET_DVR_SetSDKInitCfg(2, byref(sdk_ComPath))
            self.Objdll.NET_DVR_SetSDKInitCfg(3, create_string_buffer(strPath + b'/libcrypto.so.1.1'))
            self.Objdll.NET_DVR_SetSDKInitCfg(4, create_string_buffer(strPath + b'/libssl.so.1.1'))

    def LoginDev(self, ):
        # 登录注册设备
        device_info = NET_DVR_DEVICEINFO_V30()
        lUserId = self.Objdll.NET_DVR_Login_V30(self.DEV_IP, self.DEV_PORT, self.DEV_USER_NAME, self.DEV_PASSWORD,
                                                byref(device_info))
        return (lUserId, device_info)

    def read(self, ):
        while self.n_stamp == self.last_stamp:
            continue
        self.last_stamp = self.n_stamp
        return self.n_stamp, self.recent_img

    def DecCBFun(self, nPort, pBuf, nSize, pFrameInfo, nUser, nReserved2):
        if pFrameInfo.contents.nType == 3:
            t0 = time.time()
            # 解码返回视频YUV数据,将YUV数据转成jpg图片保存到本地
            # 如果有耗时处理,需要将解码数据拷贝到回调函数外面的其他线程里面处理,避免阻塞回调导致解码丢帧
            nWidth = pFrameInfo.contents.nWidth
            nHeight = pFrameInfo.contents.nHeight
            # nType = pFrameInfo.contents.nType
            dwFrameNum = pFrameInfo.contents.dwFrameNum
            nStamp = pFrameInfo.contents.nStamp
            # print(nWidth, nHeight, nType, dwFrameNum, nStamp, sFileName)
            YUV = np.frombuffer(pBuf[:nSize], dtype=np.uint8)
            YUV = np.reshape(YUV, [nHeight + nHeight // 2, nWidth])
            img_rgb = cv2.cvtColor(YUV, cv2.COLOR_YUV2BGR_YV12)
            self.recent_img, self.n_stamp = img_rgb, nStamp

    def RealDataCallBack_V30(self, lPlayHandle, dwDataType, pBuffer, dwBufSize, pUser):
        # 码流回调函数
        if dwDataType == NET_DVR_SYSHEAD:
            # 设置流播放模式
            self.Playctrldll.PlayM4_SetStreamOpenMode(self.PlayCtrl_Port, 0)
            # 打开码流,送入40字节系统头数据
            if self.Playctrldll.PlayM4_OpenStream(self.PlayCtrl_Port, pBuffer, dwBufSize, 1024 * 1024):
                # 设置解码回调,可以返回解码后YUV视频数据
                # global FuncDecCB
                self.FuncDecCB = DECCBFUNWIN(self.DecCBFun)
                self.Playctrldll.PlayM4_SetDecCallBackExMend(self.PlayCtrl_Port, self.FuncDecCB, None, 0, None)
                # 开始解码播放
                if self.Playctrldll.PlayM4_Play(self.PlayCtrl_Port, None):
                    print(u'播放库播放成功')
                else:
                    print(u'播放库播放失败')
            else:
                print(u'播放库打开流失败')
        elif dwDataType == NET_DVR_STREAMDATA:
            self.Playctrldll.PlayM4_InputData(self.PlayCtrl_Port, pBuffer, dwBufSize)
        else:
            print(u'其他数据,长度:', dwBufSize)

    def release(self):
        self.Objdll.NET_DVR_StopRealPlay(self.lRealPlayHandle)
        if self.PlayCtrl_Port.value > -1:
            self.Playctrldll.PlayM4_Stop(self.PlayCtrl_Port)
            self.Playctrldll.PlayM4_CloseStream(self.PlayCtrl_Port)
            self.Playctrldll.PlayM4_FreePort(self.PlayCtrl_Port)
            PlayCtrl_Port = c_long(-1)
            self.Objdll.NET_DVR_Logout(self.lUserId)
            self.Objdll.NET_DVR_Cleanup()
        print('释放资源结束')

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.release()


if __name__ == "__main__":
    camIP = '192.168.1.64'
    DEV_PORT = 8000
    username = 'admin'
    password = 'ms00a1@2022'
    hkclass = HKCam(camIP, username, password)
    last_stamp = 0
    while True:
        t0 = time.time()
        n_stamp, img = hkclass.read()
        last_stamp = n_stamp
        cv2.imshow('camera', cv2.resize(img, (800, 600)))
        kkk = cv2.waitKey(1)
        if kkk == ord('q'):
            break
    hkclass.release()
安装依赖
pip install --user flask -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install --user jpype1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install --user subprocess -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install --user chardet -i https://pypi.tuna.tsinghua.edu.cn/simple


python调用jar包

import jpype
jvmPath = jpype.getDefaultJVMPath()
# print(jvmPath)
# jvmPath = ur'D:\Program Files\Java\jdk-18.0.1.1\bin\server\jvm.dll'
# jpype.startJVM(jvmPath)
# jpype.java.lang.System.out.println("hello world!")

# 启动
jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=TemDataCollectDemo.jar")
jpype.shutdownJVM()

路径不能有中文

import os
import jpype

def sendMessage():
    #  1.加载jar包
    jarpath = os.path.join(os.path.abspath("."), "TemDataCollectDemo.jar")
    print(jarpath)
    #  2.获取jvm.dll 的文件路径
    jvmPath = jpype.getDefaultJVMPath()
    print(jvmPath)
    #  3.开启jvm
    jpype.startJVM(jvmPath, "-ea", "-Djava.class.path=%s" % (jarpath))
    print("jvmPath")
    #  4.加载java类(参数是java的长类名)
    # MainProcess = jpype.JClass(jarpath+"TemDataCollectDemo.src.Main")  # 加载类
    MainProcess = jpype.JClass("TemDataCollectDemo.Main")  # 加载类

    #  5.实例化java对象
    javaInstance =MainProcess()
    #  6.调用java方法,由于我写的是静态方法,直接使用类名就可以调用方法
    javaInstance.main()
    #  7.关闭jvm
    jpype.shutdownJVM()
    pass

sendMessage()

代码结构

参考链接

参考链接1
参考链接2

报错

在这里插入图片描述

Java MySql

参考链接1

在这里插入图片描述
在这里插入图片描述

wait_timeout=31536000
interactive_timeout=31536000

在这里插入图片描述

Java数据库

package jdbc;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class TestJDBC {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Connection conn = null;
        try {
            //1.数据库连接的4个基本要素
            //①JDBC URL用于标识一个被注册的驱动程序,驱动程序管理器通过这个URL选择正确的驱动程序,从而建立到数据库的连接;
            //jdbc:表示URL中的协议
            //mysql:子协议,用于标识mysql数据库驱动程序
            //localhost:本机的IP地址
            //3306:mysql 默认端口号
            //test:表示访问test数据库
            String url = "jdbc:mysql://192.168.50.132:3306/bim";

            //user:登录数据库的用户名
            String user = "root"; //自己的账号
            //password:用户名对应的密码,这些都是自己之前设定的
            String password = "root"; //自己的密码
            //mySql的驱动:com.mysql.jdbc.Driver
            String driverName = "com.mysql.jdbc.Driver";


            //2.实例化Driver
            Class clazz = Class.forName(driverName);
            Driver driver = (Driver) clazz.newInstance();


            //3.通过DriverManager来注册驱动
            DriverManager.registerDriver(driver);

            //4.通过DriverManager的getConnection方法,获取Connection类的对象
            System.out.println("url:"+url);
            System.out.println("user:"+user);
            System.out.println("password:"+password);

            try {
                conn = DriverManager.getConnection(url, user, password);
            }
            catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("yes");
                System.out.println("ERROR:"+e);
                e.printStackTrace();}



            //5.打印出conn对象
            System.out.println(conn);


            //获取statement对象
            /*Statement statement = connection.createStatement();*/
            String sql = "select * from stu";
            PreparedStatement preparedStatement = conn.prepareStatement(sql);
            //执行语句
            /**/
            ResultSet resultSet = preparedStatement.executeQuery(sql);
            //返回地数据存储在result中

            while (resultSet.next()){
                System.out.print("[");
                System.out.print( resultSet.getInt(1)+"\t"); //第一列 对应的字段
//                System.out.print( resultSet.getInt("id")+"\t");
                System.out.print( resultSet.getString("name")+"\t");
                System.out.print( resultSet.getString("sex")+"\t");
                System.out.println("]");
            }
            if (resultSet != null){
                resultSet.close();
            }
            if(preparedStatement != null){
                preparedStatement.close();
            }


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                //当conn不为空时
                if(conn != null)
                    //关闭conn资源
                    conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }


    }

}



在这里插入图片描述在这里插入图片描述

Java下载链接

mysql-connector-java8.0.28.jar
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/d8c6e2c6e1a245f78707d9a2694abcae.png

package jdbc;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class TestJDBC {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Connection conn = null;
        try {
            //1.数据库连接的4个基本要素
            //①JDBC URL用于标识一个被注册的驱动程序,驱动程序管理器通过这个URL选择正确的驱动程序,从而建立到数据库的连接;
            //jdbc:表示URL中的协议
            //mysql:子协议,用于标识mysql数据库驱动程序
            //localhost:本机的IP地址
            //3306:mysql 默认端口号
            //test:表示访问test数据库
//            String url = "jdbc:mysql://localhost:3306/bim";
            String url = "jdbc:mysql://localhost:3306/bim?autoReconnect=true&failOverReadOnly=false&useSSL=false&serverTimezone=UTC";

            //user:登录数据库的用户名
            String user = "root"; //自己的账号
            //password:用户名对应的密码,这些都是自己之前设定的
            String password = "root"; //自己的密码
            //mySql的驱动:com.mysql.jdbc.Driver
            String driverName = "com.mysql.jdbc.Driver";


            //2.实例化Driver
            Class clazz = Class.forName(driverName);
            Driver driver = (Driver) clazz.newInstance();


            //3.通过DriverManager来注册驱动
            DriverManager.registerDriver(driver);

            //4.通过DriverManager的getConnection方法,获取Connection类的对象
            System.out.println("url:"+url);
            System.out.println("user:"+user);
            System.out.println("password:"+password);

            try {
                conn = DriverManager.getConnection(url, user, password);
            }
            catch (SQLException e) {
                // TODO Auto-generated catch block
                System.out.println("yes");
                System.out.println("ERROR:"+e);
                e.printStackTrace();}



            //5.打印出conn对象
            if (conn==null)
                System.out.println("conn=null");
            else
                System.out.println(conn);



            //获取statement对象
            /*Statement statement = connection.createStatement();*/
            String sql = "select * from stu";
            System.out.println("成功");


            PreparedStatement preparedStatement = conn.prepareStatement(sql);
            //执行语句
            /**/
            ResultSet resultSet = preparedStatement.executeQuery(sql);
            //返回地数据存储在result中

            while (resultSet.next()){
                System.out.print("[");
                System.out.print( resultSet.getInt(1)+"\t"); //第一列 对应的字段
//                System.out.print( resultSet.getInt("id")+"\t");
                System.out.print( resultSet.getString("name")+"\t");
                System.out.print( resultSet.getString("sex")+"\t");
                System.out.println("]");
            }

            if (resultSet != null){
                resultSet.close();
            }
            if(preparedStatement != null){
                preparedStatement.close();
            }


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                //当conn不为空时
                if(conn != null)
                    //关闭conn资源
                    conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }


    }

}

在这里插入图片描述
在这里插入图片描述

 //获取statement对象
            /*Statement statement = connection.createStatement();*/
//            Connection con = null;
            PreparedStatement stmt = null;
            ResultSet rs = null;


            String sql = "insert into stu values ('6','李白','女')";
            stmt = conn.prepareStatement(sql);
//            int result =stmt.executeUpdate();// 返回值代表收到影响的行数
            System.out.println("插入成功");

在这里插入图片描述

JDBC参考链接

参考链接1

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值