嵌入式
返回首页

养老院智能看护系统设计与实现详解

2026-04-10 来源:EEWorld 论坛

养老院智能看护系统

作者: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) # 水平翻转
# 提高亮度
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")

这段代码实现了一个从摄像头读取图像、检测人脸、保存人脸图像并进行人脸识别训练的功能。

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)

这段代码主要是用于检测和处理手部手势。首先,检查是否检测到多只手的关键点。如果有,遍历每只手的关键点。使用 mp_drawing.draw_landmarks 函数在帧上绘制手部关键点和连接。确定手的方向是左手还是右手,根据不同方向判断手指的位置状态,并将其存储在 fingers_pos 列表中。接着,记录上一次的手势 oldFingers,并复制当前手势到 pos。如果当前手势表示所有手指都弯曲,在帧上显示 "Waiting...",并重置总时间 total_time 为 0。如果有手指伸展,显示当前手势状态,并累加时间差来计算总时间。如果手势发生变化,也重置总时间。当总时间在特定范围内,调用 pos_dofunction 函数处理手势,传入当前手势、手的方向、名字以及识别可信度,然后 pos_dofunction 函数根据不同的手势执行对应的功能。这段代码实现了对手部手势的实时检测和特定时间内手势稳定时的处理逻辑,可用于基于手势的交互系统中。

3、异常情况捕获部分

通过图像处理技术,树莓派能够识别老年人的异常行为,如长时间不动、出门未归等。一旦检测到异常情况,系统会通过声音或图像提示护理人员,及时采取应对措施。

其部分代码如下所示:

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)
            _, thresh = cv2.threshold(diff, 15, 255, cv2.THRESH_BINARY)
            count = cv2.countNonZero(thresh)
            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、主机数据显示部分

主机电脑接收并显示来自树莓派和 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 端口接收数据,并根据数据的来源进行不同的处理和记录,同时更新界面显示和触发信号用于其他部分的交互。

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 列表,对于每个数据项,将温度值添加到 Ty 列表中,然后根据温度数据的数量计算一个对应的横坐标值并添加到 Tx 列表中;同样处理湿度数据。调用 self.draw_temp.draw2d 和 self.draw_humi.draw2d 这两个方法来进行温度和湿度的二维图形绘制。这个函数通过处理接收到的数据并调用绘图方法,实现了温度和湿度数据的动态图形更新,为用户提供了直观的数据可视化方式。

四、作品源码

作品源码和相关资料可通过原帖子提供的链接下载。

五、作品功能演示视频

该项目提供了功能演示视频,展示了系统的实际运行情况。

六、项目总结

养老院智能看护系统是一个致力于提升老年人护理效率与质量,保障老年人安全与健康的创新项目。在系统组成方面,该项目整合了多种先进的硬件设备。树莓派 5 作为核心控制单元,凭借强大的处理能力,不仅负责处理来自传感器和摄像头的数据,还执行监测和报警功能。同时,它实现了人脸识别和手势识别功能,极大地增强了系统的监控和交互能力。ESP32 则作为传感器的微控制器,从温湿度传感器获取准确的温湿度信息,并通过 UDP 协议将数据快速发送至主机显示器。温湿度传感器确保了对养老院内环境的精准监测,为老年人提供舒适的生活环境。主机电脑作为系统的核心控制和显示设备,接收来自树莓派和 ESP32 的信息,通过专门的监控软件在显示器上实时呈现视觉信息和温湿度数据,方便护理人员全面监控和分析。

系统功能丰富多样。健康监测方面,通过环境监测,利用温湿度传感器实时监测养老院内的环境数据,确保室内温度、湿度适宜。异常活动检测功能借助图像处理技术,识别老年人的异常行为,为及时采取措施提供保障。人脸识别与手势识别功能进一步提升了系统的智能化水平和交互体验。人脸识别用于老年人身份确认,防止未经授权人员进入关键区域,同时可用于老年人出勤记录和活动跟踪。手势识别为老年人提供了简便的非接触式交互方式,如求助、确认等,提升了使用便利性和安全性。数据处理与上传功能确保了数据的存储、初步处理和分析,以及通过网络上传至主机,便于远程访问和进一步分析。实时显示与报警功能让护理人员能够随时查看当前环境数据和老年人健康指标,并在检测到异常情况时及时收到声音或图像提示。

优化目标明确,增加温湿度传感器的数量,能够根据各个方位的温湿度数据准确判断房间各个部分的潮湿情况,及时发现是否需要更换物品或采取相应措施,为老年人创造更加宜居的生活环境。

该项目具有诸多优势。高集成性将多种传感器和硬件集成在一起,提供全面的监测和护理功能。实时性确保实时数据采集、处理和显示,及时反馈老年人健康状况。智能化的人脸识别和手势识别功能提高了系统的智能化水平和交互体验。良好的扩展性为未来根据需求增加更多传感器和功能模块奠定了基础。

在应用前景方面,养老院智能看护系统不仅适用于养老院,还可以推广应用于家庭护理、医院病房等场景,帮助提升护理质量,减轻护理人员负担,提高老年人的生活质量。未来,结合人工智能技术,系统有望进一步提升自动化水平和智能化程度,提供更加精准和个性化的护理服务。

七、其他

预期优化目标:通过在不同方位布置多个温湿度传感器,可以全方位、多角度地采集房间各个部分的温湿度数据。这样一来,就能够更加准确地判断出房间各个区域的潮湿情况。每个传感器都如同一位敏锐的观察者,时刻监测着周围环境的细微变化,将数据精准地传递给系统。当拥有了丰富的温湿度数据后,护理人员可以对房间的整体环境状况有更清晰的认识。他们能够根据这些数据,及时发现房间中哪些部分可能存在过度潮湿的问题,从而准确判断是否需要更换某些物品或采取相应的防潮措施。增加温湿度传感器的数量,不仅有助于提高对房间潮湿情况的判断准确性,还能为老年人的健康和安全提供更可靠的保障。潮湿的环境容易滋生细菌和霉菌,对老年人的呼吸系统和身体健康造成潜在威胁。通过及时发现并解决潮湿问题,可以有效降低老年人患病的风险,为他们创造一个更加宜居的生活环境。

八、作品文档

如需查看完整内容,包括图片、视频和详细文档,请访问原帖子:【2024 DigiKey创意大赛】养老院智能看护系统

原帖子内容来源:https://bbs.eeworld.com.cn/thread-1295469-1-1.html



进入嵌入式查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • FollowMe 第二季:3 - EK_RA6M5 开发板入门

  • FollowMe 第二季: 1 Adafruit Circuit Playground Express及任务讲解

  • Azure RTOS step by step workshop

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • 从0到1:树莓派与物联网教程(英文)

精选电路图
  • 双极性电源

  • LM350 3安培可调稳压器

  • 30V/10A可调式台式直流稳压电源

  • DIY USB 5V 太阳能电源包

  • 铃声发生器

  • 电容式传感器

    相关电子头条文章