- 2024-10-16
-
回复了主题帖:
【2024 DigiKey创意大赛】养老院智能看护系统
慕容雪花 发表于 2024-10-8 16:01
非常棒!预祝大奖!
- 2024-10-08
-
加入了学习《养老院智能看护系统》,观看 养老院智能看护系统
-
发表了主题帖:
【2024 DigiKey创意大赛】养老院智能看护系统
养老院智能看护系统
作者:Wonbear
一、作品简介
作品照片:
功能介绍:实时监测老年人行为和健康数据,具备人脸识别和手势识别功能,可提升监控和交互智能化水平。能及时发现危险行为并报警,为护理人员提供全面护理服务。
物料清单及简介:采用树莓派 Raspberry Pi 5 控制中心,处理数据和执行功能。ESP32-C6-DEVKITC-1-N8 将数据通过UDP/IP协议发送到主机并显示健康数据和系统状态。还有 3660 传感器测量环境数据。通过这些物料的协同工作,为老年人打造安全舒适的生活环境。
二、系统框图
系统主要由以下几个关键部分组成:
1、硬件设备
ESP32:作为传感器的微控制器,负责从温湿度传感器获取温湿度信息。它具有高效的数据处理能力和稳定的通信功能,能够准确地采集环境数据。通过 UDP 协议,ESP32 将温湿度信息快速发送至主机显示器,为护理人员提供实时的环境监测数据,以便及时调整养老院内的环境条件,确保老年人处于舒适的生活环境中。
树莓派5:在系统中担任视觉识别的重要角色。树莓派 5 凭借其强大的计算能力和丰富的接口,可以高效地捕捉图像和视频信息。通过 UDP 协议,树莓派将捕捉到的视觉信息发送至主机电脑,在主机显示器上进行实时监控。这使得护理人员能够随时观察老年人的行为和状态,及时发现异常情况,从而采取相应的措施,保障老年人的安全。
温湿度传感器:用于测量养老院内的温度和湿度。该传感器具有高精度和高稳定性,能够准确地反映环境的温湿度变化。它将采集到的温湿度信息传输给 ESP32,为系统提供关键的环境数据。
主机电脑及显示器:作为系统的核心控制和显示设备,主机电脑接收来自树莓派和 ESP32 的信息。通过安装专门的监控软件,主机电脑可以在显示器上实时显示视觉信息和温湿度数据,方便护理人员进行全面的监控和分析。同时,主机电脑还可以对接收的数据进行存储和处理,以便后续的查询和统计分析。
2、通信协议
系统采用 UDP 协议进行数据传输。UDP 协议具有传输速度快、实时性高的特点,能够满足系统对实时数据传输的要求。无论是树莓派发送的视觉信息,还是 ESP32 发送的温湿度信息,都能够通过 UDP 协议快速、准确地传输到主机电脑,确保护理人员能够及时获取最新的监控数据。
三、各部分功能说明
1、人脸识别部分
人脸识别如下图所示对人脸部分进行捕捉,然后对比人脸特征并分析可信度,如下图所示:
利用树莓派的强大计算能力,对捕捉到的图像进行人脸识别。可以识别老年人的身份,确保仅授权人员进入特定区域,并可记录老年人的活动情况,为养老院的安全管理提供有力保障。
其程序运行流程如下图所示:
由主机进行人脸的采集并向树莓派发送训练好的数据,从而减少了对控制核心的调试成本,树莓派对捕捉到的人脸和接收到的人脸特征数据进行比对从而判断出入人员信息,信息采用离线储存和处理的方式,大大提高了系统信息的安全性。
人脸识别部分关键代码如下所示:
# 从摄像头读取图像
ret, frame = cap.read()
if not ret:
break
frame = cv2.flip(frame, 1) # 水平翻转
# cv2.imshow('frame0', frame)
# 提高亮度
frame = img_exposure(frame, 20, 0)
# 检测脸部
face, rect = face_detect(frame)
if face is None:
cv2.putText(frame, "No face detected", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA)
else:
x, y, w, h = rect
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 255), 2, cv2.LINE_AA)
time_now = int(time.time()*10)
if time_now % 5 == 0:
if save_flag:
cv2.imwrite(os.path.join(faces_dir, Name, f"{frame_count}.jpg"), face)
frame_count += 1
save_flag = False
else:
save_flag = True
cv2.imshow('frame', frame)
if frame_count > MAX_COUNT:
break
for facename in os.listdir(faces_dir):
train_names.append(facename)
train_label = train_names.index(facename)
for img_name in os.listdir(os.path.join(faces_dir, facename)):
img_path = os.path.join(faces_dir, facename, img_name)
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
train_faces.append(gray)
train_labels.append(train_label)
with open('train_datas.json', 'w') as f:
json.dump(train_names, f)
train_labels = np.array(train_labels)
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.train(train_faces, train_labels)
recognizer.write("train_res.yml")
这段代码实现了一个从摄像头读取图像、检测人脸、保存人脸图像并进行人脸识别训练的功能。
从摄像头读取图像,如果读取失败则退出循环。
对图像进行水平翻转,并提高亮度。
检测人脸,如果未检测到人脸,则在图像上显示 “No face detected”。如果检测到人脸,则绘制一个矩形框标记人脸位置。同时,每隔 5 个时间单位(这里是 time_now % 5 == 0),如果 save_flag 为真,则保存人脸图像,并更新相关变量。其他时间则将 save_flag 设为真,等待下一次保存时机。
显示处理后的图像。如果保存的图像数量超过 MAX_COUNT,则退出循环。
循环结束后,进行人脸识别的训练部分:
遍历保存人脸图像的文件夹,将每个人脸对应的名字添加到 train_names 列表中,并确定每个人脸的标签(即对应名字在列表中的索引)。
对于每个名字下的每张图像,读取图像并转换为灰度图,将灰度图添加到 train_faces 列表中,对应的标签添加到 train_labels 列表中。
将 train_names 列表保存到一个 JSON 文件中。
将 train_faces 转换为 numpy 数组(虽然代码中有这一步注释掉了,但实际应用中可能需要根据情况决定是否转换),将 train_labels 转换为 numpy 数组。
创建一个 cv2.face.LBPHFaceRecognizer 对象,使用 train_faces 和 train_labels 进行训练。
将训练结果保存到一个 YML 文件中。
2、手势识别部分
手势识别如下图所示:
同样由树莓派实现的手势识别功能,为老年人带来了极大的便利和安全保障。手势识别为老年人提供了一种简便的非接触式交互方式,使得他们无需费力地进行传统的按键操作或触摸屏幕等动作,极大地提升了使用的便利性。对于老年人来说,随着年龄的增长,身体的灵活性可能会逐渐下降,尤其是手指的活动能力可能会受到一定的限制。而手势识别功能的出现,恰好解决了这一问题。通过简单的手势动作,老年人可以轻松地完成各种操作,如发出求助信号、开关灯、调节设备参数等。这不仅减轻了老年人的操作负担,还提高了他们的生活质量。此外,非接触式的交互方式也更加安全卫生。在养老院等环境中,老年人的健康和安全是至关重要的。传统的接触式操作方式可能会增加细菌和病毒的传播风险,而手势识别则可以有效地避免这一问题。老年人无需直接接触设备,就可以完成各种操作,减少了交叉感染的可能性,为他们的健康提供了更好的保障。
树莓派实现的手势识别功能,以其简便的非接触式交互方式,极大地提升了老年人的使用便利性和安全性。同时,这一功能也符合老年人的身体特点和生活需求,为他们的晚年生活带来了更多的舒适和便捷。
手势识别关键代码如下所示:
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
mp_drawing.draw_landmarks(
frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)
handLms = hand_landmarks.landmark
fingers_pos = []
if handLms[4].x > handLms[20].x:
hand_dir = 'Right'
else:
hand_dir = 'Left'
if hand_dir == 'Right':
if handLms[fingers_top[0]].x > handLms[fingers_top[0]-1].x:
fingers_pos.append(1)
else:
fingers_pos.append(0)
else:
if handLms[fingers_top[0]].x < handLms[fingers_top[0]-1].x:
fingers_pos.append(1)
else:
fingers_pos.append(0)
for finger in range(1, 5):
if handLms[fingers_top[finger]].y < handLms[fingers_top[finger]-2].y:
fingers_pos.append(1)
else:
fingers_pos.append(0)
# 上一次的手势
oldFingers = pos
# 计算当前的手势
pos = fingers_pos.copy()
if pos == [0, 0, 0, 0, 0]:
cv2.putText(frame, 'Waiting...', (10, 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
total_time = 0 # 手指计数为0时,重置时间
else:
cv2.putText(frame, 'posture: %s' %(str(pos)) , (10, 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
total_time += time.time() - time1 # 计算总时间
time1 = time.time()
if oldFingers == pos: # 如果手势没有变化
pass
else:
total_time = 0
if 1 < total_time < 1.5:
total_time = 1.5
pos_dofunction(pos, hand_dir, name, 100-unconfidence)
这段代码主要是用于检测和处理手部手势。首先,检查是否检测到多只手的关键点(multi_hand_landmarks)。如果有,遍历每只手的关键点。使用mp_drawing.draw_landmarks函数在帧上绘制手部关键点和连接。确定手的方向是左手还是右手,根据不同方向判断手指的位置状态,并将其存储在fingers_pos列表中。接着,记录上一次的手势oldFingers,并复制当前手势到pos。如果当前手势表示所有手指都弯曲(pos == [0, 0, 0, 0, 0]),在帧上显示 “Waiting...”,并重置总时间total_time为 0。如果有手指伸展,显示当前手势状态,并累加时间差来计算总时间。如果手势发生变化,也重置总时间。当总时间在特定范围内(1 < total_time < 1.5),调用pos_dofunction函数处理手势,传入当前手势、手的方向、名字以及识别可信度,然后pos_dofunction函数根据不同的手势执行对应的功能。这段代码实现了对手部手势的实时检测和特定时间内手势稳定时的处理逻辑,可用于基于手势的交互系统中。
3、异常情况捕获部分
异常捕获如下两张图所示,分别是处于运动和静止状态的图像情况,根据两种不同状态的差帧异或图的像素值巨大差异可以判断老人是否长时间处于静止状态,此方法判断准确率高达99%。
通过图像处理技术,树莓派能够识别老年人的异常行为,如长时间不动、出门未归等。一旦检测到异常情况,系统会通过声音或图像提示护理人员,及时采取应对措施。
其部分代码如下所示:
now_time = int(time.time())
if now_time % 20 == 0:
if run_count==0:
run_count += 1
frame2 = frame1
frame1 = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
if frame2 is not None:
diff = cv2.absdiff(frame1, frame2)
#cv2.imshow('diff', diff)
_, thresh = cv2.threshold(diff, 15, 255, cv2.THRESH_BINARY)
count = cv2.countNonZero(thresh)
#print(count)
if count > 13000:
pass
else:
data = {
"N": "raspi",
"name": name,
"warning" : True
}
msg = json.dumps(data)
udp_socket.sendto(msg.encode("utf-8"), server_addr)
print("jinzhi")
else:
run_count = 0
这段代码采用了差帧异或的方法对人物运动进行精确判断。首先,获取当前时间,如果当前时间对 20 取余为 0,说明满足特定的时间间隔条件。如果这是第一次进入此条件判断,将当前帧赋值给frame1,并记录运行次数。然后,在后续的判断中,当有前一帧图像frame2存在时,计算当前帧frame1与前一帧frame2的绝对差值diff,接着对差值图像进行二值化处理,得到阈值图像thresh。通过计算阈值图像中非零像素的数量count,来判断人物是否有明显的运动。如果非零像素数量小于 13000,则认为人物运动不明显或没有运动,此时将包含设备标识、名称和警告标志的字典数据转换为 JSON 格式,并通过 UDP 套接字发送到指定的服务器地址。如果不满足时间间隔条件,则将运行次数重置为 0,等待下一次满足条件的时间点进行判断。
这种方法可以有效地检测人物的运动状态,及时发现异常情况并发出警告,为养老院的智能看护提供了一种可靠的技术手段。同时,通过设定合适的阈值和时间间隔,可以根据实际应用场景进行调整和优化,以提高检测的准确性和效率。
4、温湿度数据采集部分
ESP32采用MicroPython进行编程,通过IIC协议和UDP协议,一种有线传输和一种无线传输协议,极大的利用了ESP32的优势。
ESP32 从温湿度传感器获取数据,实时监测养老院内的环境温湿度。确保室内温度、湿度处于适宜范围,为老年人提供一个舒适和安全的生活环境。
5、主机数据显示部分
主机初始化显示界面如下所示:顶端为本机IP地址和开放的端口号,左侧为温湿度记录曲线,右侧为树莓派捕获到的异常信息。
当UDP主机接收到来之ESP32和树莓派的数据后显示结果如下图所示:
主机电脑接收并显示来自树莓派和 ESP32 的数据,包括视觉信息、温湿度数据以及系统状态等。方便护理人员随时查看,及时了解老年人的健康状况和环境情况。
其数据接收关键部分代码如下所示:
def rec_udp_data(self):
while True:
msg = self.sock.recvfrom(1024)[0]
if msg:
data = json.loads(msg.decode('utf-8'))
if data["N"] == "esp":
self.ui.label_5.setText(">> ESP数据接收")
self.esp_data.append({
"time": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"temperature": data["T"],
"humidity": data["H"]
})
if data["N"] == "raspi":
show_record = ""
self.ui.label_5.setText(">> Raspi数据接收")
if data["warning"] == False:
self.raspi_data.append({
"time": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"name": data["name"],
"state": state[data["state"]]
})
else:
self.raspi_data.append({
"time": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"name": data["name"],
"state": "长时间静止"
})
for i in self.raspi_data:
show_record = show_record + f'{i["name"]} {i["time"] } {i["state"]} \n'
self.signal_emitter.signal1.emit(show_record)
self.update_draw()
else:
self.ui.label_5.setText(">> 未接收到数据")
这个函数名为rec_udp_data,它的主要功能是持续监听 UDP 端口接收数据,并根据数据的来源进行不同的处理和记录,同时更新界面显示和触发信号用于其他部分的交互。
while True:开启一个无限循环,持续监听 UDP 数据。
msg = self.sock.recvfrom(1024)[0]:从 UDP 套接字接收数据,最多接收 1024 字节的数据,并取返回的第一个元素(接收到的数据内容)。
if msg:如果接收到了数据:
data = json.loads(msg.decode('utf-8')):将接收到的字节数据解码为 UTF-8 编码的字符串,然后解析为 JSON 对象。
根据data["N"]的值判断数据来源:
如果是 “esp”:
self.ui.label_5.setText(">> ESP数据接收"):在界面上显示 “ESP 数据接收” 的提示信息。
将接收到的温度和湿度数据以及当前时间添加到self.esp_data列表中,格式为字典,包含 “time”(时间)、“temperature”(温度)和 “humidity”(湿度)字段。
如果是 “raspi”:
self.ui.label_5.setText(">> Raspi数据接收"):在界面上显示 “Raspi 数据接收” 的提示信息。
根据data["warning"]的值判断是否有警告:
如果没有警告,将接收到的数据(包含时间、名称和状态)添加到self.raspi_data列表中,状态从state字典中获取对应的值。
如果有警告,将接收到的数据(包含时间、名称和 “长时间静止” 状态)添加到self.raspi_data列表中。
遍历self.raspi_data列表,构建一个字符串show_record,格式为 “名称 时间 状态 \n”,并通过信号self.signal_emitter.signal1.emit(show_record)触发其他部分进行相应的处理。
如果没有接收到数据,将界面上的提示信息设置为 “未接收到数据”。
self.update_draw():调用一个未展示的函数,可能用于更新图形显示或其他与数据接收相关的界面更新操作。
这个函数在处理 UDP 数据接收、记录不同来源的数据以及更新界面和触发信号方面起到了关键作用,为养老院智能看护系统提供了实时数据处理和交互的功能。
def update_draw(self):
Tx = []
Ty = []
Hx = []
Hy = []
for i in self.esp_data:
Ty.append(i["temperature"])
Tx.append(len(Ty)*2)
Hy.append(i["humidity"])
Hx.append(len(Hy)*2)
self.draw_temp.draw2d(Tx, Ty, 'r', 'temperature')
self.draw_humi.draw2d(Hx, Hy, 'g', 'humidity')
这个函数update_draw用于更新温度和湿度的图形绘制。
首先定义了四个空列表Tx、Ty、Hx、Hy,分别用于存储温度和湿度的横坐标和纵坐标数据。
遍历self.esp_data列表(可能存储了从 ESP 设备接收到的数据):
对于每个数据项,将温度值添加到Ty列表中,然后根据温度数据的数量计算一个对应的横坐标值并添加到Tx列表中,这里横坐标是通过len(Ty)*2计算得到,可能是一种简单的线性映射方式。
同样,将湿度值添加到Hy列表中,并计算对应的横坐标值添加到Hx列表中。
调用self.draw_temp.draw2d(Tx, Ty, 'r', 'temperature')和self.draw_humi.draw2d(Hx, Hy, 'g', 'humidity')这两个方法来进行温度和湿度的二维图形绘制。其中,draw2d方法可能来自其他自定义的绘图模块,传入的参数分别是横坐标列表、纵坐标列表、颜色参数('r' 表示红色可能用于温度,'g' 表示绿色可能用于湿度)以及对应的标签('temperature' 和 'humidity')。
这个函数通过处理接收到的数据并调用绘图方法,实现了温度和湿度数据的动态图形更新,为用户提供了直观的数据可视化方式。
四、作品源码
养老院智能看护系统-嵌入式开发相关资料下载-EEWORLD下载中心
https://download.eeworld.com.cn/detail/Wonbear/634539
五、作品功能演示视频
六、项目总结
养老院智能看护系统是一个致力于提升老年人护理效率与质量,保障老年人安全与健康的创新项目。
在系统组成方面,该项目整合了多种先进的硬件设备。树莓派 5 作为核心控制单元,凭借强大的处理能力,不仅负责处理来自传感器和摄像头的数据,还执行监测和报警功能。同时,它实现了人脸识别和手势识别功能,极大地增强了系统的监控和交互能力。ESP32 则作为传感器的微控制器,从温湿度传感器获取准确的温湿度信息,并通过 UDP 协议将数据快速发送至主机显示器。温湿度传感器确保了对养老院内环境的精准监测,为老年人提供舒适的生活环境。主机电脑作为系统的核心控制和显示设备,接收来自树莓派和 ESP32 的信息,通过专门的监控软件在显示器上实时呈现视觉信息和温湿度数据,方便护理人员全面监控和分析。
系统功能丰富多样。健康监测方面,通过环境监测,利用 温湿度传感器实时监测养老院内的环境数据,确保室内温度、湿度适宜。异常活动检测功能借助图像处理技术,识别老年人的异常行为,为及时采取措施提供保障。人脸识别与手势识别功能进一步提升了系统的智能化水平和交互体验。人脸识别用于老年人身份确认,防止未经授权人员进入关键区域,同时可用于老年人出勤记录和活动跟踪。手势识别为老年人提供了简便的非接触式交互方式,如求助、确认等,提升了使用便利性和安全性。数据处理与上传功能确保了数据的存储、初步处理和分析,以及通过网络上传至主机,便于远程访问和进一步分析。实时显示与报警功能让护理人员能够随时查看当前环境数据和老年人健康指标,并在检测到异常情况时及时收到声音或图像提示。
优化目标明确,增加温湿度传感器的数量,能够根据各个方位的温湿度数据准确判断房间各个部分的潮湿情况,及时发现是否需要更换物品或采取相应措施,为老年人创造更加宜居的生活环境。
该项目具有诸多优势。高集成性将多种传感器和硬件集成在一起,提供全面的监测和护理功能。实时性确保实时数据采集、处理和显示,及时反馈老年人健康状况。智能化的人脸识别和手势识别功能提高了系统的智能化水平和交互体验。良好的扩展性为未来根据需求增加更多传感器和功能模块奠定了基础。
在应用前景方面,养老院智能看护系统不仅适用于养老院,还可以推广应用于家庭护理、医院病房等场景,帮助提升护理质量,减轻护理人员负担,提高老年人的生活质量。未来,结合人工智能技术,系统有望进一步提升自动化水平和智能化程度,提供更加精准和个性化的护理服务。
七、其他
预期优化目标:
通过在不同方位布置多个温湿度传感器,可以全方位、多角度地采集房间各个部分的温湿度数据。这样一来,就能够更加准确地判断出房间各个区域的潮湿情况。每个传感器都如同一位敏锐的观察者,时刻监测着周围环境的细微变化,将数据精准地传递给系统。
当拥有了丰富的温湿度数据后,护理人员可以对房间的整体环境状况有更清晰的认识。他们能够根据这些数据,及时发现房间中哪些部分可能存在过度潮湿的问题,从而准确判断是否需要更换某些物品或采取相应的防潮措施。比如,如果某个区域的湿度持续偏高,可能意味着该区域的通风不良或者存在漏水等问题。此时,护理人员可以迅速采取行动,调整通风设备、检查管道等,以确保老年人生活在一个干燥、舒适的环境中。
增加温湿度传感器的数量,不仅有助于提高对房间潮湿情况的判断准确性,还能为老年人的健康和安全提供更可靠的保障。潮湿的环境容易滋生细菌和霉菌,对老年人的呼吸系统和身体健康造成潜在威胁。通过及时发现并解决潮湿问题,可以有效降低老年人患病的风险,为他们创造一个更加宜居的生活环境。
八、作品文档
- 2024-10-06
-
上传了资料:
养老院智能看护系统
- 2024-09-25
-
发表了主题帖:
【2024 DigiKey 创意大赛】树莓派开箱
开箱从外到内:
1、快递包装:从外到内都是”安全感”满满。
2、板子器件(树莓派):从树莓派Pico到树莓派4B,现在终于体验到了树莓派5,之前的4B跑程序的性能还是低了点,
期待树莓派5的性能。(4G的RAM)
3、板子器件(ESP32-C6-N8):喜欢这个抽屉式设计的外壳,双Type-C设计。
- 2024-09-20
-
回复了主题帖:
下载MPS AI电源资料包,赢【Keep体脂秤、按摩眼罩、电脑支架】
本帖最后由 Wonbear 于 2024-9-20 11:39 编辑
已参加下载
-
回复了主题帖:
下载MPS AI电源资料包,赢【Keep体脂秤、按摩眼罩、电脑支架】
已经参加
- 2024-06-30
-
回复了主题帖:
免费申请 | 最新一代树莓派(Raspberry Pi 5)!
参加活动怎么知道自己入围没有啊,什么时候出结果,大家都有结果了吗