From d5eb73ed3bfe444fa888acef7e60445091f6a911 Mon Sep 17 00:00:00 2001 From: Gaurav Lahoti Date: Mon, 2 Oct 2023 13:59:14 +0530 Subject: [PATCH] Updated mediapipe_handler with functions --- lkcomputervision/__init__.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 214 -> 323 bytes .../mediapipe_handler.cpython-310.pyc | Bin 3371 -> 2872 bytes lkcomputervision/mediapipe_handler.py | 147 ++++++++---------- main.py | 32 ++-- 5 files changed, 88 insertions(+), 93 deletions(-) diff --git a/lkcomputervision/__init__.py b/lkcomputervision/__init__.py index 99611c2..dc292bb 100644 --- a/lkcomputervision/__init__.py +++ b/lkcomputervision/__init__.py @@ -1 +1 @@ -from .mediapipe_handler import MediaPipeHandler \ No newline at end of file +from .mediapipe_handler import faceMesh, detectFace, detectPose, trackHands, detectAll \ No newline at end of file diff --git a/lkcomputervision/__pycache__/__init__.cpython-310.pyc b/lkcomputervision/__pycache__/__init__.cpython-310.pyc index ed21fcb214f736449625b5ca642b93fcd921f74a..4491bb41544e62e28aca253446349a58e031b0a1 100644 GIT binary patch literal 323 zcmZ{fyGlec5QdX;Sgf)&GRZw;z gdaf=-@c%U!Q;Uj>ox8U@?2VO4!$o~F)T?&r8^JGHy#N3J literal 214 zcmd1j<>g`kg5oFqsro?rF^Gc(44TX@8G*u@ zjJE`QQ&Tb%12PLzJreU$a#D-@G?}6Vb3uXyK*9J7h-eYWxRne=%s>iE{IYkkig8XX zN^#6faZM>rPAo}{$;nR6&n+k|Ni8bNEY8f&0}41p1;QW#@$s2?nI-Y@dIgoYIBatB RQ%ZAE?LaOm2AMCw004AUH?#l% diff --git a/lkcomputervision/__pycache__/mediapipe_handler.cpython-310.pyc b/lkcomputervision/__pycache__/mediapipe_handler.cpython-310.pyc index 34e9f1c9a8a0625e21ded23790743a94edac9556..83dc58fedad697bc2c95b97dcf908fe199b47016 100644 GIT binary patch literal 2872 zcmb7GTW{P%6!!SC>-Ao9>4j3-f)I2;B_a}U6_9Sy7Ln{m*&u`!WH~#NtR3%qJND*+ zY=qRlqW*zAYG~XngJ;bQkLo<=^*8( z0aA|UY2le<8k97pYUwxFQL68@WNe2|3ECW#8kFE?s6xplt{lseJWwvA=ew~IDFZds z2AN0-H8*=9UyxXJq*#koSLfSd4%??>UHW=;PmVKj_E3s-&}LmjXs?4d7aNh`=Ajgz z6ct5Q;(T0)i;+GkMfs=@6)8DaE(npH+>P`|i!%46i10>O9#kSJ%0{xgaG}8H8_?6J zd@g?}$#5+yyiY;jls=RK>jc*0`xO)lx)(~lswCtzA!iBs=7pSS2i)$kBOzZ)dE1G~kn4h!0*{t(11kdkbV`z;m(iPAb=P4w1rSo1xfC&gN0 zv$116c(k*+^XP%O-06FvV~HKcpGb17+wU-Lhb+-YT8?h!Dpnd)NyhH=SeGV7r)N=a zpE%vaq=bSsS`nDb57%lNTN};C*6v2Lxv{yn`&px2E%7XFpyFh+0L#br^E?h@ISat5 zz+9R&%c4#zOo(HaX7w-4^PC_|@*^`Whw=q9d-eb?B>oy`|8iHp2pA7m4(&d-k3GBX zhtA463ywm+x6*(k-V6LbZ?Tn@52hYF0o?hDcZ9uu$oRi0I*dAY&*?F%4W9ED|Dbo4 z=x8{)2X8RA1C>q;vP@KxA&XEilB>|uL8=h>JDt4!JAWM}y#)UZC!7ZqCaO$j^(cP(=4Z?53lo==EIne^)x)3qoISqq8GYWdv*hq7*qRnRahX$ngz8;rLxiw_~l)BhtSEnFxtm_=sT z>;(K8Zj&2NF|~d8a?O;THk6ZuSW`Dcpx;iBCoq`8FI|h5@DA)XgkNb4Kb;iFO~E#W zlwt)}9@Ddw#%7bsOrrfGFYk|KyqNMss6^XYy0d z&VsXXPhN%FOI^G)`wfxJ_;nnfM`)KxCG{#E;3HTP;JQifScbfj<`2jjfAaTWutlI6 zJs2~Xas-{Mf)GlP^pwOTB%+l=S+q*1h*phABu7f5f?rhNcMbl<tr*U4*F5O_3GT-cY{yq#;$!;|-a*CN7r{W1|n8o2Qiv|BsUXZ2_Otn)-z*`i1P1!LC dGyQ(Yr+trojQ1R*d<~Y!1~C?licv0<{sDJ{nFjy> literal 3371 zcma)J%WSAjbqg7(V#_syRb)G>$Tjdi`p9wf*|Nno+&( zG5oIlyBY1Y82cw>PX0_}ZXu=bLkK2#p9STc2gW)RhA>|;VZJZ|Q}8X;w*G~7tkWZT z@;9@yiqeP$T(H0pTo^AIdNze6?3X;SpjCte&4%WRDzpkTPt>3}!WVV4cSQpuwN&eF zB;xM9cpTm74n;qbJ$_>j zkU>Z5#F^B!j`m4)($G43B(+IX>z-hk7w=$d#$X&&(^3B*i$}vWs0-PB5)U7S$oEs_ z4aVV7iL&=F_f)wkDm807N+abUua(Abw-<#X%Ay|GQfE*xS5(#cL6q((e_Bhqz@~jk zm35CS)^Eem>dcNy*}G`f=E_Q={_blg&tR9nzq9(u&PrE`<)K&;2fc04InGIEqh6jU4;&_xhEtThB zR-PyEE(wc9X%K109VKmI(7LnSSq)b7F&lZ*K)|N35G=H|r6%!vhBz=fv8 z0ugp@B^CLH%%QjD;u^T96i)6WZc;7WoG0FnSyYLO+)XI?NOh#fuC-$oeo-$PMKkyF zdfv#J!hB`rc3!#3K+6}HMRU>u9nPTvPOd<+h4sq#623_=3(pJiv&F8nGc?mHi|Z*`BKGMe)PEOkP0m_8Cb| zUN%TvCUJ$t&q(|nBJgJJC6&LRf_i_149Kk<(0L&Yg>21?X|6~wT)$RJ?+Lk6g9G_p?K%? zSfPk}nfwizD#PN`@uk6h%YK|@sy3|;W3gz8^X#}Z9L2=nVu+MJ4Sz;X>6@0gd*qwI z&VLpJuc?Jo3Tbv`#5PPEU5}DB_&Q$$t3VPkICD+oS8`^hZ;pD6YN1 z7f^CGVL8Vg1Xs)n*P02<&>F6fbWcI8og0E*WI3+Okd~GTX?#*&;pVA+Qlx|C8^{nwDUVjz3 diff --git a/lkcomputervision/mediapipe_handler.py b/lkcomputervision/mediapipe_handler.py index 9d979c0..643c370 100644 --- a/lkcomputervision/mediapipe_handler.py +++ b/lkcomputervision/mediapipe_handler.py @@ -1,87 +1,78 @@ import cv2 import mediapipe as mp -class MediaPipeHandler: - def __init__(self): - self.mp_drawing = mp.solutions.drawing_utils - self.mp_hands = mp.solutions.hands - self.mp_pose = mp.solutions.pose - self.mp_face_detection = mp.solutions.face_detection - self.mp_face_mesh = mp.solutions.face_mesh - - self.hands = self.mp_hands.Hands() - self.pose = self.mp_pose.Pose() - self.face_detection = self.mp_face_detection.FaceDetection() - self.face_mesh = self.mp_face_mesh.FaceMesh() - - def trackHands(self, frame, draw=True): - results = self.hands.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) - hand_land_mark = {} - - if results.multi_hand_landmarks: - for idx, landmarks in enumerate(results.multi_hand_landmarks): - landMarks = {} - for point, landmark in enumerate(landmarks.landmark): +mp_drawing = mp.solutions.drawing_utils +def faceMesh(frame, draw=True): + mp_face_mesh = mp.solutions.face_mesh + with mp_face_mesh.FaceMesh() as face_mesh: + results = face_mesh.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) + face_landmarks_dict = {} + if results.multi_face_landmarks: + for i, face_landmarks in enumerate(results.multi_face_landmarks): + face_landmarks_list = [] + for landmark_id, landmark in enumerate(face_landmarks.landmark): x, y, z = landmark.x, landmark.y, landmark.z - landMarks[point] = {"x": x, "y": y, "z": z} - hand_land_mark = landMarks + face_landmarks_list.append({"x": x, "y": y, "z": z}) + face_landmarks_dict[i] = face_landmarks_list if draw: - self.mp_drawing.draw_landmarks(frame, landmarks, self.mp_hands.HAND_CONNECTIONS) - return {"frame": frame, "landmarks": hand_land_mark} - - def detectFace(self, frame, draw=True): - with self.mp_face_detection.FaceDetection(min_detection_confidence=0.5) as face_detection: - results = face_detection.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) - faceLms = {} + mp_drawing.draw_landmarks(frame, face_landmarks, mp_face_mesh.FACEMESH_TESSELATION) + return {"frame": frame, "landmarks": face_landmarks_dict} + - if results.detections: - for i, detection in enumerate(results.detections): - bboxC = detection.location_data.relative_bounding_box - ih, iw, _ = frame.shape - x, y, w, h = bboxC.xmin, bboxC.ymin, bboxC.width, bboxC.height - faceLms[i] = {"x": x, "y": y, "width": w, "height": h} - if draw: - self.mp_drawing.draw_detection(frame, detection) - return {"frame": frame, "landmarks": faceLms} +def trackHands(frame, draw=True): + mp_hands = mp.solutions.hands + hands = mp_hands.Hands() + results = hands.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) + hand_land_mark = {} + if results.multi_hand_landmarks: + for idx, landmarks in enumerate(results.multi_hand_landmarks): + landMarks = {} + for point, landmark in enumerate(landmarks.landmark): + x, y, z = landmark.x, landmark.y, landmark.z + landMarks[point] = {"x": x, "y": y, "z": z} + hand_land_mark = landMarks + if draw: + mp_drawing.draw_landmarks(frame, landmarks,mp_hands.HAND_CONNECTIONS) + return {"frame": frame, "landmarks": hand_land_mark} - def faceMesh(self, frame, draw=True): - with self.mp_face_mesh.FaceMesh() as face_mesh: - results = face_mesh.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) - face_landmarks_dict = {} - - if results.multi_face_landmarks: - for i, face_landmarks in enumerate(results.multi_face_landmarks): - face_landmarks_list = [] - for landmark_id, landmark in enumerate(face_landmarks.landmark): - x, y, z = landmark.x, landmark.y, landmark.z - face_landmarks_list.append({"x": x, "y": y, "z": z}) - face_landmarks_dict[i] = face_landmarks_list - if draw: - self.mp_drawing.draw_landmarks(frame, face_landmarks, self.mp_face_mesh.FACEMESH_TESSELATION) - return {"frame": frame, "landmarks": face_landmarks_dict} - - def detectPose(self, frame, draw=True): - with self.mp_pose.Pose() as pose: - results = pose.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) - pose_landmarks_dict = {} - - if results.pose_landmarks: - for landmark_id, landmark in enumerate(results.pose_landmarks.landmark): - x, y, z = landmark.x, landmark.y, landmark.z - pose_landmarks_dict[landmark_id] = {"x": x, "y": y, "z": z} +def detectFace(frame, draw=True): + mp_face_detection = mp.solutions.face_detection + with mp_face_detection.FaceDetection(min_detection_confidence=0.5) as face_detection: + results = face_detection.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) + faceLms = {} + if results.detections: + for i, detection in enumerate(results.detections): + bboxC = detection.location_data.relative_bounding_box + ih, iw, _ = frame.shape + x, y, w, h = bboxC.xmin, bboxC.ymin, bboxC.width, bboxC.height + faceLms[i] = {"x": x, "y": y, "width": w, "height": h} if draw: - self.mp_drawing.draw_landmarks(frame, results.pose_landmarks, self.mp_pose.POSE_CONNECTIONS) - return {"frame": frame, "landmarks": pose_landmarks_dict} + mp_drawing.draw_detection(frame, detection) + return {"frame": frame, "landmarks": faceLms} + +def detectPose(frame, draw=True): + mp_pose = mp.solutions.pose + with mp_pose.Pose() as pose: + results = pose.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) + pose_landmarks_dict = {} + if results.pose_landmarks: + for landmark_id, landmark in enumerate(results.pose_landmarks.landmark): + x, y, z = landmark.x, landmark.y, landmark.z + pose_landmarks_dict[landmark_id] = {"x": x, "y": y, "z": z} + if draw: + mp_drawing.draw_landmarks(frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS) + return {"frame": frame, "landmarks": pose_landmarks_dict} + - def detectAll(self, frame): - handTracker = self.trackHands(frame) - faceDetector = self.detectFace(frame) - facemesh = self.faceMesh(frame) - bodypose = self.detectPose(frame) - landMarks = { - "handTracking": handTracker["landmarks"], - "detectFace": faceDetector["landmarks"], - "faceMesh": facemesh["landmarks"], - "detectPose": bodypose["landmarks"] - } - return landMarks +def detectAll(frame): + handTracker = trackHands(frame) + faceDetector = detectFace(frame) + facemesh = faceMesh(frame) + bodypose = detectPose(frame) + landMarks = { + "handTracking": handTracker, + "detectFace": faceDetector, + "faceMesh": facemesh, + "detectPose": bodypose + } + return landMarks \ No newline at end of file diff --git a/main.py b/main.py index c720eb4..3196ea1 100644 --- a/main.py +++ b/main.py @@ -1,8 +1,5 @@ import cv2 -from lkcomputervision import MediaPipeHandler - -# Initialize the MediaPipeHandler -mp = MediaPipeHandler() +from lkcomputervision.mediapipe_handler import faceMesh, trackHands, detectFace, detectPose, detectAll # Capture video from the webcam (you can also specify a video file path) cap = cv2.VideoCapture(0) # 0 represents the default webcam @@ -15,17 +12,24 @@ break # Process the frame to track hands - #result = mp.trackHands(frame) - #result = mp.detectFace(frame) - #result = mp.detectPose(frame) - result = mp.faceMesh(frame) - - # Retrieve the frame with hand landmarks drawn on it - frame_with_landmarks = result["frame"] - print(result["landmarks"]) - + # result = trackHands(frame) + # result = detectFace(frame) + # result = detectPose(frame) + # result = faceMesh(frame) + result = detectAll(frame) + + # Retrieve the frame with hand landmarks drawn on it for individual functions + # frame_with_landmarks = result["frame"] + # print(frame_with_landmarks) + + # for detectAll + for i in result.keys(): + print(f'{i}', end="") + print(result[i]["landmarks"]) + cv2.imshow("Hand Tracking", result[i]["frame"]) + # Display the frame with landmarks - cv2.imshow("Hand Tracking", frame_with_landmarks) + # cv2.imshow("Hand Tracking", frame_with_landmarks) # Exit the loop when the user presses the 'q' key if cv2.waitKey(1) & 0xFF == ord('q'):