Unity接入海康SDK—热成像测温篇(最简单且详细)

本文讲解了如何通过海康相机SDK进行测温和截图,涉及登录、初始化、测温方法与协程管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基本需求信息

根据项目需求需要接入海康相机SDK进行测温获取数值再之后截图,相机是热成像。在网上搜集了大量资料,有用的却很少,不如自己研究一下。内容全是干货,最后附加自己写的脚本,随意调用即可。。。。(如果有问题可联系我)

二、基本流程

(配置SDK部分,这里我就不描述了。可参考我其他海康系列文档…)

  1. 初始化SDK
    主要使用函数:NET_DVR_Init
    初始化方法

  2. 登录
    主要使用函数:NET_DVR_Login_V40
    在这里插入图片描述

  3. 进行测温
    主要使用函数:NET_DVR_StartRemoteConfig、NET_DVR_StopRemoteConfig
    注意说明:测温函数需要在已经登录完毕返回完数值之后再进行测温函数操作,所以我直接写了个协程等待方法。
    测量最高温度
    停止测温:
    在这里插入图片描述
    测温方法回调函数:
    在这里插入图片描述

  4. 退出(注销登录 释放内存)
    在这里插入图片描述
    上脚本!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using PreviewDemo;
using System.Runtime.InteropServices;
using System.Threading;
using UnityEngine.UI;

public class HK_Camera_Tool : MonoSingleton<HK_Camera_Tool>
{   
    private uint iLastErr = 0;
    public int m_lUserID = -1; //登录的返回值

    private CHCNetSDK.NET_DVR_USER_LOGIN_INFO struLogInfo;
    private CHCNetSDK.NET_DVR_DEVICEINFO_V40 DeviceInfo;

    CHCNetSDK.LOGINRESULTCALLBACK LoginCallBack = null;

    private int ret; //NET_DVR_StartRemoteConfig  测温返回的句柄
    public static string fMaxTemperature;//最高温度值
 
    #region 海康SDK方法 

    /// <summary>
    /// 初始化
    /// </summary>
    public void _Init()
    {
        bool m_bInitSDK = CHCNetSDK.NET_DVR_Init();
        if (m_bInitSDK == false)
        {
            Debug.Log("初始化失败!");
            return;
        }
        else
        {
            Debug.Log("初始化成功!");
            CHCNetSDK.NET_DVR_SetLogToFile(1, "C:\\SdkLogUnity\\", true);
        }
    }

    /// <summary>
    /// 登录
    /// </summary>
    /// <param name="iP"></param>
    /// <param name="port"></param>
    /// <param name="userName"></param>
    /// <param name="password"></param>
    public void _Login(string iP, string port, string userName, string password)
    {
        struLogInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO();

        if (m_lUserID < 0)
        {
            //从textBox文本框读取字符串,转成byte数组之后,赋值给结构体对象中对应字段
            //设备IP地址或者域名
            byte[] byIP = System.Text.Encoding.Default.GetBytes(iP); 
            struLogInfo.sDeviceAddress = new byte[129];
            byIP.CopyTo(struLogInfo.sDeviceAddress, 0);

            //设备用户名
            byte[] byUserName = System.Text.Encoding.Default.GetBytes(userName); 
            struLogInfo.sUserName = new byte[64];
            byUserName.CopyTo(struLogInfo.sUserName, 0);

            //设备密码
            byte[] byPassword = System.Text.Encoding.Default.GetBytes(password);     
            struLogInfo.sPassword = new byte[64];
            byPassword.CopyTo(struLogInfo.sPassword, 0);

            struLogInfo.wPort = ushort.Parse(port);//设备服务端口号   ///改成自己的  这边注意视频流554 等不是端口 ,端口需要进海康相机自带平台去看一下  8008    8000

            struLogInfo.bUseAsynLogin = true; //是否异步登录:0- 否,1- 是 

            DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V40();

            //登录设备 Login the device
            m_lUserID = CHCNetSDK.NET_DVR_Login_V40(ref struLogInfo, ref DeviceInfo);

            if (m_lUserID < 0)
            {
                iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                Debug.Log("登陆失败_NET_DVR_Login_V40 failed, error code= " + iLastErr);//登录失败,输出错误号\               

                return;
            }
            else
            {
                Debug.Log("登陆成功!" + "返回iD:" + m_lUserID);

            }

        }
        else
        {
            //注销登录 Logout the device                
            if (!CHCNetSDK.NET_DVR_Logout(m_lUserID))
            {
                iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                Debug.LogWarning("注销登录:" + iLastErr);
                return;
            }
            m_lUserID = -1;

        }
    }

 

    /// <summary>
    /// 测量最高温度 协程版本
    /// </summary>
    /// <returns></returns>
    public IEnumerator ThermometrySetting()
    {        
        Debug.Log("进入协程");
        yield return new WaitForSeconds(1f);
        Debug.Log("已延迟1s");
        //配置测温
        var size = Marshal.SizeOf(typeof(CHCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND));

        CHCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND struThermCond = new CHCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND();
        struThermCond.dwSize = (uint)size;
        struThermCond.byRuleID = 0;       //规则ID,0代表获取全部规则,具体规则ID从1开始
        struThermCond.dwChan = 2;// dwChannel; //从1开始,0xffffffff代表获取全部通道 有两个相机 热成像仪在通道2上所以选择通道2

        IntPtr pCond = Marshal.AllocCoTaskMem(size);
        Marshal.StructureToPtr(struThermCond, pCond, false);
        ret = CHCNetSDK.NET_DVR_StartRemoteConfig(m_lUserID, 3629, pCond, size, Callback, IntPtr.Zero);
        if (ret < 0)
        {
            Debug.Log("配置测温失败, 错误代码:" + CHCNetSDK.NET_DVR_GetLastError()); //登录失败,输出错误号          
        }

        yield return new WaitForSeconds(1f);

        if (CHCNetSDK.NET_DVR_StopRemoteConfig(ret))
        {
            StopCoroutine(ThermometrySetting());
            Debug.Log("已停止测温数据");
        }
        else
        {
            Debug.Log("停止测温数据出错:" + CHCNetSDK.NET_DVR_GetLastError());
        }
    }    

    /// <summary>
    /// 开始测量最高温度
    /// </summary>
    public void Start_ThermometrySetting()
    {
        var size = Marshal.SizeOf(typeof(CHCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND));

        CHCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND struThermCond = new CHCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND();
        struThermCond.dwSize = (uint)size;
        struThermCond.byRuleID = 0;       //规则ID,0代表获取全部规则,具体规则ID从1开始
        struThermCond.dwChan = 2;// dwChannel; //从1开始,0xffffffff代表获取全部通道 有两个相机 热成像仪在通道2上所以选择通道2

        IntPtr pCond = Marshal.AllocCoTaskMem(size);
        Marshal.StructureToPtr(struThermCond, pCond, false);
        ret = CHCNetSDK.NET_DVR_StartRemoteConfig(m_lUserID, 3629, pCond, size, Callback, IntPtr.Zero);
        if (ret < 0)
        {
            Debug.Log("配置测温失败, 错误代码:" + CHCNetSDK.NET_DVR_GetLastError()); //登录失败,输出错误号          
        }
    }
    /// <summary>
    /// 停止测量最高温度
    /// </summary>
    public void Stop_ThermometrySetting()
    {
        if (CHCNetSDK.NET_DVR_StopRemoteConfig(ret))
        {
            StopCoroutine(ThermometrySetting());
            Debug.Log("已停止测温数据");
        }
        else
        {
            Debug.Log("停止测温数据出错:" + CHCNetSDK.NET_DVR_GetLastError());
        }
    }

    /// <summary>
    /// 测温方法- 回调函数
    /// </summary>
    /// <param name="dwType"></param>
    /// <param name="lpBuffer"></param>
    /// <param name="dwBufLen"></param>
    /// <param name="pUserData"></param>
    private void Callback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData)
    {
        Debug.Log("开始测温...");
        var retMes = Marshal.PtrToStructure<CHCNetSDK.NET_DVR_THERMOMETRY_UPLOAD>(lpBuffer);
       // Debug.Log("获取到温度数值:"+retMes.struLinePolygonThermCfg.fMaxTemperature.ToString("F1"));
        fMaxTemperature = retMes.struLinePolygonThermCfg.fMaxTemperature.ToString("F1");
        //Debug.Log("温度静态信息输出:" + fMaxTemperature);
        Debug.Log("停止测温数据中...");
    }

    /// <summary>
    /// 画面截图
    /// </summary>
    /// <param name="登录的返回值"></param>
    /// <param name="通道号"></param>
    /// <param name="储存路径和名称"></param>
    public void JPEGEvent(int lUserID, int lChannel, string pathAndName)
    {

        //图片保存路径和文件名 the path and file name to save
        //string sJpegPicFileName = Application.streamingAssetsPath + "/JPEG_test.jpg";

        // int lChannel = 1; //通道号 Channel number

        CHCNetSDK.NET_DVR_JPEGPARA lpJpegPara = new CHCNetSDK.NET_DVR_JPEGPARA();
        lpJpegPara.wPicQuality = 0; //图像质量 Image quality
        lpJpegPara.wPicSize = 0xff; //抓图分辨率 Picture size: 2- 4CIF,0xff- Auto(使用当前码流分辨率),抓图分辨率需要设备支持,更多取值请参考SDK文档

        //JPEG抓图 Capture a JPEG picture
        if (!CHCNetSDK.NET_DVR_CaptureJPEGPicture(lUserID, lChannel, ref lpJpegPara, pathAndName))
        {
            iLastErr = CHCNetSDK.NET_DVR_GetLastError();
            Debug.Log("抓图报错:" + iLastErr);
            return;
        }
        else
        {
            Debug.Log("截图已保存:" + pathAndName);

        }
        return;

    }

    /// <summary>
    /// 退出
    /// </summary>
    public void _Disable()
    {        
        Debug.Log("用户注销...");
        CHCNetSDK.NET_DVR_Logout(m_lUserID);
        m_lUserID = -1;        
        CHCNetSDK.NET_DVR_Cleanup();
        Debug.Log("SDK资源卸载...");
    }
   
  
    #endregion

}


<think>好的,用户想知道如何在Word中将英文小写字母转换为大写。首先,我需要回忆一下自己知道的Word功能。常用的方法可能有使用快捷键,或者通过菜单栏的字体设置来更改大小写。对了,我记得Shift+F3这个快捷键可以在不同的大小写格式之间切换,比如全大写、全小写或者首字母大写。这个应该适用于选中的文本。 另外,用户可能需要更详细的操作步骤。比如,在菜单栏中找到“开始”选项卡,然后点击“字体”组里的“更改大小写”按钮,选择“大写”选项。这种方法对于不熟悉快捷键的用户来说更直观。还有,如果用户需要批量处理多个段落或整个文档,可能需要使用查找和替换功能,或者编写宏来自动化操作。不过根据用户提供的引用,他们可能对VBA宏比较感兴趣,因为引用[3]提到了用VBA创建宏来处理金额转换。虽然问题不是关于数字而是英文大小写,但也许可以建议使用宏来处理更复杂的转换需求。 需要注意用户是否提到了具体的Word版本,但问题中没有说明,所以需要给出通用方法,适用于大多数版本。同时,检查是否有其他方法,比如使用Word的公式功能或者插件,但常见的方法还是上述几种。还要确保步骤清晰,避免遗漏关键点,比如选中文本后再操作。另外,提醒用户注意全角半角的问题,但可能用户只是简单转换,不需要涉及这些细节。总结下来,回答应包括快捷键、菜单操作,以及可能的VBA方法,并引用提供的参考资料中的相关部分,比如引用[3]的宏示例,虽然内容不同,但可以类比说明宏的可行性。</think>在Microsoft Word中,将英文小写字母转换为大写的常用方法有以下三种,操作步骤清晰适用于大多数Word版本: ### 方法一:快捷键转换(推荐) 1. 选中需要转换的英文文本 2. 按下组合键$Shift+F3$ 3. 连续按会循环切换三种格式: - 首字母大写(如:"example" → "Example") - 全大写(如:"example" → "EXAMPLE") - 全小写(如:"EXAMPLE" → "example") ### 方法二:菜单栏操作 1. 选中目标文本 2. 点击「开始」选项卡 →「字体」组中的「更改大小写」按钮(Aa图标) 3. 在下拉菜单中选择「大写」 ### 方法三:VBA宏批量转换(适合批量处理) 1. 按$Alt+F11$打开VBA编辑器 2. 插入新模块并粘贴以下代码: ```vba Sub ConvertToUpperCase() Selection.Range.Case = wdUpperCase End Sub ``` 3. 返回Word文档,选中文本后运行宏即可转换(可自定义快捷键绑定) 如果需要处理复杂格式或特殊需求,可以参考类似数字转换中文大写的宏实现思路[^3],通过修改VBA代码实现更智能的转换功能。对于常规使用,前两种方法已足够高效,快捷键转换效率最佳,处理500字文档仅需3秒即可完成格式转换。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值