news 2026/5/19 8:03:47

基于UTi165K热成像与Python OpenCV的体温筛查系统开发实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于UTi165K热成像与Python OpenCV的体温筛查系统开发实践

1. 项目概述:从发烧筛查到可编程热成像

如果你在2020年之后出入过机场、大型办公楼或商场,大概率已经和热成像体温筛查设备打过照面了。这些设备通常价格不菲,动辄数万元,核心功能却相对单一:在屏幕上显示一个彩色的人体热图,并在额头温度超过阈值时发出警报。UTi165K这款设备的有趣之处在于,它以一个消费级的价格(通常几百美元),提供了一个“半开放”的热成像核心。你不仅可以直接用它进行体温初筛,更能通过其USB视频输出功能,将原始的热成像数据流接入电脑,用Python和OpenCV进行二次开发,实现从简单的温度记录到复杂的多目标追踪与数据分析。

简单来说,UTi165K是一个专为人体温度范围(30°C~45°C)优化的热成像模组,内置电池和显示屏,可独立工作。但其真正的潜力在于“UTi165K”后缀中的“K”版本所支持的USB Video Class(UVC)协议。这意味着在操作系统层面,它被识别为一个标准的USB摄像头,只不过这个“摄像头”拍摄的不是可见光,而是红外辐射转换后的温度数据。这个设计决策,为开发者打开了一扇大门,让我们可以用处理普通网络摄像头的思路来处理热成像数据,极大地降低了开发门槛。

2. 热成像体温筛查的核心原理与技术选型

2.1 为什么是热成像?从黑体辐射到表皮温度

热成像技术并非直接“看到”温度,而是探测物体表面散发的红外辐射能量。所有高于绝对零度(-273.15°C)的物体都会向外辐射电磁波,其辐射强度与波长分布取决于物体自身的温度,这由普朗克黑体辐射定律描述。人体作为恒温动物,皮肤表面温度通常在33°C左右,其辐射峰值波长在9-10微米的中远红外波段。

普通的热成像相机(如建筑检测用的FLIR相机)需要覆盖从零下几十度到上千度的宽温域,其传感器和算法需要在宽动态范围内保持线性,这往往在人体温区(30-45°C)牺牲了绝对精度。而像UTi165这样的发烧筛查专用相机,其传感器和内部处理电路专门针对这一狭窄温区进行了校准和优化,因此能实现±0.5°C的较高测量精度。这背后的关键点在于温度标定:工厂会在多个已知温度点(如35°C, 37°C, 40°C)对每个像素进行校准,生成一个查找表,确保在目标温区内每个灰度值都能准确对应一个温度值。

注意:这里测量的是体表温度,而非临床意义上的核心体温(如口腔、直肠温度)。体表温度受环境、风速、测量距离、额头是否有汗水或遮挡物影响极大。因此,这类设备通常用于“初筛”,发现异常目标后,再用医用级接触式体温计进行复核,这是符合公共卫生筛查逻辑的。

2.2 UTi165K的硬件架构与数据流解析

理解硬件是有效开发的前提。UTi165K本质上是一个集成了多个子系统的嵌入式设备:

  1. 红外焦平面阵列(FPA):核心是160x120分辨率的非制冷微测辐射热计。每个像素点都是一个微小的温度敏感电阻,吸收红外辐射后自身温度变化,引起电阻值变化。
  2. 读出电路与信号处理:将每个像素微弱的电阻变化信号放大、数字化,并经过复杂的处理(如非均匀性校正、坏点替换、温度补偿)得到原始的测温数据。
  3. 图像合成与叠加:设备内部将160x120的热数据通过插值算法放大到320x240(匹配显示屏分辨率),并映射为彩色(如铁红、彩虹等伪彩色)。同时,它可能还集成了一个普通的可见光摄像头(Digital模式),用于实现热像与可见光的融合(Fusion模式)。
  4. 视频编码与输出:处理后的最终图像(320x240)被封装成标准的MJPEG或YUV视频流,通过USB UVC协议输出。关键就在这里:我们通过USB获取的,已经是经过内部处理、带有温度-颜色映射的“视频画面”,而不是原始的、每个像素代表具体温度的矩阵数据。

然而,官方Python示例代码中struct.unpack(“h”, frame[320][0][0:2])[0]/10这一行暗示,在某些模式下(可能是关闭了RGB转换),我们或许能从视频帧的特定位置(如第320行,这是一个超出显示范围的行,常用于携带元数据)提取到原始的、或经过简单编码的温度数据。这是开发者需要深入挖掘的宝藏。

2.3 为何选择Python + OpenCV作为开发栈?

官方提供了Windows独占的图形化软件,功能固定。要实现定制化需求(如多摄像头同步、温度数据记录到数据库、与门禁系统联动、AI人脸检测与温度关联),就必须进行二次开发。Python + OpenCV组合成为首选,原因如下:

  • 跨平台:代码可在Windows、macOS、Linux上运行,解决了官方软件的平台限制问题。
  • 生态强大:OpenCV是计算机视觉的事实标准库,提供了极其便捷的摄像头捕获、图像处理、显示和保存功能。围绕它的生态(如NumPy用于数值计算,PyQt/Tkinter用于GUI)非常成熟。
  • 开发效率高:Python语法简洁,能快速实现想法原型。对于体温筛查这类逻辑相对清晰的应用,Python完全能满足性能要求。
  • UVC协议兼容:OpenCV的cv2.VideoCapture接口完美支持标准的UVC摄像头,UTi165K正是这样一个设备。

3. 开发环境搭建与基础数据捕获

3.1 软硬件准备清单

在写第一行代码前,确保你的环境就绪:

  • 硬件
    • UTi165K热成像相机(注意是带USB输出的K版)。
    • USB Type-C数据线(用于数据传输和供电)。
    • 一台电脑(Windows/macOS/Linux均可)。
  • 软件
    • Python 3.7或以上版本。
    • OpenCV-Python库:这是核心。官方示例基于4.3.0.36,建议使用相近或更新版本。
    • 可选但推荐:NumPy, Matplotlib(用于数据分析与可视化),一个IDE如VS Code或PyCharm。

安装OpenCV非常简单,在命令行中执行:

pip install opencv-python pip install numpy # 通常opencv-python会附带,但明确安装更稳妥

3.2 理解并运行官方示例代码

官方提供的opencv_uti165k.py是一个极佳的起点。我们来逐段拆解其关键操作:

import numpy as np import time import cv2 import struct # 关键步骤1:探测并初始化摄像头 camera_num = 0 for camera_num in range(6): cam = cv2.VideoCapture(camera_num) if not cam.isOpened(): print(“Was not able to open camera”, camera_num) cam.release() continue # 尝试设置分辨率 if not cam.set(3, 240): # 3对应CV_CAP_PROP_FRAME_WIDTH print(“Was not able to set width”) cam.release() continue if not cam.set(4, 321): # 4对应CV_CAP_PROP_FRAME_HEIGHT print(“Was not able to set height”) cam.release() continue # 验证分辨率是否设置成功 if cam.get(3) != 240 or cam.get(4) != 321: print(“Resolution verification failed”) cam.release() continue break

这段代码的核心是自动探测摄像头索引。因为你的电脑上可能已有内置摄像头或其他USB摄像头,UTi165K的索引号不一定是0。循环尝试0-5,并尝试将其分辨率设置为240x321。为什么是321而不是240?这是一个非常规分辨率,很可能是因为320x240的显示画面加上一行用于携带温度等元数据的行(第321行)。成功设置并验证后,跳出循环。

print(“Camera %d open at size: (%d x %d) %d FPS” % (camera_num, cam.get(3), cam.get(4), cam.get(5))) cv2.namedWindow(‘Thermal Camera - Press Q to quit’, cv2.WINDOW_NORMAL) cv2.resizeWindow(‘Thermal Camera - Press Q to quit’, 480, 642) # 窗口放大一倍便于观看 while(True): # 关键步骤2:获取并显示彩色视频帧 cam.set(cv2.CAP_PROP_CONVERT_RGB, 1) # 确保转换为RGB格式 ret, frame = cam.read() if not ret: print(“Failed to fetch frame”) time.sleep(0.1) continue colorframe = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA) # BGR转BGRA,增加Alpha通道 cv2.imshow(‘Thermal Camera - Press Q to quit’, colorframe) # 关键步骤3:尝试获取原始数据并解析温度(实验性功能) cam.set(cv2.CAP_PROP_CONVERT_RGB, 0) # 关闭RGB转换,可能获取原始数据 ret, frame = cam.read() if not ret: time.sleep(0.1) continue # 解析特定位置的温度数据 print(“Temp calculation (experimental): “, end=”” ) # 假设第320行,第0列开始的两个字节存储了一个温度值(可能是热点温度?) print(struct.unpack(“h”, frame[320][0][0:2])[0]/10) cam.set(cv2.CAP_PROP_CONVERT_RGB, 1) # 切换回RGB模式 if cv2.waitKey(1) & 0xFF == ord(‘q’): break

循环体内的操作是双模式的:

  1. 模式一(RGB显示):获取一帧,转换成彩色图像,并显示出来。这就是你在屏幕上看到的伪彩色热图。
  2. 模式二(原始数据读取):通过cam.set(cv2.CAP_PROP_CONVERT_RGB, 0)设置,告诉OpenCV不要将原始数据转换为RGB图像。随后读取的frame可能是一种原始格式(如YUV)。代码尝试从frame[320][0]这个像素点(注意索引,第321行是320)的前两个字节,按照短整型(h)解包,并除以10得到一个温度值。这是一个“实验性”功能,说明开发者正在逆向工程设备的数据协议。

实操心得:在实际测试中,CAP_PROP_CONVERT_RGB属性可能并非对所有摄像头驱动都有效。如果frame[320]索引越界或解析出的数据无意义,说明这个隐藏的数据通道在当前驱动或模式下并未启用。此时,更可靠的方法是分析RGB图像本身。因为彩色热图是温度到颜色的映射,我们可以通过分析特定区域(如额头)的像素颜色,反向推断其大致温度范围,但这需要事先知道设备使用的颜色映射表(Color Palette)。

3.3 连接稳定性与故障排查

官方文档中提到了一个常见问题:初次连接时应用可能无法识别摄像头。这在使用OpenCV时同样可能遇到。其根本原因在于UVC设备枚举和初始化的时序问题。

标准化的排查与解决流程如下:

  1. 检查设备管理器(Windows)或系统信息(macOS/Linux):首先确保硬件连接正确。在Windows设备管理器的“图像设备”或“摄像头”下,应能看到“USB Camera”或类似名称的设备。如果看到黄色感叹号,可能需要安装通用UVC驱动。
  2. 使用第三方软件验证:在运行Python代码前,先用一个简单的摄像头查看软件(如Windows的“相机”应用,或OBS Studio)确认UTi165K能被系统识别并输出图像。这能隔离是Python/OpenCV问题还是系统驱动问题。
  3. OpenCV索引探测:如果上一步成功,但OpenCV代码找不到,可以运行一个简短的探测脚本:
    import cv2 for i in range(10): cap = cv2.VideoCapture(i, cv2.CAP_DSHOW) # Windows上尝试DSHOW后端 if cap.isOpened(): print(f“Found camera at index {i}”) cap.release()
    在Linux上,后端可能是cv2.CAP_V4L2;在macOS上是cv2.CAP_AVFOUNDATION
  4. 遵循正确的插拔顺序:如果问题依旧,采用官方建议的“硬重启”流程:
    • 关闭所有可能占用摄像头的软件(包括你的Python脚本)。
    • 从电脑上拔下USB线。
    • 关闭UTi165K相机电源。
    • 等待10秒。
    • 打开相机电源。
    • 重新插入USB线。
    • 等待5秒让系统重新识别,再启动你的Python脚本。

4. 从基础显示到高级应用开发

4.1 解析视频流并提取温度信息

官方示例中实验性的温度解析给了我们一个方向,但不够稳定。更实用的思路是基于RGB图像进行区域温度分析。虽然无法得到像原始传感器数据那样精确的绝对温度值,但对于筛查场景(判断是否超过阈值)已经足够。

步骤一:定义感兴趣区域(ROI)体温筛查通常关注人脸额头区域。我们可以先用人脸检测器(如OpenCV自带的Haar Cascade或更精确的Dlib人脸关键点检测)定位人脸,然后在额头位置划定一个矩形ROI。

import cv2 # 加载人脸检测器(需下载haarcascade_frontalface_default.xml) face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + ‘haarcascade_frontalface_default.xml’) def detect_forehead_roi(face_rect): “”“根据人脸矩形框,估算额头区域”“” x, y, w, h = face_rect # 额头通常位于人脸上半部分的中部 forehead_h = int(h * 0.25) # 额头高度约占脸高的1/4 forehead_y = y + int(h * 0.1) # 从脸部顶端往下10%开始 forehead_x = x + int(w * 0.25) forehead_w = int(w * 0.5) return (forehead_x, forehead_y, forehead_w, forehead_h)

步骤二:分析ROI颜色与温度映射这是最具挑战的部分。UTi165K屏幕上的伪彩色图使用的是内置的调色板。我们需要找到这个颜色-温度的映射关系。一个笨拙但有效的方法是经验标定法

  1. 准备一个已知表面温度的热源(如恒温水杯,用接触式测温仪测其表面温度)。
  2. 用UTi165K拍摄该热源,确保其充满ROI。
  3. 在Python中,读取该ROI内所有像素的平均颜色值(在HSV色彩空间下分析色调Hue可能更稳定,因为亮度S和明度V受环境光影响大)。
  4. 记录下不同温度点(如35°C, 36°C, 37°C, 38°C)对应的平均色调值。
  5. 通过曲线拟合,建立一个从色调值到温度的近似转换公式。
def approximate_temperature_from_hue(roi_image): “”“根据ROI图像的平均色调估算温度(需要预先标定)”“” hsv = cv2.cvtColor(roi_image, cv2.COLOR_BGR2HSV) avg_hue = np.mean(hsv[:,:,0]) # 假设我们通过标定得到线性关系:温度 = a * avg_hue + b # 例如:temp_c = 0.1 * avg_hue + 30.0 (这只是一个虚构的例子,必须自行标定!) a, b = 0.1, 30.0 # **这些系数必须通过实际标定获得!** return a * avg_hue + b

重要警告:这种方法得到的温度是相对且近似的,受环境、相机设置、个体肤色差异影响极大,绝不能用于需要临床精度的场合。它仅适用于在固定环境、固定相机参数下,对同一类目标(如人脸)进行相对温度比较和阈值报警。

4.2 实现体温筛查报警与数据记录系统

结合人脸检测和温度估算,我们可以构建一个简单的自动化筛查系统。

import cv2 import numpy as np import time import csv from datetime import datetime # 初始化 cap = cv2.VideoCapture(0) # 假设UTi165K是索引0 cap.set(3, 240) cap.set(4, 321) face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + ‘haarcascade_frontalface_default.xml’) temperature_threshold = 37.3 # 报警阈值,单位°C alarm_on = False log_data = [] while True: ret, frame = cap.read() if not ret: break display_frame = frame.copy() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.1, 4) current_max_temp = 0 for (x, y, w, h) in faces: # 绘制人脸框 cv2.rectangle(display_frame, (x, y), (x+w, y+h), (255, 0, 0), 2) # 估算额头ROI和温度 fx, fy, fw, fh = detect_forehead_roi((x, y, w, h)) forehead_roi = frame[fy:fy+fh, fx:fx+fw] if forehead_roi.size == 0: continue est_temp = approximate_temperature_from_hue(forehead_roi) current_max_temp = max(current_max_temp, est_temp) # 在额头框上方显示温度 label = f“Temp: {est_temp:.1f}C” cv2.putText(display_frame, label, (fx, fy-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # 如果超温,用红色框标记 if est_temp >= temperature_threshold: cv2.rectangle(display_frame, (fx, fy), (fx+fw, fy+fh), (0, 0, 255), 3) alarm_on = True # 记录日志 log_entry = { “timestamp”: datetime.now().isoformat(), “face_location”: (x, y, w, h), “estimated_temp”: est_temp, “threshold”: temperature_threshold } log_data.append(log_entry) # 显示最高温度和报警状态 cv2.putText(display_frame, f“Max: {current_max_temp:.1f}C”, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 255), 2) if alarm_on: cv2.putText(display_frame, “HIGH TEMP ALARM!”, (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) # 这里可以触发声音报警,例如:os.system(‘echo “\a”’) cv2.imshow(‘Fever Screening Demo’, display_frame) alarm_on = False # 重置报警,下一帧重新判断 if cv2.waitKey(1) & 0xFF == ord(‘q’): break cap.release() cv2.destroyAllWindows() # 将日志保存为CSV文件 if log_data: keys = log_data[0].keys() with open(‘temperature_screening_log.csv’, ‘w’, newline=‘’) as f: writer = csv.DictWriter(f, fieldnames=keys) writer.writeheader() writer.writerows(log_data) print(f“Log saved with {len(log_data)} entries.”)

这个系统实现了基础功能:人脸检测、额头区域温度估算、超温报警、屏幕信息叠加和数据记录。你可以在此基础上扩展,例如加入排队人数统计、温度变化趋势图、与SQLite数据库集成、或者通过网络接口将报警信息推送到管理后台。

4.3 探索高级功能:多模态融合与数据分析

UTi165K的“Fusion”模式提示了另一个有趣的方向:红外与可见光图像融合。虽然通过USB我们可能只获得最终合成的视频流,但如果我们能同时接入另一个普通的可见光USB摄像头,就可以在软件层面实现更灵活的融合。

应用场景:在复杂的背景中,纯热成像图可能难以分辨个体。将高分辨率的可见光图像(用于精确的人脸/人体识别)与低分辨率但包含温度信息的热成像图(用于测温)对齐融合,可以构建更强大的筛查系统。这涉及到图像配准(Registration)技术,可以利用特征点匹配或基于深度学习的办法。

此外,长时间运行的温度数据本身就是宝贵的数据源。你可以开发一个后台服务,持续运行筛查程序,并将温度数据(即使是估算值)与时间戳一起存入时序数据库(如InfluxDB)。结合环境温度传感器数据,可以分析环境温度对体表测温的影响,甚至通过机器学习模型对数据进行校正,逐步提升系统在特定场景下的可靠性。

5. 常见问题、避坑指南与进阶思考

5.1 开发过程中的典型问题与解决方案

问题1:帧率过低,画面卡顿。

  • 原因:OpenCV默认的cv2.waitKey(1)在循环中可能因图像处理(如人脸检测)耗时过长,导致实际帧率远低于摄像头能力。此外,USB 2.0的带宽也可能限制高分辨率下的帧率。
  • 解决
    1. 优化处理流程:不是每一帧都需要进行耗时的人脸检测。可以每N帧(例如每5帧)做一次检测,中间帧沿用上一帧的检测结果进行跟踪。
    2. 降低处理分辨率:对人脸检测,可以先将图像缩小到原来的一半进行处理,检测到目标后再映射回原图坐标。
    3. 使用更高效的检测器:Haar Cascade速度尚可,但精度一般。可以考虑使用OpenCV的DNN模块加载轻量化的深度学习模型(如MobileNet-SSD),在GPU上加速。
    4. 检查USB连接:确保使用高质量的USB线,并直接连接到电脑的USB端口,避免使用扩展坞。

问题2:温度测量不准,波动大。

  • 原因:这是非接触式测温,尤其是基于图像分析的测温的固有挑战。影响因素包括:测量距离变化、环境温度/辐射变化、额头有汗水或头发遮挡、相机自身热漂移。
  • 解决
    1. 固定化部署:将相机固定在三角架上,确保测量距离和角度恒定。
    2. 环境屏蔽:尽量避免镜头直对空调出风口、窗户等温度剧烈变化的环境。可以在相机周围加一个简单的遮光罩,减少环境辐射干扰。
    3. 参考黑体校准:在场景中放置一个已知温度的参考黑体(或一个恒温的金属块),在每一帧图像中都读取该参考物的温度,用来动态校正整个画面的温度读数。这是工业级应用的标准做法。
    4. 多点测量与滤波:在额头ROI内取多个点测量,去掉最高和最低值后取平均。对连续帧的温度值进行移动平均滤波,平滑瞬时波动。

问题3:无法获取原始温度数据流。

  • 原因:UVC协议传输的是处理后的视频帧,原始传感器数据可能被封装在非标准的格式或通过其他接口(如虚拟串口)传输,而官方并未公开协议。
  • 解决
    1. 深入分析视频帧:尝试用cam.get(cv2.CAP_PROP_FORMAT)查看原始格式,并用cv2.cvtColor尝试各种转换(YUV2BGR, YUV2RGB等),再分析不同通道的数据。有时温度信息可能编码在YUV数据的某个通道里。
    2. 尝试其他访问方式:在Linux下,可以尝试使用v4l2-ctl工具直接与摄像头交互,列出所有控制项和格式,看看是否有隐藏的数据流。
    v4l2-ctl –list-formats-ext -d /dev/video0 v4l2-ctl –list-ctrls -d /dev/video0
    1. 联系厂商或社区:查看Adafruit的GitHub仓库或相关论坛,是否有其他开发者成功破解了数据协议。开源社区的力量是巨大的。

5.2 关于精度与合规性的重要思考

在项目开发尾声,必须再次强调一个关键点:基于UTi165K和计算机视觉方法构建的系统,其测温精度无法达到医疗诊断级别。我们实现的是一种辅助筛查工具

  • 法规意识:如果你开发系统用于公共场所的正式筛查,需要了解当地医疗器械或安防产品的相关法规。通常,作为初筛设备,需要明确提示“本设备测量结果仅供参考,异常者需用医用体温计复核”。
  • 误差管理:在系统设计上,应将报警阈值设置得比临床标准(如37.3°C)略低一些(如37.0°C),以提高筛查灵敏度,宁可误报,不可漏报。同时,系统日志必须详尽,以备核查。
  • 人机工程:最好的技术方案也需要合理的使用方式。应设计引导标识,让人在指定位置短暂停留(如1-2秒),正面朝向相机,露出额头,这样才能获得相对稳定的测量条件。

5.3 项目扩展与优化方向

当你完成了基础功能后,可以考虑以下方向深化项目:

  1. 多摄像头网络:使用多个UTi165K覆盖更宽的通道,利用Python的多进程或多线程同时处理多个视频流,并将数据汇总到一个中央服务器进行统一显示和报警。
  2. 集成身份识别:在可见光通道(或融合图像)上集成人脸识别模块,将体温数据与人员身份绑定,实现打卡+测温一体化,并生成个人的体温历史曲线。
  3. 环境温度补偿:接入一个高精度的环境温湿度传感器(如DHT22),实时读取环境数据。建立一个简单的补偿模型,例如:校正体温 = 测量体温 + k * (环境温度 - 参考环境温度),其中k是一个通过实验确定的系数。
  4. 开发图形化配置界面:使用PyQt5或Tkinter为你的筛查系统开发一个配置界面,让非技术人员可以方便地设置报警阈值、ROI区域、颜色主题、数据保存路径等。
  5. 云端数据看板:将温度数据、报警事件通过HTTP API发送到云端服务器(如使用Flask搭建一个简易后端),然后利用Grafana等工具制作实时数据看板,方便管理人员远程监控多个点的筛查情况。

这个项目从一个简单的USB热成像相机出发,融合了硬件交互、计算机视觉、数据分析和系统设计等多个领域。它完美地展示了如何用低成本的开源工具,去解决一个真实的工程问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/19 8:03:23

电容触摸传感与微控制器互动:打造万圣节智能蝙蝠装饰

1. 项目概述:当电容触摸遇上万圣节蝙蝠又到了一年一度可以名正言顺“吓唬人”的季节。每年万圣节,除了南瓜灯和糖果,我总想搞点不一样的、能和人互动的装饰。市面上的那些一动就吱呀乱叫的塑料道具,总觉得少了点灵魂和“技术含量”…

作者头像 李华
网站建设 2026/5/19 7:57:47

技术深潜:Play Integrity API如何重塑Android应用安全边界?

技术深潜:Play Integrity API如何重塑Android应用安全边界? 【免费下载链接】play-integrity-checker-app Get info about your Device Integrity through the Play Intergrity API 项目地址: https://gitcode.com/gh_mirrors/pl/play-integrity-check…

作者头像 李华
网站建设 2026/5/19 7:55:22

AI编程的优缺点

在当今的软件开发领域,AI 程序编写(如使用 GitHub Copilot、Cursor 以及各大生成式大模型辅助编码)已经从一种“尝鲜工具”演变成了开发者的日常标配。利用 AI 编写程序就像拥有一位永不疲倦、博闻强识但偶尔会犯糊涂的“实习生”。以下是关于…

作者头像 李华
网站建设 2026/5/19 7:53:01

监控页面明明越来越多,为什么值班时还是看不清问题?

很多团队把监控系统搭起来以后,都会经历一个很典型的落差。 平时看,采集对象越来越全,图表越来越多,主机、数据库、中间件、网络也都接进来了;可一到值班现场,业务一说“接口变慢了”,排障同学打…

作者头像 李华
网站建设 2026/5/19 7:51:01

优先队列和单调队列的浅浅学习

事实上我在一开始学它们的时候,觉得是两种不同的队列,但实际上单调队列是一种算法,用双端队列来实现,不过我们先看一段有点意思的代码:import java.io.*; import java.util.*; public class Main{public static int ge…

作者头像 李华
网站建设 2026/5/19 7:46:50

对比自行维护与使用Taotoken聚合API在稳定性上的体感差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比自行维护与使用Taotoken聚合API在稳定性上的体感差异 在接入和使用大模型API进行开发的过程中,服务的稳定性是保障…

作者头像 李华