From 4782679591714af82d72843342c8325e853f7f8d Mon Sep 17 00:00:00 2001 From: zqm Date: Fri, 31 Oct 2025 08:43:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DTemperatureData=E7=B1=BB?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E5=86=B2=E7=AA=81=E5=8F=8A=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=8F=82=E6=95=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CS/Framework4.0/Toprie/Toprie/Camera.cs | 2 +- .../Toprie/Toprie/DeviceManager.cs | 321 +++--------------- .../Toprie/Toprie/TemperatureData.cs | 2 +- .../Toprie/TemperatureReceivedEventArgs.cs | 2 +- 4 files changed, 51 insertions(+), 276 deletions(-) diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs index eaf39cf..01062e9 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Camera.cs @@ -1744,7 +1744,7 @@ namespace JoyD.Windows.CS.Toprie for (int j = 0; j < temperatureData.Width; j++) { // 添加温度值,使用逗号分隔 - lineBuilder.Append($"{temperatureData.Data[i, j]:F2}"); + lineBuilder.Append($"{temperatureData.TemperatureMatrix[i, j]:F2}"); if (j < temperatureData.Width - 1) { lineBuilder.Append(","); diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs index 16468cf..f23430e 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs @@ -1147,8 +1147,10 @@ namespace JoyD.Windows.CS.Toprie // 获取温度补偿值 float compensationValue = GetTemperatureCompensationValue(); - // 创建温度数据对象 - TemperatureData temperatureData = new TemperatureData(temperatureFrame, compensationValue); + // 创建温度数据对象,添加缺少的width和height参数 + const int width = 640; // 假设设备分辨率为640x480 + const int height = 480; + TemperatureData temperatureData = new TemperatureData(temperatureFrame, width, height, compensationValue); // 触发温度数据接收事件 OnTemperatureReceived(new TemperatureReceivedEventArgs(temperatureData, temperatureFrame, compensationValue)); @@ -4994,8 +4996,8 @@ namespace JoyD.Windows.CS.Toprie SharedStructures.ImageTemp imageTemp = _a8Sdk.Get_all_temp(); - // 检查是否获取到温度数据 - if (imageTemp == null) + // 检查是否获取到温度数据(使用默认值比较而不是null比较) + if (imageTemp.Equals(default(SharedStructures.ImageTemp))) { Log("未获取到温度数据,返回null"); return null; @@ -5047,14 +5049,28 @@ namespace JoyD.Windows.CS.Toprie } // 创建TemperatureData对象 - TemperatureData temperatureData = new TemperatureData + // 使用Toprie.TemperatureData类的构造函数 + // 首先创建符合构造函数要求的rawData格式 + List rawDataList = new List(); + for (int i = 0; i < height; i++) { - Width = width, - Height = height, - Data = temperatureMatrix, - CompensationValue = compensationValue - }; - temperatureData.CalculateStatistics(); + for (int j = 0; j < width; j++) + { + // 将温度值转换回原始格式(不包含补偿值) + float tempValue = temperatureMatrix[i, j] - compensationValue; + int tempInt = (int)(tempValue * 10.0f); + rawDataList.Add((byte)((tempInt >> 8) & 0xFF)); // 高字节 + rawDataList.Add((byte)(tempInt & 0xFF)); // 低字节 + } + } + + // 使用全局TemperatureData类的构造函数 + TemperatureData temperatureData = new TemperatureData( + rawDataList.ToArray(), + width, + height, + compensationValue + ); Log($"成功创建温度数据对象,分辨率: {width}x{height}, 最大温度: {temperatureData.MaxTemperature:F2}°C, 最小温度: {temperatureData.MinTemperature:F2}°C"); return temperatureData; @@ -5108,14 +5124,27 @@ namespace JoyD.Windows.CS.Toprie } // 创建并返回模拟温度数据对象 - TemperatureData temperatureData = new TemperatureData + // 首先创建符合构造函数要求的rawData格式 + List rawDataList = new List(); + for (int i = 0; i < height; i++) { - Width = width, - Height = height, - Data = temperatureMatrix, - CompensationValue = 0 - }; - temperatureData.CalculateStatistics(); + for (int j = 0; j < width; j++) + { + // 将温度值转换回原始格式 + float tempValue = temperatureMatrix[i, j]; + int tempInt = (int)(tempValue * 10.0f); + rawDataList.Add((byte)((tempInt >> 8) & 0xFF)); // 高字节 + rawDataList.Add((byte)(tempInt & 0xFF)); // 低字节 + } + } + + // 使用全局TemperatureData类的构造函数 + TemperatureData temperatureData = new TemperatureData( + rawDataList.ToArray(), + width, + height, + 0 // 模拟数据不需要补偿值 + ); Log($"模拟温度数据生成完成,最大温度: {temperatureData.MaxTemperature:F2}°C, 最小温度: {temperatureData.MinTemperature:F2}°C"); return temperatureData; @@ -5289,261 +5318,7 @@ namespace JoyD.Windows.CS.Toprie } } - /// - /// 温度数据类,用于存储和处理温度数据 - /// - public class TemperatureData - { - /// - /// 温度数据数组 - /// - public float[,] Data { get; private set; } - - /// - /// 温度数据的宽度(像素) - /// - public int Width { get; private set; } - - /// - /// 温度数据的高度(像素) - /// - public int Height { get; private set; } - - /// - /// 温度补偿值 - /// - public float CompensationValue { get; private set; } - - /// - /// 最大温度值 - /// - public float MaxTemperature { get; private set; } - - /// - /// 最小温度值 - /// - public float MinTemperature { get; private set; } - - /// - /// 平均温度值 - /// - public float AverageTemperature { get; private set; } - - /// - /// 构造函数 - /// - /// 原始温度数据字节数组 - /// 温度补偿值 - public TemperatureData(byte[] rawData, float compensationValue) - { - // 假设分辨率为256x192 - Width = 256; - Height = 192; - CompensationValue = compensationValue; - - // 初始化温度数据数组 - Data = new float[Height, Width]; - - // 解析原始数据 - ParseRawData(rawData); - - // 计算温度统计信息 - CalculateStatistics(); - } - - /// - /// 解析原始温度数据 - /// - /// 原始温度数据字节数组 - private void ParseRawData(byte[] rawData) - { - try - { - // 假设每个温度值由2字节表示 - for (int i = 0; i < Height; i++) - { - for (int j = 0; j < Width; j++) - { - int index = (i * Width + j) * 2; - if (index + 1 < rawData.Length) - { - // 读取2字节数据并转换为温度值 - short rawTempValue = (short)((rawData[index + 1] << 8) | rawData[index]); - - // 转换为实际温度值(假设温度值为原始值除以某个系数) - // 这里使用一个示例转换公式,实际转换方式需要根据设备的数据格式确定 - float temperature = rawTempValue / 100.0f + CompensationValue; - - Data[i, j] = temperature; - } - } - } - } - catch (Exception ex) - { - // 记录异常但不抛出,确保即使解析出错也能继续执行 - Console.WriteLine($"解析温度数据异常: {ex.Message}"); - } - } - - /// - /// 计算温度统计信息 - /// - private void CalculateStatistics() - { - if (Data == null || Data.Length == 0) - { - MaxTemperature = MinTemperature = AverageTemperature = 0.0f; - return; - } - - float sum = 0.0f; - MaxTemperature = float.MinValue; - MinTemperature = float.MaxValue; - int validCount = 0; - - for (int i = 0; i < Height; i++) - { - for (int j = 0; j < Width; j++) - { - float temp = Data[i, j]; - // 跳过无效温度值 - if (!float.IsNaN(temp) && !float.IsInfinity(temp)) - { - sum += temp; - MaxTemperature = Math.Max(MaxTemperature, temp); - MinTemperature = Math.Min(MinTemperature, temp); - validCount++; - } - } - } - - // 计算平均温度 - AverageTemperature = validCount > 0 ? sum / validCount : 0.0f; - } - - /// - /// 获取指定区域的温度数据 - /// - /// 区域左上角X坐标 - /// 区域左上角Y坐标 - /// 区域宽度 - /// 区域高度 - /// 区域温度数据,如果参数无效则返回null - public TemperatureData GetRegionData(int x, int y, int width, int height) - { - // 验证参数 - if (x < 0 || y < 0 || width <= 0 || height <= 0 || - x + width > Width || y + height > Height) - { - return null; - } - - // 创建区域温度数据数组 - float[,] regionData = new float[height, width]; - - // 复制区域数据 - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - regionData[i, j] = Data[y + i, x + j]; - } - } - - // 创建新的温度数据对象 - TemperatureData result = new TemperatureData - { - Width = width, - Height = height, - CompensationValue = CompensationValue, - Data = regionData - }; - result.CalculateStatistics(); - - return result; - } - - /// - /// 获取指定坐标的温度值(摄氏度) - /// - /// X坐标 - /// Y坐标 - /// 温度值,如果坐标无效则返回NaN - public float GetTemperatureAt(int x, int y) - { - if (x < 0 || x >= Width || y < 0 || y >= Height) - { - return float.NaN; - } - return Data[y, x]; - } - - /// - /// 将温度数据转换为指定的温度模式 - /// - /// 目标温度模式 - /// 转换后的温度数据副本 - public TemperatureData ConvertTo(TemperatureMode mode) - { - // 创建新的温度数据对象 - TemperatureData result = new TemperatureData - { - Width = Width, - Height = Height, - CompensationValue = CompensationValue, - Data = new float[Height, Width] - }; - - // 根据目标模式进行转换 - switch (mode) - { - case TemperatureMode.Celsius: - // 如果当前已经是摄氏度,直接复制数据 - for (int i = 0; i < Height; i++) - { - for (int j = 0; j < Width; j++) - { - result.Data[i, j] = Data[i, j]; - } - } - break; - - case TemperatureMode.Fahrenheit: - // 摄氏度转华氏度: F = C * 9/5 + 32 - for (int i = 0; i < Height; i++) - { - for (int j = 0; j < Width; j++) - { - result.Data[i, j] = Data[i, j] * 9.0f / 5.0f + 32.0f; - } - } - break; - - case TemperatureMode.Kelvin: - // 摄氏度转开尔文: K = C + 273.15 - for (int i = 0; i < Height; i++) - { - for (int j = 0; j < Width; j++) - { - result.Data[i, j] = Data[i, j] + 273.15f; - } - } - break; - } - - // 重新计算统计信息 - result.CalculateStatistics(); - - return result; - } - - /// - /// 私有构造函数,用于内部创建 - /// - private TemperatureData() - {} - } + // 移除内部的TemperatureData类定义,使用全局的TemperatureData类 #endregion 温度相关辅助类 } diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/TemperatureData.cs b/Windows/CS/Framework4.0/Toprie/Toprie/TemperatureData.cs index 587e6b4..b0e6670 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/TemperatureData.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/TemperatureData.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Toprie +namespace JoyD.Windows.CS.Toprie { /// /// 温度数据模型类,用于存储和处理红外热像仪采集的温度数据 diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/TemperatureReceivedEventArgs.cs b/Windows/CS/Framework4.0/Toprie/Toprie/TemperatureReceivedEventArgs.cs index 849d4f5..dcf9341 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/TemperatureReceivedEventArgs.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/TemperatureReceivedEventArgs.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Toprie +namespace JoyD.Windows.CS.Toprie { /// /// 温度数据接收事件参数类