import cv2 import mediapipe as mp import csv import os import numpy as np # MediaPipe برای شناسایی نقاط بدن mp_drawing = mp.solutions.drawing_utils mp_pose = mp.solutions.pose # شروع فرآیند ضبط ویدئو با استفاده از دوربین cap = cv2.VideoCapture(0) # تعداد فریم های ثبت شده در فایل csv count = 0 # حذف فایل csv اگر وجود داشته باشد if os.path.exists("pose_data.csv"): os.remove("pose_data.csv") # مشخص کردن مشخصات شناسایی نقاط بدن با کمترین درصد اشتباه و پیگیری with mp_pose.Pose( min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose: # ایجاد فایل csv برای ذخیره داده ها fields = ['frame', 'nose_x', 'nose_y', 'left_shoulder_x', 'left_shoulder_y', 'right_shoulder_x', 'right_shoulder_y', 'left_elbow_x', 'left_elbow_y', 'right_elbow_x', 'right_elbow_y', 'left_wrist_x', 'left_wrist_y', 'right_wrist_x', 'right_wrist_y', 'left_hip_x', 'left_hip_y', 'right_hip_x', 'right_hip_y', 'left_knee_x', 'left_knee_y', 'right_knee_x', 'right_knee_y', 'left_ankle_x', 'left_ankle_y', 'right_ankle_x', 'right_ankle_y'] filename = 'pose_data.csv' with open(filename, 'w') as csvfile: csvwriter = csv.writer(csvfile) csvwriter.writerow(fields) # خواندن فریم های ویدئویی با استفاده از دوربین while cap.isOpened(): ret, frame = cap.read() if not ret: break # ایجاد یک نسخه از تصویر برای رسم شکل‌های شناسایی شده روی آن image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) image.flags.writeable = False # تشخیص نقاط بدن در تصویر با استفاده از MediaPipe results = pose.process(image) # تبدیل تصویر به حالت قابل نمایش برای رسم شکل‌های شناسایی شده روی آن image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # رسم شکل‌های شناسایی شده روی تصویر if results.pose_landmarks is not None: if results.pose_landmarks in fields: mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS) # نمایش تصویر با شکل‌های شناسایی شده cv2.imshow('Pose Estimation', image) # ثبت داده های شناسایی شده در فایل csv if (count % 10 == 0): num_coords = len(results.pose_landmarks.landmark) x= [results.pose_landmarks.landmark[i].x if results.pose_landmarks.landmark[i] is not None else float('nan') for i in range(num_coords)] y = [results.pose_landmarks.landmark[i].y if results.pose_landmarks.landmark[i] is not None else float('nan') for i in range(num_coords)] row = [count] + x + y with open(filename, 'a') as csvfile: csvwriter = csv.writer(csvfile) csvwriter.writerow(row) count += 1 # خروجی دادن از برنامه با فشردن دکمه q if cv2.waitKey(1) & 0xFF == ord('q'): break # آزاد کردن منابع و خروج از برنامه cap.release() cv2.destroyAllWindows() 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 shoulder = [landmarks[mp_pose.PoseLandmark.right_shoulder.value].x,landmarks[mp_pose.PoseLandmark.right_shoulder.value].y] elbow = [landmarks[mp_pose.PoseLandmark.right_elbow.value].x,landmarks[mp_pose.PoseLandmark.right_elbow.value].y] wrist = [landmarks[mp_pose.PoseLandmark.right_wrist.value].x,landmarks[mp_pose.PoseLandmark.right_wrist.value].y] shoulder = [landmarks[mp_pose.PoseLandmark.left_shoulder.value].x,landmarks[mp_pose.PoseLandmark.left_shoulder.value].y] elbow = [landmarks[mp_pose.PoseLandmark.left_elbow.value].x,landmarks[mp_pose.PoseLandmark.left_elbow.value].y] wrist = [landmarks[mp_pose.PoseLandmark.left_wrist.value].x,landmarks[mp_pose.PoseLandmark.left_wrist.value].y] knee = [landmarks[mp_pose.PoseLandmark.right_knee.value].x,landmarks[mp_pose.PoseLandmark.right_knee.value].y] hip = [landmarks[mp_pose.PoseLandmark.right_hip.value].x,landmarks[mp_pose.PoseLandmark.right_hip.value].y] ankle = [landmarks[mp_pose.PoseLandmark.right_ankle.value].x,landmarks[mp_pose.PoseLandmark.right_ankle.value].y] knee = [landmarks[mp_pose.PoseLandmark.left_knee.value].x,landmarks[mp_pose.PoseLandmark.left_knee.value].y] hip = [landmarks[mp_pose.PoseLandmark.left_hip.value].x,landmarks[mp_pose.PoseLandmark.left_hip.value].y] ankle = [landmarks[mp_pose.PoseLandmark.left_ankle.value].x,landmarks[mp_pose.PoseLandmark.left_ankle.value].y] nose = [landmarks[mp_pose.PoseLandmark.right_nosevalue].x,landmarks[mp_pose.PoseLandmark.left_nose.value].y] elbow = [landmarks[mp_pose.PoseLandmark.left_elbow.value].x,landmarks[mp_pose.PoseLandmark.left_elbow.value].y] wrist = [landmarks[mp_pose.PoseLandmark.left_wrist.value].x,landmarks[mp_pose.PoseLandmark.left_wrist.value].y] # if (count % 10 == 0 and results.pose_landmarks is not None): # import cv2 # import mediapipe as mp # import csv # import os # # # # # mp_drawing = mp.solutions.drawing_utils # mp_pose = mp.solutions.pose # # cap = cv2.VideoCapture(0) # count = 0 # # with mp_pose.Pose( # min_detection_confidence=0.5, # min_tracking_confidence=0.5) as pose: # fields = ['frame', 'nose_x', 'nose_y', 'left_shoulder_x', 'left_shoulder_y', 'right_shoulder_x', 'right_shoulder_y'] # filename = 'pose_data.csv' # with open(filename, 'w') as csvfile: # csvwriter = csv.writer(csvfile) # csvwriter.writerow(fields) # while cap.isOpened(): # ret, frame = cap.read() # if not ret: # break # image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # image.flags.writeable = False # results = pose.process(image) # image.flags.writeable = True # image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # # if results.pose_landmarks is not None: # mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS) # # cv2.imshow('Pose Estimation', image) # # if (count % 10 == 0): # num_coords = len(results.pose_landmarks.landmark) # row = [count] + [results.pose_landmarks.landmark[i].x if results.pose_landmarks.landmark[i] is not None else float('nan') for i in range(num_coords)] + \ # [results.pose_landmarks.landmark[i].y if results.pose_landmarks.landmark[i] is not None else float('nan') for i in range(num_coords)] # with open(filename, 'a') as csvfile: # csvwriter = csv.writer(csvfile) # csvwriter.writerow(row) # count += 1 # # if cv2.waitKey(1) & 0xFF == ord('q'): # break # # cap.release() # cv2.destroyAllWindows()