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

这篇具有很好参考价值的文章主要介绍了Unity接入海康SDK—热成像测温篇(最简单且详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、基本需求信息

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

二、基本流程

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

  1. 初始化SDK
    主要使用函数:NET_DVR_Init
    unity手机红外热成像仪,Unity接入海康相机SDK,unity,c#

  2. 登录
    主要使用函数:NET_DVR_Login_V40
    unity手机红外热成像仪,Unity接入海康相机SDK,unity,c#

  3. 进行测温
    主要使用函数:NET_DVR_StartRemoteConfig、NET_DVR_StopRemoteConfig
    注意说明:测温函数需要在已经登录完毕返回完数值之后再进行测温函数操作,所以我直接写了个协程等待方法。
    unity手机红外热成像仪,Unity接入海康相机SDK,unity,c#
    停止测温:
    unity手机红外热成像仪,Unity接入海康相机SDK,unity,c#
    测温方法回调函数:
    unity手机红外热成像仪,Unity接入海康相机SDK,unity,c#

  4. 退出(注销登录 释放内存)
    unity手机红外热成像仪,Unity接入海康相机SDK,unity,c#
    上脚本!文章来源地址https://www.toymoban.com/news/detail-834551.html

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

}


到了这里,关于Unity接入海康SDK—热成像测温篇(最简单且详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity接入SDK

    C#是托管语言,C++是非托管语言。 托管代码和非托管代码的区别 1、托管代码是一种中间语言,运行在CLR上;非托管代码被编译为机器码,运行在机器上。 2、托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;非托管代码依赖于平台和语言。 3、托管代码可

    2024年02月16日
    浏览(30)
  • 【Unity】接入Max广告聚合SDK

    下载和导入MAX Unity插件: 官方SDK链接 在这里插入图片描述 2.初始化MAX SDK: 3.配置广告源 选择所需要的广告源。点install。ExternalDependencyManager会帮你根据选择的广告源下载对应的SDK,可能需要挂vpn 4.在Unity应用中加载广告 激励视频有一下参考接口 其他类型的广告接口可以看侧

    2024年02月08日
    浏览(32)
  • 【第三方SDK接入汇总】Unity接入VuforiaAR(图片识别)

    目录 一.注册Vuforia账号 二.获取许可秘钥 三.获取Vuforia的SDK导入unity 四.搭建创建AR场景 五.打包到手机 注册地址:Engine Developer Portal 申请地址:https://developer.vuforia.com/vui/develop/licenses 方式一: 官网下载 下载地址:SDK Download | Engine Developer Portal  下载后把package包导入unity即可。

    2024年04月08日
    浏览(42)
  • Unity与Android交互(4)——接入SDK

    【前言】 unity接入Android SDK有两种方式,一种是把Unity的工程导出google project的形式进行接入,另一种是通过把Android的工程做成Plugins的形式进行接入。我们接入SDK基本都是将SDK作为插件的形式接入的。 对我们接入SDK的人来说,SDK也是分等级的: 第一等级:只有so文件,这种

    2024年02月16日
    浏览(34)
  • Unity与iOS交互(2)——接入SDK

    【前言】 接入Android和iOS SDK有很多相同的地方,建议先看下Android SDK如何接入。  【UnityAppController详解】  整个程序的入口在MainApp文件下的 main.mm 文件中,先加载了unityframework,然后调用runUIApplicationMain。源码如下:(这些源码在Xcode工程里都有) 可以看看 UnityFramework.h 文件中

    2024年02月13日
    浏览(84)
  • unity接入讯飞AIUI(Windows SDK)

    一、什么是AIUI AIUI 是一套人机交互解决方案,整合了语音唤醒、语音识别、语义理解、内容平台、语音合成(比普通的语音合成多一个发音人)等能力。 新用户有20个免费的装机量,每天有500交互次数 二、创建AIUI 在控制台→我的应用→创建新应用中来创建自己测试项目 三

    2024年02月08日
    浏览(29)
  • Unity发布抖音小游戏:SDK接入

    上篇介绍Unity小游戏发布抖音平台的开发者账号注册以及小游戏创建和申请。本篇介绍字节SDK接入Unity游戏项目中。 接入参考教程:Docs,下载bgdt.package包,并导入Unity项目工程。    打开ByteGame菜单,弹出字节工具面板。点击下载安装另外2个字节小游戏工具。   安装完毕后,

    2024年02月16日
    浏览(33)
  • 【Unity】接入MAX聚合广告SDK Applovin + GoogleAdmob

    版本: Unity:2019.4.35f1 gradle plugin: 4.2.0 (实际要7.0+ 对应build_tools:34.0.0) gradle: 6.7.1 (实际要7.0+ 对应build_tools:34.0.0) jdk: 1.8.0_241 build_tools: 34.0.0 ndk: android-ndk-r19 文档: 6.0.1(Android 12.0.0 iOS 12.0.0) MAX聚合广告Unity:MAX Mediation Documentation 8.5.3 Google Admob:Releases · googleads/googleads-mobi

    2024年02月05日
    浏览(33)
  • unity海康威视原生SDK拉取网络摄像头画面,并展示在一个Material上

    untiy版本是2019.4,低版本会有问题,速度比UMP插件快得多 原理是使用sdk获取视频流,格式为YUV,然后分离YUV通道到三张不同的Texture2D上,通过shader将三个通道重新输出为原始图像。 我将所用的各个部分已经整理成一个压缩包,免积分下载 压缩包结构如下 使用步骤 1 DLL:放在

    2024年02月13日
    浏览(32)
  • Unity使用Android Stdio接入SDK制作AAR包

    最近需要在Unity2021版本中接入SDK,发现和直接接入SDK有些区别,这里把接入的流程记录一下。 Unity在最新的版本中把UnityPlayActivity.java,从Class.jar中移除,需要在Unity的工程内找到这个文件,并把其加入到Android Stadio内,才能使用。 ①选择Android Library ②包名要和Unity工程里面相

    2024年02月10日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包