Browse Source

Added Button to Control Export to GUI

Dev
Erik Hildebrandt 3 years ago
parent
commit
34d48df51d
  1. 40
      HPEModule.py
  2. 2
      IHPEModule.py
  3. 14
      PoseEstimationGUI.py

40
HPEModule.py

@ -16,7 +16,7 @@ mp_pose = mp.solutions.pose
class HPEModule(IHPEModule): class HPEModule(IHPEModule):
# This method starts HPE using a camera specified by its name # This method starts HPE using a camera specified by its name
def startHPEwithCamera(self, camera_name): def startHPEwithCamera(self, camera_name, export_landmarks):
out = None out = None
# check if the camera_name is a file path or not # check if the camera_name is a file path or not
if os.path.isfile(camera_name): if os.path.isfile(camera_name):
@ -39,15 +39,17 @@ class HPEModule(IHPEModule):
# set the window name using the camera name # set the window name using the camera name
window_name = f"Pose Estimation on Camera {camera_name}" window_name = f"Pose Estimation on Camera {camera_name}"
print(export_landmarks.get())
if export_landmarks.get() is True:
# create the root element
root = ET.Element("Landmarks")
# create the root element # loop through each landmark
root = ET.Element("Landmarks") for i in range(33):
ET.SubElement(root, f'landmark{i}')
# loop through each landmark framecounter = 0
for i in range(33):
ET.SubElement(root, f'landmark{i}')
framecounter = 0
# start pose detection # start pose detection
with mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose: with mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose:
@ -75,12 +77,13 @@ class HPEModule(IHPEModule):
# Extract landmarks # Extract landmarks
try: try:
landmarks = results.pose_landmarks.landmark landmarks = results.pose_landmarks.landmark
for j, landmark in enumerate(landmarks): if export_landmarks.get() is True:
frame_element = ET.SubElement(root.find(f'landmark{j}'), f'frame{framecounter}') for j, landmark in enumerate(landmarks):
frame_element.set("X", str(landmark.x)) frame_element = ET.SubElement(root.find(f'landmark{j}'), f'frame{framecounter}')
frame_element.set("Y", str(landmark.y)) frame_element.set("X", str(landmark.x))
frame_element.set("Z", str(landmark.z)) frame_element.set("Y", str(landmark.y))
framecounter += 1 frame_element.set("Z", str(landmark.z))
framecounter += 1
# print(landmarks) # print(landmarks)
except: except:
pass pass
@ -100,8 +103,9 @@ class HPEModule(IHPEModule):
if cv2.getWindowProperty(window_name, cv2.WND_PROP_VISIBLE) < 1: if cv2.getWindowProperty(window_name, cv2.WND_PROP_VISIBLE) < 1:
break break
xml_string = ET.tostring(root, encoding="UTF-8") if export_landmarks.get() is True:
parsed_xml = minidom.parseString(xml_string) xml_string = ET.tostring(root, encoding="UTF-8")
pretty_xml_string = parsed_xml.toprettyxml(indent=" ") parsed_xml = minidom.parseString(xml_string)
with open(f"{camera_name}_output.xml", "w") as xml_file: pretty_xml_string = parsed_xml.toprettyxml(indent=" ")
xml_file.write(pretty_xml_string) with open(f"{camera_name}_output.xml", "w") as xml_file:
xml_file.write(pretty_xml_string)

2
IHPEModule.py

@ -5,5 +5,5 @@ class IHPEModule(ABC):
# This method starts HPE using a camera specified by its name # This method starts HPE using a camera specified by its name
@abstractmethod @abstractmethod
def startHPEwithCamera(self, camera_name): def startHPEwithCamera(self, camera_name, export_landmarks):
pass pass

14
PoseEstimationGUI.py

@ -12,7 +12,7 @@ class PoseEstimationGUI:
self.mp4_file_path = None self.mp4_file_path = None
self.root = tk.Tk() self.root = tk.Tk()
self.root.title("Pose Estimation GUI") self.root.title("Pose Estimation GUI")
self.root.geometry("400x250") self.root.geometry("400x400")
self.root.config(bg="#F9F9F9") self.root.config(bg="#F9F9F9")
self.camera_options = [] # Initialize camera options list self.camera_options = [] # Initialize camera options list
@ -42,13 +42,21 @@ class PoseEstimationGUI:
font=("Arial", 12, "bold"), command=self.start_pose_estimation) font=("Arial", 12, "bold"), command=self.start_pose_estimation)
self.start_button.pack(pady=(20, 10)) self.start_button.pack(pady=(20, 10))
# Create a checkbox to enable/disable Export of Landmarks
self.export_Landmarks = tk.BooleanVar()
self.export_Landmarks.set(False)
export_Landmarks_checkbox = tk.Checkbutton(self.root, text="Export Landmarks", variable=self.export_Landmarks,
bg="#F9F9F9",
font=("Arial", 12, "bold"), onvalue=True, offvalue=False)
export_Landmarks_checkbox.pack()
self.root.mainloop() self.root.mainloop()
def start_pose_estimation(self): def start_pose_estimation(self):
if self.mp4_file_path is not None: if self.mp4_file_path is not None:
# Start pose estimation on the selected mp4 file # Start pose estimation on the selected mp4 file
pose_estimator = HPEModule() pose_estimator = HPEModule()
pose_thread_file = threading.Thread(target=pose_estimator.startHPEwithCamera, args=(self.mp4_file_path,)) pose_thread_file = threading.Thread(target=pose_estimator.startHPEwithCamera, args=(self.mp4_file_path, self.export_Landmarks,))
self.mp4_file_path = None self.mp4_file_path = None
self.file_selected_label.config(text="No File selected", fg="red") self.file_selected_label.config(text="No File selected", fg="red")
pose_thread_file.start() pose_thread_file.start()
@ -57,7 +65,7 @@ class PoseEstimationGUI:
# print(self.selected_camera.get()) # print(self.selected_camera.get())
pose_estimator = HPEModule() pose_estimator = HPEModule()
camera = int(self.selected_camera.get()) camera = int(self.selected_camera.get())
pose_thread_camera = threading.Thread(target=pose_estimator.startHPEwithCamera, args=(camera,)) pose_thread_camera = threading.Thread(target=pose_estimator.startHPEwithCamera, args=(camera, self.export_Landmarks,))
pose_thread_camera.start() pose_thread_camera.start()
def select_file(self): def select_file(self):

Loading…
Cancel
Save