# 将 Haar 级联算法应用于热图像中的人脸,然后在热视频序列中,最后使用 USB 视频类 (UVC) 热像仪。这些部分分别在以下位置实现:
# fever_detector_image.py:将 Haar级联人脸检测算法应用于输入热红外图像(faces_gray16_image.tiff)。
# fever_detector_video.py:Haar级联人脸检测算法应用于输入视频帧(gray16_sequence文件夹)。
# fever_detector_camera.py:将 Haar级联人脸检测应用于 UVC 热成像摄像机的视频输入流。
# faces_gray16_image.tiff是图3(右)所示的原始灰16热图像,该图像是从热像仪RGMVision热成像CAM 1中提取的。
# gray16_sequence文件夹包含示例视频序列。
# haarcascade_frontalface_alt2.xml 预先训练的人脸检测器,由OpenCV库(GitHub)的开发人员和维护人员提供。
# USAGE
# python fever_detector_image.py
# 导入必要的包
import cv2
import imutils
import numpy as np
# 发烧温度的阈值:确定检测到的人脸的温度是否高于正常范围,即超过99-100.5°F(约37-38°C)
# 发烧温度阈值:华氏温度,摄氏温度 Celsius or Fahrenheit
fever_temperature_threshold = 37.0
fever_temperature_threshold = 99.0
# 打开gray16热红外图像 cv2.IMREAD_ANYDEPTH允许以16位格式打开gray16图像
# gray16_image = cv2.imread("faces_gray16_image.tiff", cv2.IMREAD_ANYDEPTH)
gray16_image = cv2.imread("ym.jpg", cv2.IMREAD_ANYDEPTH)
gray16_image = imutils.resize(gray16_image,width=400)
cv2.imshow("origin", imutils.resize(cv2.imread("ym.jpg"),width=400))
# 转换gray16为gray8 以便处理及可视化
# 创建一个空的 160x120 图像,将 gray16 图像从 0-65553(16位)规范化为 0-255(8位),并确保最终图像是 8位图像
gray8_image = np.zeros((120,160), dtype=np.uint8)
gray8_image = cv2.normalize(gray16_image, gray8_image, 0, 255, cv2.NORM_MINMAX)
gray8_image = np.uint8(gray8_image)
# 使用最喜欢的OpenCV colormap* 为gray8热图像着色
gray8_image = cv2.applyColorMap(gray8_image, cv2.COLORMAP_INFERNO)
# 加载预训练的haar cascade面部检测器
haar_cascade_face = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')
# 使用haar cascade面部检测器检测输入的人脸
faces = haar_cascade_face.detectMultiScale(gray8_image, scaleFactor=1.1, minNeighbors=5, minSize=(10, 10), flags=cv2.CASCADE_SCALE_IMAGE)
# 遍历面部检测结果
for (x, y, w, h) in faces:
# 绘制面部边界框
cv2.rectangle(gray8_image, (x, y), (x + w, y + h), (255, 255, 255), 1)
# 展示结果
cv2.imshow("gray8-face-detected", gray8_image)
cv2.waitKey(0)
# 检测到热图像中的人脸,就可以测量每个像素的温度,以确定一个人是否具有正常值。
# 1. 测量感兴趣区域(ROI)的温度值,即检测到的人脸的特定区域。
# 2. 为ROI温度值设置一个阈值,以便在检测到发烧的人(或体温高于平时的人)时建立。
# loop over the bounding boxes to measure their temperature
for (x, y, w, h) in faces:
# 绘制面部边界框
cv2.rectangle(gray8_image, (x, y), (x + w, y + h), (255, 255, 255), 1)
# ISO标准规定,内眼睑是使用热面部图像确定体温的最佳位置。
# 出于这个原因,为了简化流程将定义一个ROI,在Haar级联人脸检测的中心点取一个圆形作为ROI。
# 定义测量温度的ROI圆,圆心:面部矩形框的中心,半径,面部矩形框宽的1/4
haar_cascade_circle_origin = x + w // 2, y + h // 2
# ROI⚪半径
radius = w // 4
# 由于OpenCV不允许在gray16位图像中绘制圆圈,并且需要gray16信息来测量温度,因此将gray16热图像的每个像素值分成2组8位(2字节)
# 获取gray16图像的8个最高有效位,因为无法直接在gray16图像中提取圆圈作为ROI
# 右移16 位,丢失 8个不太有效位,并通过将图像转换为灰色8来删除新的最高有效位(8个零)
gray16_high_byte = (np.right_shift(gray16_image, 8)).astype('uint8')
# 获取gray16图像的8个最低有效位,因为无法直接在gray16图像中提取圆圈作为ROI
# 对 16位进行左移,丢失8个最高有效位 (MSB Most Significant Bits),并通过将值除以 256 来转换新的8 MSB
gray16_low_byte = (np.left_shift(gray16_image, 8) / 256).astype('uint16')
# 对8个最有效高位获取mask
mask = np.zeros_like(gray16_high_byte)
cv2.circle(mask, haar_cascade_circle_origin, radius, (255, 255, 255), -1)
gray16_high_byte = np.bitwise_and(gray16_high_byte, mask)
# 对8个最有效低位获取mask
mask = np.zeros_like(gray16_low_byte)
cv2.circle(mask, haar_cascade_circle_origin, radius, (255, 255, 255), -1)
gray16_low_byte = np.bitwise_and(gray16_low_byte, mask)
# 创建/重构create/recompose gray16 ROI
gray16_roi = np.array(gray16_high_byte, dtype=np.uint16)
gray16_roi = gray16_roi * 256
gray16_roi = gray16_roi | gray16_low_byte
# 获取ROI中的最大点坐标,以获取ROI的最高温度作为面部的预估温度
# 通过获得较高的值来估计面温
higher_temperature = np.amax(gray16_roi)
# 计算温度
higher_temperature = (higher_temperature / 100) - 273.15
# higher_temperature = (higher_temperature / 100) * 9 / 5 - 459.67
# 在gray8图像中写入温度
if higher_temperature < fever_temperature_threshold:
# 白色字体代表正常温度
cv2.putText(gray8_image, "{0:.1f} Celsius".format(higher_temperature), (x - 10, y - 10), cv2.FONT_HERSHEY_PLAIN,
1, (255, 255, 255), 1)
else:
# 显示发热红色警报文本:红色字体+红色圆圈代表发烧的温度
cv2.putText(gray8_image, "{0:.1f} Celsius".format(higher_temperature), (x - 10, y - 10), cv2.FONT_HERSHEY_PLAIN,
1, (0, 0, 255), 2)
cv2.circle(gray8_image, haar_cascade_circle_origin, radius, (0, 0, 255), 2)
# 展示结果
cv2.imshow("gray8-face-detected", gray8_image)
cv2.waitKey(0)
程序媛一枚~
- 粉丝: 4w+
- 资源: 30
最新资源
- 信捷XC PLC与力士乐VFC-x610变频器通讯程序原创可直接用于生产的程序,程序带注释,并附送触摸屏程序,有接线方式和设置,通讯地址说明等 程序采用轮询,可靠稳定 器件:信捷XC3的PLC,博世
- CMIP6 变量详细表格
- KF2EDGK系列5.08接线端子,带3D封装
- 信捷XC PLC与3台力士乐VFC-x610变频器通讯通讯 原创可直接用于生产的程序,程序带注释,并附送触摸屏程序,有接线方式和设置,通讯地址说明等 程序采用轮询,可靠稳定 器件:信捷XC3的PLC
- org.xmind.ui.mindmap-3.6.1.jar
- 16台搅拌机定时控制程序16台搅拌机定时控制,使用三菱FX系列PLC,威伦通触摸屏,具备完善的控制功能
- 微网双层优化模型matlab 采用yalmip编写三个微网的分层优化模型,考虑电价的负荷响应,综合配电网运营商收益和用户购电成本,程序运行稳定
- rv1126交叉编译工具链gcc-arm-8.3-2019.02-x86-64-arm-linux-gnueabihf.tar.xz和安装步骤
- 1960-2023年世界各国国民总收入数据
- 风储深度调峰模型matlab 考虑风储的调峰模型,采用cplex作为求解器,实现不同主体出力优化控制,程序运行稳定,有参考资料,
- 计算机系统安全性与性能评估:IOMMU在Linux环境下的性能研究及其优化策略
- 电动汽车蒙特卡洛分析matlab 通过matlab程序编写电动汽车蒙特卡洛模型,得到汽车行驶里程的概率分布曲线和充电功率曲线,程序运行可靠,有参考资料
- 考虑交通流量的电动汽车充电站规划matlab 程序采用matlab编制,采用粒子群算法,结合交通网络流量,得到最终充电站规划方案,程序运行可靠
- rustdesk-1.3.6-x86-64.msi
- 电动汽车优化模型matlab 狼群算法
- 你还在为伺服驱动器 FPGA架构苦恼吗,本方案FPGA代码实现电流环 速度环 位置环 SVPWM 坐标变 测速 分频 滤波器等,程序方便移植不同的平台,具有很高的研究价值
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈