Настоящий бой | Используйте Python и OpenCV для создания интеллектуальной системы мониторинга падений пожилых людей (шаги + исходный код)

Неизвестный студент колледжа, известный как Кайгоу Цзян Ху
Автор оригинала: Джеки Ли
Электронная почта: [email protected]

 Время завершения:2023.2.4
Последнее редактирование: 2023.2.4

гид

В этой статье Python, OpenCV и MediaPipe будут использоваться для создания интеллектуальной системы мониторинга падений пожилых людей. Дабы не допустить тихого падения в будущем, о нем никто не позаботится.

Оглавление

вводная информация

Этапы реализации

[1] Импортируйте необходимые модули:

[2] Определите функцию для вычисления угла:

【3】Найти координаты:

【4】Как узнать, находится ли субъект (пожилой человек) в безопасности или упал?

【5】Как отличить кровать от пола?

[6] Выведем результат на экран:

[7] Добавить графический интерфейс:

Автору есть что сказать


вводная информация

    Система наблюдения за пожилыми людьми представляет собой интеллектуальную систему обнаружения, которая может определять, лежат ли пожилые люди на кровати или падают на землю. Это настоящая программа для решения проблем, которую можно использовать для наблюдения за пожилыми людьми дома, пока вы находитесь на работе или в отъезде, чтобы вы могли получать уведомления в случае возникновения каких-либо проблем.

Этапы реализации

[1] Импортируйте необходимые модули:

    Импорт Numpy, MediaPipe и opencv в python

import cv2
import mediapipe as mp
import numpy as np

[2] Определите функцию для вычисления угла:

    Поскольку мы предполагаем, идет ли человек или падает на землю, исходя из угла и координат, которые мы получаем с помощью OpenCV, нам нужно вычислить угол, самый простой способ — определить функцию и вызвать ее в программе.

def calculate_angle(a,b,c):
    a = np.array(a) # First
    b = np.array(b) # Mid
    c = np.array(c) # End
    
    radians = np.arctan2(c[1]-b[1], c[0]-b[0]) - np.arctan2(a[1]-b[1], a[0]-b[0])
    angle = np.abs(radians*180.0/np.pi)
    
    if angle >180.0:
        angle = 360-angle
        
    return angle 

【3】Найти координаты:

    Нам также нужно найти координаты, чтобы мы могли использовать их в условиях, а также использовать их с функцией calculate_angle.

            left_eye = [landmarks[mp_pose.PoseLandmark.LEFT_EYE.value].x,landmarks[mp_pose.PoseLandmark.LEFT_EYE.value].y]
            left_hip= [landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].x,landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].y]
            left_heel = [landmarks[mp_pose.PoseLandmark.LEFT_HEEL.value].x,landmarks[mp_pose.PoseLandmark.LEFT_HEEL.value].y]
            right_eye = [landmarks[mp_pose.PoseLandmark.RIGHT_EYE.value].x,landmarks[mp_pose.PoseLandmark.RIGHT_EYE.value].y]
            right_hip = [landmarks[mp_pose.PoseLandmark.RIGHT_HIP.value].x,landmarks[mp_pose.PoseLandmark.RIGHT_HIP.value].y]
            right_heel = [landmarks[mp_pose.PoseLandmark.RIGHT_HEEL.value].x,landmarks[mp_pose.PoseLandmark.RIGHT_HEEL.value].y]
            right_index = [landmarks[mp_pose.PoseLandmark.RIGHT_INDEX.value].x,landmarks[mp_pose.PoseLandmark.RIGHT_INDEX.value].y] 
            left_index = [landmarks[mp_pose.PoseLandmark.LEFT_INDEX.value].x,landmarks[mp_pose.PoseLandmark.LEFT_INDEX.value].y]
            # Calculate angle

【4】Как узнать, находится ли субъект (пожилой человек) в безопасности или упал?

    Мы найдем это с помощью координат, полученных из cv2 и mediapipe, и углов, используя функции, определенные выше.

    Поскольку мы получаем координаты глаз, бедер и лодыжек, мы знаем, что когда человек лежит горизонтально (падает), угол между его глазами, бедрами и лодыжками составляет от 170 до 180 градусов. Таким образом, мы можем просто поставить условие, при котором мы можем сказать, что человек упал, когда угол составляет 170-180 градусов.

                if angle1 != angle2 and (angle1>170 and angle2>170):
                    if (((right_index[0]<0.70 and right_index[0]>0.20) and (right_index[1]<0.56 and right_index[1]>0.15)) or ((left_index[0]<0.55 and left_index[0]>0.18) and (left_index[1]<0.56 and left_index[1]>0.15))):
                        stage="Hanging on !!"
                    else:
                        stage = "fallen :("    

                elif angle1 != angle2 and (angle1<140 or angle2<140) :
                    stage = "Trying to Walk"
                elif angle1!=angle2 and ((angle1<168 and angle1>140) and (angle2<168 and angle2>140)):
                    stage="Barely Walking"
                else:
                    pass

 Теперь у вас может возникнуть вопрос, как определить, действительно ли человек упал или просто лежал на кровати, поскольку в обоих случаях углы находятся в одном диапазоне.

Мы ответим и на него, так что читайте дальше :)

【5】Как отличить кровать от пола?

    Мы снова воспользуемся координатами, полученными из OpenCV, а затем с его помощью найдем координаты кровати, а затем введем новое условие при проверке условия падения, что при совпадении координат субъекта с координатами кровати, это означает, что человек на кровати Естественно безопасно. Это условие исключит падение, и программа покажет безопасность. Условие падения и другие условия ходьбы и попытки ходьбы проверяются, только если это условие становится ложным.

            if ((left_eye[0]>=0.41 and left_eye[0]<=0.43) and (left_hip[0]>=0.44 and left_hip[0]<=0.46) and (left_heel[0]>=0.41 and left_heel[0]<=0.43) or (right_eye[0]>=0.41 and right_eye[0]<=0.43) and (right_hip[0]<=0.43 and right_hip[0]>=0.41) and (right_heel[0]>=0.37 and right_heel[0]<=0.39)):

                if ((left_eye[1]>=0.24 and left_eye[1]<=0.33) and (left_hip[1]<=0.35 and left_hip[1]>=0.45) and (left_heel[1]<=0.74 and left_heel[1]>=0.72) or (right_eye[1]<=0.30 and right_eye[1]>=0.24) and (right_hip[1]<=0.50 and right_hip[1]>=0.32) and (right_heel[1]>=0.71 and right_heel[0]<=0.73)):
                    stage = "safe :)"
            # Curl counter logic

Следовательно, вводя одно условие с координатами ложа, мы также решаем поставленную выше задачу.

[6] Выведем результат на экран:

    Теперь распечатайте результаты падения, безопасности и т. д. Мы можем легко использовать функцию putText в cv2 для отображения текста, сохраненного на этапе переменных.

    Пример использования функции выглядит следующим образом:

cv2.putText(image, ‘Condition: ‘, (15,12), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0), 1, cv2.LINE_AA)

[7] Добавить графический интерфейс:

    Мы также можем добавить небольшой графический интерфейс, чтобы еще больше улучшить внешний вид программы и сделать ее более удобной для пользователя. Пример фрагмента кода для реализации простейшего графического интерфейса выглядит следующим образом:

root = Tk()
root.geometry("1920x1080+0+0")
root.state("zoomed")
root.config(bg="#3a3b3c")
root.title("Eldering Monitring")

def path_select():
    global video_path,cap
    video_path = filedialog.askopenfilename()
    cap = cv2.VideoCapture(video_path)
    text = Label(root,text="Recorded Video  ",bg="#3a3b3c",fg="#ffffff",font=("Calibri",20))
    text.place(x=250,y=150)
# For Live feed
def video_live():
    global video_path,cap
    video_path = 0
    cap = cv2.VideoCapture(video_path)
    text = Label(root,text="Live Video Feed",bg="#3a3b3c",fg="#ffffff",font=("Calibri",20))
    text.place(x=250,y=150)
    
    
live_btn = Button(root, height =1,text='LIVE', width=8, fg='magenta', font=("Calibri", 14, "bold"), command=lambda:video_live())
live_btn.place(x=1200,y=20)
text = Label(root,text="  For Live Video",bg="#3a3b3c",fg="#ffffff",font=("Calibri",20))
text.place(x=1000,y=30)

browse_btn = Button(root, height = 1, width=8 ,text='VIDEO',fg='magenta', font=("Calibri", 14, "bold"), command=lambda:path_select())
browse_btn.place(x=1200,y=90)
text = Label(root,text="To Browse Video",bg="#3a3b3c",fg="#ffffff",font=("Calibri",20))
text.place(x=1000,y=90)


ttl = Label(root,text="ELDERING MONITERING ",bg="#4f4d4a",fg="#fffbbb",font=("Calibri",40))
ttl.place(x=100,y=50)

Video_frame = Frame(root, height=720, width=1080, bg="#3a3b3c")
Video_Label = Label(root)
Video_frame.place(x=15,y=200)
Video_Label.place(x=15,y=200)

Автору есть что сказать

Если вам нужен код, поговорите с блогером в частном порядке, и блоггер свяжется с вами.
Если вы считаете, что то, что сказал блогер, полезно для вас, пожалуйста, нажмите, чтобы поддержать его, и мы будем продолжать обновлять такие вопросы...

Supongo que te gusta

Origin blog.csdn.net/weixin_62075168/article/details/128885743
Recomendado
Clasificación