From 4422837d1aa8aa70bc20c92bf4ae916585e64a4f Mon Sep 17 00:00:00 2001 From: ydw <2505551883@qq.com> Date: Tue, 22 Jul 2025 18:24:14 +0800 Subject: [PATCH] fix_bugs_in_screenshot_pro --- .vscode/settings.json | 5 + image/cropped_Right_1753179393.jpg | Bin 0 -> 26789 bytes image/cropped_Right_1753179532.jpg | Bin 0 -> 15360 bytes image/cropped_Right_1753179605.jpg | Bin 0 -> 60124 bytes main.py | 0 utils/GUI.py | 73 +++--- utils/__pycache__/finger_drawer.cpython-312.pyc | Bin 0 -> 2180 bytes utils/__pycache__/finger_drawer.cpython-38.pyc | Bin 0 -> 1303 bytes utils/__pycache__/gesture_data.cpython-312.pyc | Bin 0 -> 2269 bytes utils/__pycache__/gesture_data.cpython-38.pyc | Bin 0 -> 1489 bytes utils/__pycache__/hand_gesture.cpython-312.pyc | Bin 0 -> 3212 bytes utils/__pycache__/hand_gesture.cpython-38.pyc | Bin 0 -> 1834 bytes utils/__pycache__/index_finger.cpython-312.pyc | Bin 0 -> 8883 bytes utils/__pycache__/index_finger.cpython-38.pyc | Bin 0 -> 3651 bytes utils/__pycache__/kalman_filter.cpython-312.pyc | Bin 0 -> 2428 bytes utils/__pycache__/kalman_filter.cpython-38.pyc | Bin 0 -> 1388 bytes utils/__pycache__/model.cpython-312.pyc | Bin 0 -> 1144 bytes utils/__pycache__/model.cpython-38.pyc | Bin 0 -> 838 bytes utils/__pycache__/process_images.cpython-312.pyc | Bin 0 -> 1628 bytes utils/__pycache__/process_images.cpython-38.pyc | Bin 0 -> 1101 bytes .../__pycache__/video_recognition.cpython-312.pyc | Bin 0 -> 3748 bytes utils/__pycache__/video_recognition.cpython-38.pyc | Bin 0 -> 2122 bytes utils/gesture_recognition.ipynb | 122 +++++---- utils/hand_gesture.py | 2 +- utils/index_finger.py | 2 +- utils/main.py | 278 --------------------- 26 files changed, 129 insertions(+), 353 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 image/cropped_Right_1753179393.jpg create mode 100644 image/cropped_Right_1753179532.jpg create mode 100644 image/cropped_Right_1753179605.jpg create mode 100644 main.py create mode 100644 utils/__pycache__/finger_drawer.cpython-312.pyc create mode 100644 utils/__pycache__/finger_drawer.cpython-38.pyc create mode 100644 utils/__pycache__/gesture_data.cpython-312.pyc create mode 100644 utils/__pycache__/gesture_data.cpython-38.pyc create mode 100644 utils/__pycache__/hand_gesture.cpython-312.pyc create mode 100644 utils/__pycache__/hand_gesture.cpython-38.pyc create mode 100644 utils/__pycache__/index_finger.cpython-312.pyc create mode 100644 utils/__pycache__/index_finger.cpython-38.pyc create mode 100644 utils/__pycache__/kalman_filter.cpython-312.pyc create mode 100644 utils/__pycache__/kalman_filter.cpython-38.pyc create mode 100644 utils/__pycache__/model.cpython-312.pyc create mode 100644 utils/__pycache__/model.cpython-38.pyc create mode 100644 utils/__pycache__/process_images.cpython-312.pyc create mode 100644 utils/__pycache__/process_images.cpython-38.pyc create mode 100644 utils/__pycache__/video_recognition.cpython-312.pyc create mode 100644 utils/__pycache__/video_recognition.cpython-38.pyc delete mode 100644 utils/main.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a8c2003 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "python-envs.defaultEnvManager": "ms-python.python:conda", + "python-envs.defaultPackageManager": "ms-python.python:conda", + "python-envs.pythonProjects": [] +} \ No newline at end of file diff --git a/image/cropped_Right_1753179393.jpg b/image/cropped_Right_1753179393.jpg new file mode 100644 index 0000000000000000000000000000000000000000..97448f4e3e45ee3294f77bb48a827342841c2510 GIT binary patch literal 26789 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 bLZ|^o(1QcoinZk_=%XIuijG*CD4+k?;+s?^ literal 0 HcmV?d00001 diff --git a/image/cropped_Right_1753179532.jpg b/image/cropped_Right_1753179532.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c1eadcdabe71f7a9178abddfbf09fab64298452 GIT binary patch literal 15360 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ð?G`9aSLpO_~Fn zqH5PX*gOq6BGmU~!6+Z*=OM|DfhrakgM8kKW=5MQ-DS0GWrn2R>nw)fi|^VyT3t-{ ztvUiE>;O!ka@t%n9Lx(nkif;(V{OeRqS_2j9=;Zfb#QU&!6RS87I{UUu^(m5GAtj7 z_TYLHWw<`u=$KFwI(G1I0}mw%woTCL_Nquj=J{#tVxe)CbJxT=^yqbG=W6^y(lMPZ zH$j6s8ze?GlAxHB4>=K~wBcCloTt~H2s%r5cF_uex*koyI!51Rb9ysS8mUmU+m8zQ z9*zjjt+AV6uS6q4Q8Pjv5bxxtc@1SX+SPnQgn zH``vgs%5n`4&Bdl-{+ht%;Vu$#o!--Lqm7oihX=0`?Ilj@MRQ^9>5U%!Gr^0%nU2E zyN%g>hsx8$+STSKy>_wnb<@u$WDcqRxW%S0h`=8aWXnKkzx(wM@Uzw}S5nY}9Aq~; z>7{0MSsxe_#r(c@-(?~=VXQSbQD6i5iCY~%$%2JDc zg4+F7_V)>0Rk}{~DQ>gH{UtfAP z;Lqvxnueq~zi$b~Fk@I9O9F8@0cq9Y4c{;DX89KK6UUReW$CF0!Wd3hO_`_@j<+M* z*IP=2MS@r-!iNspDL$V*y>L}$OLTvoN1|B2xQNw0GuJlB&ptq)Yl-?hUzx`{qRb7t zpr$gTw_B%Y>I+KGgHwX_AK^$oHIt8lValy$?Eu$z-00Vk@Sv( zzW$ZJcMD9dK8a5#nFyRfp}!xfnV(eqU52f&S-v!6!>}$1U9N#HQafP%{z`19u{zX6 zK_8$eTW7fWYV#7%r~epbynv8cLPtHK0-8ko zzkl7j7N*-RP-r5V?fg?`LLlL(yC6GmXNU($jVp*p(2}G4JuMda-6st6{B)lQ-VJ_~ z-YTAFM|NwBUtlK?>*t$WPQr8sjidS>bD3hogaX-$GAphTikuFd8?6tYUJ3wDb~_ps zoef6EPJ~AsoDVU{cjN6O82p+NgZ@?=Bn23nadYXAIvZH}vdH*hHd`cSD1V^aC#_Or zY}3w%6y#Y{as@J!XkXO!Wkj5Rr&Nk-1Ah|!wOC4i6Daw-kclLy%7{&qgM@@;39iqpMQYQ6J<(Y%x13qCEd+YMgCV+=Yb%_m9@&t|D7<^MNMc7zKb~zHK zP?vnswlNl7-y=N+K}zs0Y0gf%Ko z%NQ+rTb1aR5}2N&nAe!A2*JSiW{Jas+8?blOCH<0WvIrqi>VjpXa`zcXdQ@Lc%%ES ztJXtXk?#8t#^@LV{8Z1*U8|ffV(e*pvrjP6)@rdk82rnKWvvtAjmvC*&li{)9T1e2 zj_uQPQg3SJJ`p7aJl5c^;t}_oTnjYfrfd_SSDVy8GjA^y|7rI8qtT~W69jFhpMY&v zWEj56Tg9E~Ww60iL)|W3b=J{2ngH7QCJJq%5JA%x(|>5HO(t zH_cQUuge;|G3X4Wqbh2#$x$sz3!K>!v>c-1+? zQb}>L4XF80E^a|WV!A-$6u)98rYN#s<|*Qyo*ZGEYoLZPDMN`eI{p~vfSCCq2w86W z+hEXsTvuab|2C{7yLDTlsaI(ZTLXa0K>o78{{8mKH2}@>ck#FfoB{u+z<@fO2&JYS z;VBS1eEJLn1gRBi-INUAh-5%jUOS#?u=p<%1=HFhR8+gv z#s-$92wXK4Z@O77kS?KAK_6|9@=(XTch%Pvp*lyl#dMrOyZ>K z07R4q!5+sDi zxd_h4F~BbrfUd)BGW^`5wq6Wj2$0w?+U|boc#lqoq=VzH%BV^tRtitOm)}sq5_Gx4 zc&8Uy79euw0aiB0R(4(P5%8~4htNE?ON&S!Rm2Ci2l z!7}8BQ_|Hbl8}$4Tz`u9j(X&C7$k$ONXsFdmxM11bVp50^0Y}JC@)P?ZRbz1 zLN|i`@JR6365Jhqv~E}7fw-ZkL(4w2hos((F9~}zJN3VJL_j&RT;hP7qU-z1#ugs= z#EoL{>aW+a-H3mrZCZ84inN6W_-n9(REA&p+1_vdvW|77gON>e(hiJPm)Kc+JPC4} zZ!Ao$NQIkcd9eqMtI1qf5l1Ir2mK6(j+4RB?$cC83 zr004aJ(tD(8ilrWX6wdo!lhB96bZz=#NP_Njo1;*m_&v5tHvn=dTDEgPMNqCu;Xs= z-GHA@cFZwx0DH|+v%DJgAM-V&eUs-GXDml)V3M@cRgW`AU{&_(I%;cvRYSCACP`vO zfH?EBfx)YZcpaf~&;>*s}3zpJraOC0E|uOBjG7iVy-OW(v-vD3Tqm~|z9 z9>aRT$g9si$(pkjA3)y4ij91a{~5BjR9s1F?gnS2q}TYdEvxL_yOdq01OC*AKNI?$ z2}`3+^5Col#)!P8W9w_|p`K*QPLS_KGcKa1fz9o0M=$w2eZLfQT^-aP{3{m%*`P_t z8n%|~UTj{PjMeSLq*nb0fSs&5JpdXb$zN+g)x#?PYR21Je_rgHxbi!VD`q^kvPeN0 zD#|r61h&1{PJ8YX77L}rQfp`SaYY>ukx8&h+XPhP>R|F{!LYkHL()SRa+WvoM;S>M z%hX|=;O(5|CXINnWRaR-n!)GHEgqYGnW2cZHX7F(3FH zbInnR976YurR(=&^hOerds$<^(+g3t-r7ODpzUn3cUiIXKUO+Lt4`5F^`P8gGaq*N zGJ^VL_^{RS^)#rYNwl5-swxiKgO-0+to$|v!F+x)@A3i5=?6|n6HCx0Z~~I4>%$}U zWu0zMmG8^>cELeY~TgbP>-(l08JNTA^w?3Ez(Im`ewut|t6R!|TaBRSn< zY+TXChwxS}@+BfljNP@-dTJ}!b^<9;JkZ1E8h{M`)ToZf+*AeNu86vq`C9s!cM3nl zle`jbwdGAjvydMzx3MMH%Ja*?19iU!cw+fe&FeT@fmY7NU>bQIUww6X#bSOX`>82;5b+rvOOw2tNY{QT25sWqV++!_xEes$LT!!u5KrjX5UR#+Ee*d14n2yoe99(A*$g1)B zg?@jqRvVU^I7<>@K~9zHYeYopB?7!&RXhAWYTH)M5ceOzx;rJ*AVrZ0YFAM!f(ll_ z<9Y^h4aA|Vh8db0$-TtwkShuj9nz|FSrW&8R-?=g3%Jw$|JTr)+8=#drGlxar!A(u4={)Yd=b9@T-D5Pa>ppY$ znDW6ApYw~86r##al^Vs4*_&NOPjW0d6j;a$#?ElxQXp7&G%dY104jWRS=p8$Zthlx zXDafU9#lEowH~qZ_aO~i_m-2hcZnKu-T)REfx~HZ(&pyk$sP(6DcLC|IDK=~#20Gp zL=JMuFW0jw4rYmR9rsXU=g zW+L<(6IH$1I)_F~I8#?=yi_$lC6VOZ#|f{0UOi+YTi)%dKEE<-aYyJ^?BDLeWWqN@ zK58_GE>@$%W&CsT?YB(tj&f8#UZWndvuOxPUb^KAx``(+Q(V6{0O0XF?NxJ$E@0%7 z$=@NFB$1Ao%(x4FsF>+l)Oi`tH-eP}iCM8)tbnz}w)W$}*b@dnEWaiZg~OaF{IvoV z)q-n--&S!X_OJ7ZT0}9r?MHzu$uMf^XG>1HLV~Gq3kT;c`j;_+V@+0`ts@iscJ%qy zrj#~kD97e+&n_r)5z-`=dZYSELjJ#sd33+hZp7=?ZhK)g(G1niG8zcvDBNrvFNw^9 zG@dE4etxr@Pd{oesW`Y-oWp^#-KIREtD1Py9Ealb@he0Vd>{Q~Vfr`P0Io{YWN(>I zWFu7E?~SyWZR;vn`@l|wH-Hq?${Fr)_gSM~>;~h@npHzVIY0r$)coD|ZjJ(*D8GY4 zO_*Y?uNdjI3g;AKbe;7_Go-U*J^cB=hbX`<|9P9*qzl3PPnxsGZ*O$o|*{sXifFlEw} zeZon16EuROYW++W$Jf}Oel9cOU;sPRxJ8(&`E5Mv>k!l}*^fG_*@X}4VG?0=>E?u4 znX6wc%CEj$QLq!HQ5XC>@2Oowa))J24Qg`M|%(Zn_PO(DZUPjkrHsNWpbJ?%- z^L8)P*36bCI{E4$p=!~SGoQFmD5@ey^lif^gy5K!UKNjYrDd-mUsjYxEP?Z#KRiyv z+T%zNs>R%!oVxJqHQ-K|CLw}(d0BTZynX||GX@I3!BIN9pN+Pr+bF`2fu3O^mEP^7 zYE0%9JFenUIZQaU*q*!$SwcNEW)q=Qi!SzVC(-M4$!o~Kt3FA=vvYOoS!*578GwiMByw26<6KEj=SM>zvNJxUeIfzw37H~LyUR|}$Hk{TTd;a_IA@VC%R%^ws zCA-qq14o)9QSD07-=u>uy3L9Ars2vKaWwf<191R0L!a>T2&>rd3YX2HgFRMK#f|(e z?9Yi?$Ml1QNEGBtoh6}I93$7x=f6+3b&aAA9UOi2RmE3 zq;4UmjwzJdy%~bZ_TQH2b-8*&ID-Z6LnErk8;k5b?;P(DTDL3(&AxV`}hy-^E^u5 zjM`fi^jutCb%2GEQsZ~?VH>=jF*PiEwIi?Edx&1VWd(JzEK;=vH#hc?1(NAmbUXMV ze0TgAGAp7@D=S+lvdb5?{I8by$IFz?mYy}r9Mf@F(lWSXwz<8kd~3qMBc6*}Ri)KrcZaeWe1i?4?inQ04b$41}x#YpNf!wx*;tD*)3!<3H?bniH0G0>x zBu&$&g>Hr@QEJ!nEkm($IcxY-Q0n=0A)KAAZfz*YenvI}>G zvu;Dhe=t+rBu)LB_lUYH^dNp>A zyuS$VYmwdc&K@zHC zw!*h@ME2)NID&$Te8x9Zol#d;c%Ir-Ju^JyN>;$qQKtC@;!jjcF+ib9qKjLLwIsM% zTfN|vrZXQPyOjC*`s1xX=So!w@{Qk1zalZ7Ahe^uzCEwP>UU7FG||~{(mU}k>3*Fx ziZ3hb^ALCvm5DJhIt%$ZvdMjaG2{(P1LU zCZ;y7BJL;d-=egTtgk|@v!c#`v7Xb{&VtxZ_B$M_-L{o}qnCY)(&5Y;Q2?c0(yM;) zf6hoOEeR8BS4(LaV@XE$YdUs%=2v*A(fcM%zBBgM_xkbtb)-w{lPa&)sARwq!7RCk zYNcUFiOdZxM}ddF4M3q9mi__Lrr$RfsTn>VoNT$nVfJCSAf10Q5kX(9<4OhFB~P+^ z=jtuQzZmwx8n7pW+UWKt=EMSal&7FmUkkDm{Oo$%&&$2#tQhQbxPZqHA#w?;Qga9H zIkMUf0AmZ9ys=j|Xe-uYC;TKDQhXXKq=Sw~MHXS|^FC$34job$cv2GWDq@&pPk@18 z9$KOaTRbSWc_ICAsD;6B72jitHx^(5t#}y)j#uBG464@!OFgNgW)zct#bX$qqnuJo zA_V?zwL&$aE+D-`4GEXAp%_=I74_lCFR;29ok%8Mops{yX|7C73O72M#3IlQjn%*J z4d&!4Imw!+l%}^@NRCRfPL!-sRg3pc#26Zo@P2)&&HFRHYXB z4TEW*2?~`LJYRW)ercol)t%qu#|{Y|uUD-v(Fh;uFZxS9MIqhf!cuA&C2Q_jPOtAk zpUHXAJ#b1zO3}%KE{87=XZHIm?FhLXEvtEt;~hNre9HiW`p&+ZCB>XNnfcD+lO@U({PNZ^oO-Zm$>+9(g{_@4p2Q&P1}K7 zE9{*!kGF;CY~ei?i{Rr}zbj2GgQg9G#;yh=nJx|W-YZp?h`r%F(;E5ZGFJW)?|Out zx26HfPx@MchUIU;@2+O2uKe;67FKxyNm;3gnEb{=BP**Zi7Y1j#_c`c?~>b>V-Ik{ zFVL_-c!W(Cof{Ald{?KbD}^hixuz48q=1`CFMe`9lDPNzyk2~{xvJ6Cbe(bb=qXf# z#S)wNbD&=T03b?_=ek=0@U&+-(Pn-=bb>Z_hkS%d1B$;~4|rfx2ev-z{RfCHA!Od% zO}YQvawBwjTWsG4lcb9y7#2tlApT0vls5*X%6@I2I=1>VjC^C|HOaw9brI9q5~b!? zFL5EY=}%R_Hd@w8IBCD)dnS7p6d_nFPf(v>rS=5EnjnNDc`sijpnWiwNO~PltX8_i zWsMlAYOu%<($*rMpX)e+hpv`EF$e?%q?W{;>QmV@9#4sYoJ8v&J`5+n0o#S-zl^AE zpDJ>6)M$`Y?}|we@=R0vte^3du?)Hlbol>P{zV}8=jpc(-Kh+lCb9k=7w_}dwvQ}c zMtETC&BM)8aU5UI8|QlY9l(&39^4!h@3LO;kNQ3fhHhV@}ekrPjD7x?r} zN@^dn4b;A=%>JQch&=oCC#iV)S4kC>Y4&X{bKGaAhyKX52RPs7AD&HArmns)W^&$= z5czAp-}TpwMu#fYZGTAOTlFme0n(HoHk*b2{MdIcZ;QkfeMQ9G6FHFfyWv*+VKOqk zJjv&ecD2KwrF*@5c;r2--)y7h?(I|0d!NXAyjc||#u2>$fAsz1@xkE8{ANnD(_QrA zI3n`CN`+c~b@nLee(A+OfVYduKY;${wBI5IhSw51cdAcu@6v8L?-NS@0cNJcF_>=$ zFXg``ffo@CcH6RQf2&J-{sBz>6mZps=Jk)dM{L|K=H#w1>m904DJ-Ua@e}*}ll{@X hH?Q1}bJaPf|4HE??fRja>iPMPfr>CROzq$I{|kJ~&K>{& literal 0 HcmV?d00001 diff --git a/image/cropped_Right_1753179605.jpg b/image/cropped_Right_1753179605.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce5559aadc3aeab8e78259d242bf0473c0a2d873 GIT binary patch literal 60124 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�DY^&Zp^!YZ<(=?OWMv|bS5+uHi^z_ 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/GUI.py b/utils/GUI.py index 1445fde..6dc875b 100644 --- a/utils/GUI.py +++ b/utils/GUI.py @@ -9,33 +9,44 @@ current_mode = None current_cap = None # 用于追踪当前模式和摄像头资源 +# 初始化图形界面主要的逻辑 def create_gui(): - root = tk.Tk() - root.title("Gesture Recognition") - root.geometry("800x600") - - canvas = tk.Canvas(root, width=640, height=480) - canvas.pack() - # 创建显示视频内容的画布 - - camera_button = tk.Button( - root, - text="Use Camera for Real-time Recognition", - command=lambda: switch_to_camera(canvas) - ) - camera_button.pack(pady=10) - # 启动摄像头实时识别的按钮 - - video_button = tk.Button( - root, - text="Upload Video File for Processing", - command=lambda: select_and_process_video(canvas, root) - ) - video_button.pack(pady=10) - # 上传并处理视频文件的按钮 - - root.mainloop() - + try: + print("开始创建GUI界面") + root = tk.Tk() + root.title("Gesture Recognition") + root.geometry("800x600") + print("GUI窗口创建成功") + + canvas = tk.Canvas(root, width=640, height=480) + canvas.pack() + print("画布创建成功") + + camera_button = tk.Button( + root, + text="Use Camera for Real-time Recognition", + command=lambda: switch_to_camera(canvas) + ) + camera_button.pack(pady=10) + print("摄像头按钮创建成功") + + video_button = tk.Button( + root, + text="Upload Video File for Processing", + command=lambda: select_and_process_video(canvas, root) + ) + video_button.pack(pady=10) + print("视频上传按钮创建成功") + + print("GUI界面创建完成,进入主循环") + root.mainloop() + + except Exception as e: + print(f"[ERROR] 创建GUI时发生异常: {str(e)}") + import traceback + print(traceback.format_exc()) + +# 切换到摄像头实时识别模式 def switch_to_camera(canvas): global current_mode, current_cap @@ -46,18 +57,18 @@ def switch_to_camera(canvas): canvas.delete("all") # 设置当前模式为摄像头并清空Canvas - - current_cap = cv2.VideoCapture(0) + current_cap = cv2.VideoCapture(1) + current_cap.open(0) if not current_cap.isOpened(): messagebox.showerror("Error", "Cannot open camera") current_mode = None return # 启动摄像头 - start_camera(canvas, current_cap) # 传入canvas和current_cap +# 切换到视频流处理模式 def select_and_process_video(canvas, root): global current_mode, current_cap @@ -108,5 +119,9 @@ def start_camera(canvas, cap): show_frame(canvas, cap, gesture_processor) # 启动摄像头进行实时手势识别 + + + + if __name__ == "__main__": create_gui() \ No newline at end of file diff --git a/utils/__pycache__/finger_drawer.cpython-312.pyc b/utils/__pycache__/finger_drawer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..add88ae77f1ade3a5e9b4d8799fcaeca89b7fede GIT binary patch literal 2180 zcmb7^O-vg{6o6-Uy|yvNuz+2ogg*rm3=K)4RV13W0ufR*DQTJlEuz}4JPTgHhRiO1 z)>^G94pzm%;X=OMFD2{sAp9p^|>0ET|+3xg3=;&;cTm3FhOY zVXnBBDZlB#+*BJvq~543QYNd4TB$aX={3v7dDD+Q*!!$(qp-p$wDJrXK8F!GH>3O{ z!*rYc6NLScam5oC4t(!Q!kkj>6$LhvPUm!?8XgGIn)h7uVZlxX=HLt{| zJ;itr7{Pg@^T4}x?p#8rI8hgZy>O574^ZT_LBfs(MRpJ>+syZ((?6dd~1=)H|&ta9kl%luJ^PDDcEkK}#5vTcq3)72?Vw6{7Q9 z)E(7GbXtv6P*IC3;N^)yq}=retuWO1tjt<$fvC8kVIxM}F;$z084#SjPHVLURu|=Q z=LM4uZC2I|LOG4{(M9-|;7?KyR%eZvoTP4|U~Nv<*}63yFaNyX-!t~{t&i@F=`-WT zfb!cqbI#DF^|8Xp*m*oVXP0O-Q;P}B&cKZIWaIG{w)3 zr{ybj;6|09-9UpCXn6e43N-HqE?I#~X<@IiIp@9jn-t2BwYqfgzEqnT*$uW@!Pa%f z3bySA+pS=GcE}2LZA;zhzBBB@Rb2hp-CUACml&>O0I-1jJ! zzP%p|e^>MP{(AHJ#3uK2>ghGBzH7U#d-MKw@J4#zz>BJ+Oz$`I`{4^e_`db6zm@IE zl5E@Nz}APkp^=^Nr;o%vsXC*qhR*cJh|$nwxq2a&%3v-J}0@h53DNqS|BzT zx?)LJPDkI#Js8>v4?Fx^sLhhvPW#-=eKNcg9$95MoaJ*bH}cs|c+~O9%xp`or!j@8 ztcnL6sQSXebyOA1h1zqK?KyAzA#4~LjEK}L%Lyf}$};uIa(o8QO*7pu%Ma(2>4L?t z8;YSt~)c*ycNeT|%8*r)9J!N`Lb8V#lF?+|`bj4`99#o^%vL oNH5clSk!wnpToPP4-D-2(b<(h5IBze1^NDVHF6z)ArMZ?e<`~3L;wH) literal 0 HcmV?d00001 diff --git a/utils/__pycache__/finger_drawer.cpython-38.pyc b/utils/__pycache__/finger_drawer.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7fb8b25d0fcbb85f286f6393a1c269e493b27ca GIT binary patch literal 1303 zcmZWoOHUI~6uys{>9kCF7O2ETmo`D7EQAn4OvFc`L8EcgU?yYlln#AR?py?#nV1M$ z6IO1BOBenbf56?kx-l`X+2A=tOG>?y^PM~AeCKgr?~26&fnmM;)c9=^@(X{42Zx_W zAn^i#AcD3?l{_PY34THZKW0@b=vz{;4EV`r4RLr}#h1Yv5@3@m3%Q_zoseT%wFJj# z?LCb;+o9Z$!9gf%(8<*(!psGE3=)5!gd}ta`nW-MXle_VItqF@rW@pxzF$vsilaZt zf!|7a32LP7kj+l4%$C1m(X^1*Nuf;AG36*OEMX^O!YPq?f=oe=S?VP@L7Pl|Rkn!m^PPiif#ZJjy85jj%{2XD74H$`&urne&$Xz_M#P~OBg``dvH_>$D-;ub< zL0ra|YC5M>mPRAy2hD>O63v8+z^8#PMyJd%x_BAXrhUk1!WurG#EUX z3O5&^BpymeGZ!!_ROeMAsx>=d92@jict$bb2fTB-*5gad^&VTiU9lx*l{o;DN5FG7 zQveW$wJsq`WE+MCEN<|+nsJ0_0O;ifsLM7!qroL^VQH9gY29UN+2`?#!~S|n?& zuu{}^)DD1^Ye1yGd|ww;*zWrHha05rgGi``b{b){-B1wRyQfQ0M}&udJ$nhhin@NR zq^6N(wL_32kX|(>!meugJ?+RqMEmg%A|F84=g&9Rw%$B>{c0=Tt*e7ThJM)Djyho| zA>Ebn?yzxRMXh+NUruB%Z>f8vr*S&yqPq*rjB%UdMF7G*YO!%zg3qHaU9dnvm*K-% zp)WA!y<5X?dg=eHn-yETzTXMjq3`R0@3(iwehcTG@9*sgt-i;LRiL6;J5-HbAy=V` rY{^5gf;PM(c=lPhE@d>cRG7Ro@D4@bo=FVT?!(Kn>v-v6OyaVCht)Wu literal 0 HcmV?d00001 diff --git a/utils/__pycache__/gesture_data.cpython-312.pyc b/utils/__pycache__/gesture_data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6672389025e2c717c3cf1460dde4ffeb5f5dd982 GIT binary patch literal 2269 zcmZuy%}*Ow5P!Q~Ck7USP22Ek8yjra2GpoZKT_I=ia-yENzI?Y7ShZTzsjTKcP}D*@%kOs+Ev(sB&vVrB*$4X4ktmp=)_|<~Q@^&FtIx z?a%%Fy#y}d*0-gJ%Y?i_!@Y#IayA9ZV?qh#DrA$(aU9{v3ZeWyp}uFl6P4q41f<*w%4hKK}3Ev>H7esyVb1-jZ7v`1#WqWa$(Z0I!xs4Mj3ktLM@OyE7>ThG0 zJgid-JVfW}+9U8kSdWVpNf92Uy@!1ii0fBe@3Xc7U5YM7FM-wXS(m{IdR73e0nh66 zIp|?{kj{P~7uzLLPj*@2E#a10&@KPnaYL z3KmsOuQOGy)bblDwZg8g=?c?jy}YSfp?md0L1l6mG~nozDMcqHfNHT^En2-cxK%4x zb!(u#lGd4`mupokT-M}rm8$pU0>nbj`j$0x4$#zmtxB!IbD&<{vU+u*b2J<~~KL=*s-ot`(4> zZKzM)3wyIN?_&7&YCnN^NX*o1t8PR-YYNAKF*7sU+BV{!pb<6GnU-QqevC%MoRM0K zM)X58#?8rO>s@2`qo(kv-%LoYWn=VH&mC7I@M30< z0N(b3&m(|t-v}7%-jH`ZE~#)%x8aV*)w;TU$HhALwwJ)Z?{!dDbG(m!6bR5tAj^;u z8TM@nU)1!{vO_4ye+>JTM23wqBs7L?Fr+GmWizad4WYn&EPuYDDvTk$u`v|mAS8iJ zptGN<@WIekDwp8%VFgiYvR;$zMHW}m@Z4f>u?WV8Y}^h;D$-SLZ>%#+7o5n*+9`;K z}E zj0V~XLrfek8e$U04(&L&j;BahE`4|V;P&C9A;KJ{z*;?6J%reZnY7o&3^8^T zf&`{Ce?FHu=*6ChQ-(No3>zdN#fjKiG@V4dQ_!?sfMdTD<9}Wu;TVfSlUa#lak#_R z7`UdYY^t(s^~&;Qjn*rui!u{+4nDkxV zVUP^;iqjg0MCW?9X79n0 z-l@IMu~)v0noYCj8`OAfNQQ6(cHK}f91&Q*%^QFn-URIO0I*l{ScK!7c`R`Pn`~`u zMvn2Gih(x%b~+qsiQD_^*pG!DAVd4QKCH;E8Tq#U(*aeqY`R0CbSVYPieyi4vpkcP zj-_Tgod~n^svHc2WHnW<;#|hV$|gWMO!J`$t#ZFeb8UL3p1hQ?PK(?ur;4RH7jM`A zY$0a3Z&uDIlt_x4o5eFqo$i}Z%XlmjUC6f*lkd0HK^a5lP%Wh}t;0Ay&3ADx&L(lr z{%QhCUlngmS3(E|DIQjNce7Yka?W5L>d#Xm8+<1660Gt2@y6ZV?MKg_?W$s+4{JuPX(j(`+GleqVbL6=x@I0J?Jfe39=$#Gn^7VU{ds8wdQ+JJU z9~hl8$1j1o4<8MM_0)F$02L@|ZvX%Q literal 0 HcmV?d00001 diff --git a/utils/__pycache__/hand_gesture.cpython-312.pyc b/utils/__pycache__/hand_gesture.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aee7640830f0aaccb60725288ebf5fca8c2ba151 GIT binary patch literal 3212 zcmbUjTTC3+_0I0>?(EAutk?1Sm5u{pvtUDvWW_QmHVN1`m?bf!vR5SI$<6??%r5lK ztg-2!=EEOUiqy?dNM%)}e^mU?ullne{fN{`-6?Jd-GUUUl`8&7uvDo(?YZ*+47h4~ zr8#r%Ip>~x&-32jCzCM*AV)}obIF~*<(x{2h-V-8SDorUErs-Q%S$TLvtxhPIax{k;rRazu848Fb2PLf{Rrk0FSG*5PvkES`ySR|? zCOcU`7LkIAjEsr_nR$$gK{)`BeH6^IBu$mwRCJ?;6;E%;UrSX`#{}WqSq89(j9uOe z%;_+ZxJxraE)Ai5T)NsBM%2glad%f3NuO(?vga_LLjOPw@1MK4?^-xT#OFRjd8Ux( zFjY-rlVG2yQwL(Yo*bKUd?->nxERypk%S{q{&lnO z>e!wB_lL*y>2YIL!iuO=C)BEo9 zsMR~VcJ9Lk_Rrku9axJ>yS|1ARq4d_G+4Vxy-P(7jPh>m_82C!;>CMDWQNMrR|iI& z!K*SeABHbt>_+8iSznhNn0f;t+zV3N0d+8ygQozNo$`H=>v0k8Q|F`ev6uKSkE4TRA-v96lCnk`4pIIz2S^SET^QFs>V+V)H$N|5Lz+QW@Z3iX6 z4#o`25u?@TlrQ+$-e2bAs2p4I^8SC&7?I=OO{2+-d}q5}60sv{!SBtGNw7~oQ6OlG z7CfdsnJ`!90vCiE`M?&OJw9X|-yAJ*5X-gdNw^8L+%& zj4BTelDRQl7!?Ql?~Dxe-xEh}4ZVN6|872kQ&dSvtw<9J3C*gqF-gLciaIfA5DrfB zK$Vqg62XcNj?>+Hi#i8xI7~7xoYhcg9BNWl45ef!vSTLUoGVC`ACicJbzLG!L-CwI zRq3>u3i}4;>6tQ~$<8A02Gi$q1BY*|qXem0`ad9#K1J*4SL}4Nm2S4v?N+*dxqmI) zwGjC_p0?w;wRmp*%(;cz>&>q>62jk8>H1st@lNY_=UVE`)!sj)F0TtYTexBgSDrRm zLbolvX9@3pb;%NjY+=L_M(W9RKC_tmJZ1BjEdJ8!#b^BW=V8>^xjbuk4qBaqe|i13 z#ha$xeTP>IEmL996$8H(6T85to15N4e z7&`xkw|&+U-m!%bEa8L39oTu)7K)Zor2C&;y0X-^+`C*^7N5S;5UyGLwR&Q`?^d04 z57uSzU8~=>_};IxXYFj8m2I=LJyy2I-Fs;D^3&FxVBl1`9(o=_o!xfFkkv8tmD2cd ztnu+wqkPF%DS7oR0MfkLHm8UkL(hv);RDpeFwBr#E} zOv^Q>8j&PK@rN}@b2*rHA$%3UuaL9ONjOYjC=Q?x0-g4a$LQMt8~OpWlgNioxRO)| zs-_)&Bn0ZAAJChSB=(nr`=CpBNh`{dA-Rvkr1usaS2cJZy6?lJSG%;1fkunkJxUM7 zs9A13aBsWT^x!_A(GIE8`)oVNFw9?3Y!jW^MD3gCwM~@UM6Lg1-(*gFivTz({sTfu B&Rzfj literal 0 HcmV?d00001 diff --git a/utils/__pycache__/hand_gesture.cpython-38.pyc b/utils/__pycache__/hand_gesture.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31616d2651cc1c48154009d9922621812f326ffd GIT binary patch literal 1834 zcmZt`O>Y}TbY{P8uiex!(9#|_R6>?YC2~QkDhSG#BfzPWfMAqrwRpzPI=gFkcHD$$ zEe`1q;KT(X*+>4;o{%{C&Z(F3-mKF&DzlomZ{Bu zgu^E6><0jxa2gYaeJH8Jmg4ER9>SojA^e2{Sn5#%sb%ZgLC$7PrAEr)Z+mJ&~!26ifX* z3fHa|;+UQ-*x6$Mid>PL1XLONZz@awZRO--NMV~-2Jl@@KtJuaJ!!$MqIwE;f(!$a zHV|0jOve-;9YU7qbm40$Rpv&b-J%|0dalJF8CE9Z{$E7;zMjLgD4e3LO$OSKU*bER1{|?+R&hk`^os1!V7{ZjZ_d+KyBs$Ak@>}<%7<9DSC1( z-NRU}7kY%(b*?rbbC3-(qdA?^sh!(H<2NdsoK79st}>Bw1+Q{u$PVBZH}8|7t)VmZ z;I2FKa&Jy4QI%45o4m+RjA>7J^2&;yTJGePKM1$-8bJF` z>k9(*@vYopBd_7Fcu=!5jMY(s=yIZrfPg zhvR|+7{G@0?^kV8%V@B83#0|sP}`7A#D7QpBZ==(xMMl$i7aESWD=`L7gG?!t0tj5 z%L+3VDOGqZfx+7WJcEsG?C?*m3x?h$YqryW5LJC`(1UsI#IX(n%sD6gaCU zzy|2eXFd0jnTx=b0 z#NrlHI>>2i^-J;bC`uK?(|fg1Sp7H}L*x^6EG|^h+CAtV2c4b6qt4Dx!O{MA&%fRI zvF*zm=Eshba3Bi%JmTuKa85-uI8}uQ-n@#q7!|G*86+-ax<4^F(8-duZuzRBv8L9! zP@<;<*I_bGcUr_Rn5(gk&sklGWfD-8ZsZcw(V5mVRxQ2k(CiLyvP}Sl`i4g>Y8egM zq`ujN9yN$TytkI!q%Gh&`iwLKX!i_@`t%kMiK8iy_Xlt;Y|sf6g=Ne9 z)nw|?$NXjV0S{HE$0(~Wr)EEjVUU)Sw7z_OtOTH8S!gROzG&BUcD-k19A9F4Wk~lR IKg-Yf57-Oj9{>OV literal 0 HcmV?d00001 diff --git a/utils/__pycache__/index_finger.cpython-312.pyc b/utils/__pycache__/index_finger.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a09d50edc0f2f142d76dc832647b0aee4f15372d GIT binary patch literal 8883 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 Qn;UbFqR^BUP{>{J9{`Gu^Z)<= literal 0 HcmV?d00001 diff --git a/utils/__pycache__/kalman_filter.cpython-312.pyc b/utils/__pycache__/kalman_filter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4d59099afc7069e7955e1eb11b3e2c47e4c25e9 GIT binary patch literal 2428 zcma)8-A^M`6u)=o4wUYc@=;iDqZD0>gDfgMsGE)Z#j+%Ba2I`QFq6tmq0pA@Oo_C1 z<38|E3=#H;Zek+gX$eM&|AsHy-5NF{CKyc&F(xcEn)u{7ciMq=E9^;o=G^n~n|seW zb7p?2%{^cFK|_r&|b_5Y&1{<2epR#R_veatc7GCe6vb)|iHqAB)M` z9ub!QWF$ot@8}+uWDjev2$rNpV(PqoNyD1m(8Ebf8jDO$B^CBN1|k`r3Z}3;X^U`neW@{zoZu~DyIxwTa7dP zfmFl%i8L)Cp0K2lVT4i^oww+)MMo@p)1qURsHb#`-onG1dNgc_GkVIz`}+O=jtre2 zAG>z*gK={W=dI zcO4rYj|Q$hR<34;w&kw8+_fg=<+BAjP%?gh!5X}1|Mu&}!OOHr#NI2k+WRjT>Fq-> z?!PZm?n!HS?#fL^ZnP~29?5|Rujb`9ev|`Gl-_D!+(!FG`xf2o-1;c5yjx+1kf&|L z*HeU(lL=>9zyf7H@76(B#V&_yHQ7_<4$H7<^sS=J(wY*mJ2T?YDI;XW!#Tjcoag<} zOXHIa5Ng>3oN{5|L!yYIhwTq7+YEZEK4IuuWFl$R%_X!Dyc&F<-H?nkXmn4(lvksn zPxL6)TQp?}Ghq`q>PIqOM7P$8UQ!dYk$5uQUD-r6Tuwu*ISlMB+4VGUd;EEif9-|5 zr!Ol!ak-b>i|!>Eg@(n3mA6(xD}jQmbGNBwmEB`2x9-*FTE6z(_vJ$OPe1f_KXi2) zT>w>4AIt`?PZore>XUS;Gkvti5Q&6!fVbGuY0p$ABEw+5I*)>MdDR3aE2PK$T0l|X2y60*fW_nbW=~N70Im5bPX5GjQKXOXEVLyZC;*VoX<7q zF6WH3fn4KbZ%dkn~S0>tLp8!P}H^< z_!VLFAX9*C5FX4M#lXJd4D(@P|1FRM!7H6VI9n&ZTx?=eyX}pR@U0=m=VFNz&yMA_ z=VT()Z=aqIQ5*3b!r~e2c642^clMs~Cg|`rV738+c|qwNs(HJEWfkc9c@v^~mMtXJ`m>rg$*~sD& z4{|lWfCo5o@#NEVyciE=U%|wms-7(DDm|I1>gukq>#MGQIX31q9Af3&R_ZeLohF0B z!O1-S*)0@`DM(liQ1gU0otgt|i77{kBc{ZAUK0vlu)yu%UbY&5sXPsnW|%I)cl+ ze?tsKx@VENdKQURgAd@BC{)H!AP3Znd6 zUbw%p{$%ahMz&ke--J4nQQC;pDAIA-ICI_}bhh(2$u@>gpKEoDCuN+*xs=$VESp8a zxDWnsPxvqcRX`j3UsZwDpDLe(3LH!gHOgEcV3Ug0AB0A8+c9_1z$!DkkweiH$8f@c zq2^uQb?D}3w(Tffx0+A0I>(!ER&7c32m%B`S5TR9OGhf+%uT7?QXw|~IC@WAJ%y^~ zZ(;Y!Bzzqu)^DIw<2!X*v_ec1#-*V$$kuM0=9h6H^H30f532m&`Y_K6V*aCC!f;FZ z4jSi_b110dqXFB_LONZ6%_$VO%_(f-Azey9(^CsvOIMGPqe_B!>Io88Nl+gQQqoZt z<#H&=Yq%w&l!($K{7dM9h}ED(9g&93NJ`^N+1yp_gzSoxd+jhOR`d)VPVjn`#Ca~( zq8e-Je(C_5fCt`$=UHFi8aHh>TOCWSHeNi0R%fnA-M$jL@gh{?Jt#7INKY*zd=D!8 EFX<*X-T(jq literal 0 HcmV?d00001 diff --git a/utils/__pycache__/model.cpython-312.pyc b/utils/__pycache__/model.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b25e921a4cb67d3b1637ccb2e6390c305f25052 GIT binary patch literal 1144 zcmah{J8u&~5Z-$j$Bvx{Cw|~4V2L1dCZq}tihzPw0S57CtVFBR?Z!FdJDc6Jf+HhR zq;LU6Dl1iJQTQQ9R1t-(g(4DFx+q3MqJh~v+n6+rbhGpNX7;|F&+&K^f#?t3tp8RJ z`YxS;=zXJ?1EY-yB1#1n6&2k>MBPS2+gF2%qS{al{YW|mD+mP|I{MPfz|lq&&;%7# zqHLq0CVLe1hGytu{J!auXUw!-P-YE45_twb4ZhwdP;KOa4y4>4J@DmO9$a`N*hE<3 zeQBby>~~7aky8P1i9%GO5$&VC-|q>1h7XEleQ^+#eDjB( zw$Qgsb}zOY>tyl=nS4us8}BC1wO4mmJIVQj{LNYhqm5uU;5;qm;qLs+G?o4ShQ3yt z>QiJW1w&O!}w+0tOOZ0 z4YmHb56H&_^Ci(tDtRj&1GSA#)JW)BFQtakL7_|=nus`**k;YHQ8o?{AH`;+C9mPP i6JyK4^c(B~#3Vypa&W9Eit-hue(DoS`UHXUF@FG#p!*~M literal 0 HcmV?d00001 diff --git a/utils/__pycache__/model.cpython-38.pyc b/utils/__pycache__/model.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8752477db0adc74a152598a4ee730e59c3fbfdef GIT binary patch literal 838 zcmZuv&5qMB5VoD9P5%T4BoN{Sa-a`@5LDv#fC}R0VpX!D*zLL`PS#GeuqxufUU>&N z@=87-aoSga1I)PHRSt~wO*}K1Z+`4|v)Pz{#4kP{{iTHbLZdGc7z=>A4N4M8OTy_h zBAJZNh>X54&Ln+9viKb0WLco@3j<>TaCbl{$dv>$Bs(KKl97zz8_NV327dB9H}b8` zi}%VF(9EUac>s6>aC1;C+0rfB5fSakHrmEW2xLI_H3lyW@dQo-Nq{<8K0QZ{4FKfl z!z||4T${JL5W31YN>sH}d{*Tjgy|}A1bsMutI|eD)vBV^wGl;a)>dJWxw`By$N3~s`Lt>dqzTUG_)OaT1e4*v()lsO51x$r*r{^;gV+)D`g`&C z-s<&}S1(ttUbiQ?RYIAKHcDAYzjWU1I|JtmM=IydN1qCzjc$dAfzMsV4bU+iP(~R8 z{7HwWH+q|&U;JL+-CYR214Ot2$d%YDR7 zfFn@$%HSexsD&fp7@<~5(}_h-7V%M~q|O`ND2r_b_x~7tdVgQ|0X`^)*(v)6D^SSI literal 0 HcmV?d00001 diff --git a/utils/__pycache__/process_images.cpython-312.pyc b/utils/__pycache__/process_images.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e659673cf8a5575da053d9016af55212c255c57 GIT binary patch literal 1628 zcmaJ>O>7%Q6rR~1d+Q&vG_llFEu={$SV1F*+8ioGtE6sH6q3{lRbnCr%d@f9^*q0StXz|%18}ZJ*>fGer$kxx=or$;71@_r0&lxh&hL$%@ zAmfbOahoGQHpqmIV_eD%{8wi~Tec-zXmmZZ9D0rYzuIlF%rdC>Y#$cy-T;8eSh9WP zAOLxY#frbL67{60ShfZ|z3p#wV}1_45U{VW$|29@=!^YW!LZ?XH5F*XC7_*}Z}Ud9 zxgWy0lnWnTD@!*Qmqs+9J=r%Bd1f@Oecyu6_XniR9ep( zMXDq>tm#6wKxlY+VQwLYre#bQLY#dUtUyx}qtBH=4@MXj8>7(T0Kb0u7i}f>_AO#+TNORNA8QeFIx* z1{HO-V-6&;;!N&gq5 z7nQ|eQODxRj>$~^98m}fFzVq`7FYP6&B99W> z4(>$j%a6u(lZ{t*&+d<1-b?=|9$a5(USHXdf3W}I-Thp?r52oMYNQ$>Z2H(kDf8DM zpUCM5(EviZ0xo4aA42F}DUo#%!uN-aG4c&??m0h>@LhEXXH33BTi}@hG-6Y{GmP+A%ssr;0Xx+244G1 M8ibK&fDz~Bzu)a@SO5S3 literal 0 HcmV?d00001 diff --git a/utils/__pycache__/process_images.cpython-38.pyc b/utils/__pycache__/process_images.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86160957b85add46ff3cf24bdc04bc4b81e6aae6 GIT binary patch literal 1101 zcmZuw%}*0S6rY*>=u!(YO%LKnG~D(e2ad)F0ZSplwrMfZO_NFO4DI4}TW6-AWE&6Q z&Huod(4+s-UOn~Z!IKw#Zx>8Sc**?wK4yM>U;BD_xky0lgU^G<79l^;SQPM)EjW4| zKoCJA66C)$pkT9z4XwbUq(+1#>yheFcz7+SBjXMnT>>!VoFs$; zD=^Ty&lHB!(g4!o2#^zGYHJxC{UFMP;Gg}M&pNGYv(eF`BXinSlFPUs#!{*_01mk{#raxmf&RddEF?5>5<6it8{!#DV%;NC zH*tma-d68~owyH3%!D;9zF>+k``zI(pC@%hc+fY^3&46pmA` zcVc!%(MYAsJB@=zi*MIj8?D;5vf*7&$>*1ikwe3A&2(BAPt2kGXi_VTOOTvQ^2UfLzNrhL1DTWdOoFTBaqsVwG8mR_K~_ws!0IZ#=L24z5nz9ZJsABIm=A zm_(?TIR7x|MtMZxdZ_ydxL*r^DJfhetW#sRJnC7Q$9L3SjIIC#`FC*DyX@1*?kq56 U#94*j^E`_eIBAW3;G`w?4-LBwZU6uP literal 0 HcmV?d00001 diff --git a/utils/__pycache__/video_recognition.cpython-312.pyc b/utils/__pycache__/video_recognition.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b2c033889d6366cfdb000662227914b46dce57d GIT binary patch literal 3748 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 literal 0 HcmV?d00001 diff --git a/utils/gesture_recognition.ipynb b/utils/gesture_recognition.ipynb index 9140a89..453b574 100644 --- a/utils/gesture_recognition.ipynb +++ b/utils/gesture_recognition.ipynb @@ -2,14 +2,16 @@ "cells": [ { "cell_type": "code", + "execution_count": 1, "id": "initial_id", "metadata": { - "collapsed": true, "ExecuteTime": { "end_time": "2024-09-07T05:11:28.761076Z", "start_time": "2024-09-07T05:11:22.404354Z" - } + }, + "collapsed": true }, + "outputs": [], "source": [ "import cv2\n", "import time\n", @@ -17,18 +19,19 @@ "import numpy as np\n", "from collections import deque\n", "from filterpy.kalman import KalmanFilter" - ], - "outputs": [], - "execution_count": 1 + ] }, { + "cell_type": "code", + "execution_count": 2, + "id": "40aada17ccd31fe", "metadata": { "ExecuteTime": { "end_time": "2024-09-07T05:11:28.777139Z", "start_time": "2024-09-07T05:11:28.761076Z" } }, - "cell_type": "code", + "outputs": [], "source": [ "gesture_locked = {'Left':False,'Right':False}\n", "gesture_start_time = {'Left':0,'Right':0}\n", @@ -48,19 +51,19 @@ "rect_draw_time = {'Left':0,'Right':0}\n", "last_drawn_box = {'Left':None,'Right':None}\n", "elapsed_time = {'Left':0,'Right':0}" - ], - "id": "40aada17ccd31fe", - "outputs": [], - "execution_count": 2 + ] }, { + "cell_type": "code", + "execution_count": 3, + "id": "2ee9323bb1c25cc0", "metadata": { "ExecuteTime": { "end_time": "2024-09-07T05:11:28.824573Z", "start_time": "2024-09-07T05:11:28.777139Z" } }, - "cell_type": "code", + "outputs": [], "source": [ "def clear_hand_states(detected_hand ='Both'):\n", " global gesture_locked, gesture_start_time, buffer_start_time, dragging, drag_point, buffer_duration,is_index_finger_up, trajectory,wait_time,kalman_wait_time, start_drag_time, rect_draw_time, last_drawn_box, wait_box, elapsed_time\n", @@ -86,19 +89,19 @@ " last_drawn_box[h] = None\n", " elapsed_time[h] = 0\n", " # 清空没被检测的手" - ], - "id": "2ee9323bb1c25cc0", - "outputs": [], - "execution_count": 3 + ] }, { + "cell_type": "code", + "execution_count": 4, + "id": "96cf431d2562e7d", "metadata": { "ExecuteTime": { "end_time": "2024-09-07T05:11:28.855831Z", "start_time": "2024-09-07T05:11:28.824573Z" } }, - "cell_type": "code", + "outputs": [], "source": [ "kalman_filters = {\n", " 'Left': KalmanFilter(dim_x=4, dim_z=2),\n", @@ -127,19 +130,19 @@ " kf.x = np.array([x, y, 0., 0.])\n", " kf.P *= 1000.\n", " # 重置" - ], - "id": "96cf431d2562e7d", - "outputs": [], - "execution_count": 4 + ] }, { + "cell_type": "code", + "execution_count": 5, + "id": "edc274b7ed495122", "metadata": { "ExecuteTime": { "end_time": "2024-09-07T05:11:28.887346Z", "start_time": "2024-09-07T05:11:28.855831Z" } }, - "cell_type": "code", + "outputs": [], "source": [ "\n", "mp_hands = mediapipe.solutions.hands\n", @@ -154,19 +157,19 @@ "\n", "mp_drawing = mediapipe.solutions.drawing_utils\n", "clear_hand_states()" - ], - "id": "edc274b7ed495122", - "outputs": [], - "execution_count": 5 + ] }, { + "cell_type": "code", + "execution_count": null, + "id": "51ff809ecaf1f899", "metadata": { "ExecuteTime": { "end_time": "2024-09-07T05:11:28.934274Z", "start_time": "2024-09-07T05:11:28.887346Z" } }, - "cell_type": "code", + "outputs": [], "source": [ "def process_image(image):\n", "\n", @@ -256,7 +259,7 @@ " contour = np.array(trajectory[temp_handness], dtype=np.int32)\n", " rect = cv2.minAreaRect(contour)\n", " box = cv2.boxPoints(rect)\n", - " box = np.int0(box)\n", + " box = np.int64(box)\n", " rect_draw_time[temp_handness] = time.time()\n", " last_drawn_box[temp_handness] = box\n", " # 如果指向操作结束 轨迹列表有至少四个点的时候\n", @@ -334,19 +337,53 @@ " # 如果没检测到手就清空全部信息\n", " \n", " return image" - ], - "id": "51ff809ecaf1f899", - "outputs": [], - "execution_count": 6 + ] }, { + "cell_type": "code", + "execution_count": null, + "id": "b7ce23e80ed36041", "metadata": { "ExecuteTime": { "end_time": "2024-09-07T05:19:32.248575Z", "start_time": "2024-09-07T05:11:28.934663Z" } }, - "cell_type": "code", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\25055\\AppData\\Local\\Temp\\ipykernel_4200\\752492595.py:89: DeprecationWarning: `np.int0` is a deprecated alias for `np.intp`. (Deprecated NumPy 1.24)\n", + " box = np.int0(box)\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[7], line 10\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCamera Error\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 8\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[1;32m---> 10\u001b[0m frame \u001b[38;5;241m=\u001b[39m \u001b[43mprocess_image\u001b[49m\u001b[43m(\u001b[49m\u001b[43mframe\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 11\u001b[0m cv2\u001b[38;5;241m.\u001b[39mimshow(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mVideo\u001b[39m\u001b[38;5;124m'\u001b[39m, frame)\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m cv2\u001b[38;5;241m.\u001b[39mwaitKey(\u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m&\u001b[39m \u001b[38;5;241m0xFF\u001b[39m \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mord\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mq\u001b[39m\u001b[38;5;124m'\u001b[39m):\n", + "Cell \u001b[1;32mIn[6], line 9\u001b[0m, in \u001b[0;36mprocess_image\u001b[1;34m(image)\u001b[0m\n\u001b[0;32m 6\u001b[0m image \u001b[38;5;241m=\u001b[39m cv2\u001b[38;5;241m.\u001b[39mcvtColor(image, cv2\u001b[38;5;241m.\u001b[39mCOLOR_BGR2RGB)\n\u001b[0;32m 7\u001b[0m \u001b[38;5;66;03m# 预处理帧\u001b[39;00m\n\u001b[1;32m----> 9\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[43mhands\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprocess\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimage\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m results\u001b[38;5;241m.\u001b[39mmulti_hand_landmarks:\n\u001b[0;32m 12\u001b[0m \u001b[38;5;66;03m# 如果检测到手\u001b[39;00m\n\u001b[0;32m 14\u001b[0m handness_str \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m\n", + "File \u001b[1;32md:\\app-install-dict\\Anaconda3\\envs\\software_engineering\\lib\\site-packages\\mediapipe\\python\\solutions\\hands.py:153\u001b[0m, in \u001b[0;36mHands.process\u001b[1;34m(self, image)\u001b[0m\n\u001b[0;32m 132\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mprocess\u001b[39m(\u001b[38;5;28mself\u001b[39m, image: np\u001b[38;5;241m.\u001b[39mndarray) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m NamedTuple:\n\u001b[0;32m 133\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Processes an RGB image and returns the hand landmarks and handedness of each detected hand.\u001b[39;00m\n\u001b[0;32m 134\u001b[0m \n\u001b[0;32m 135\u001b[0m \u001b[38;5;124;03m Args:\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 150\u001b[0m \u001b[38;5;124;03m right hand) of the detected hand.\u001b[39;00m\n\u001b[0;32m 151\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 153\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprocess\u001b[49m\u001b[43m(\u001b[49m\u001b[43minput_data\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mimage\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mimage\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32md:\\app-install-dict\\Anaconda3\\envs\\software_engineering\\lib\\site-packages\\mediapipe\\python\\solution_base.py:335\u001b[0m, in \u001b[0;36mSolutionBase.process\u001b[1;34m(self, input_data)\u001b[0m\n\u001b[0;32m 329\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 330\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_graph\u001b[38;5;241m.\u001b[39madd_packet_to_input_stream(\n\u001b[0;32m 331\u001b[0m stream\u001b[38;5;241m=\u001b[39mstream_name,\n\u001b[0;32m 332\u001b[0m packet\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_make_packet(input_stream_type,\n\u001b[0;32m 333\u001b[0m data)\u001b[38;5;241m.\u001b[39mat(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_simulated_timestamp))\n\u001b[1;32m--> 335\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_graph\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait_until_idle\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 336\u001b[0m \u001b[38;5;66;03m# Create a NamedTuple object where the field names are mapping to the graph\u001b[39;00m\n\u001b[0;32m 337\u001b[0m \u001b[38;5;66;03m# output stream names.\u001b[39;00m\n\u001b[0;32m 338\u001b[0m solution_outputs \u001b[38;5;241m=\u001b[39m collections\u001b[38;5;241m.\u001b[39mnamedtuple(\n\u001b[0;32m 339\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSolutionOutputs\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_output_stream_type_info\u001b[38;5;241m.\u001b[39mkeys())\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " + ] + }, + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m在当前单元格或上一个单元格中执行代码时 Kernel 崩溃。\n", + "\u001b[1;31m请查看单元格中的代码,以确定故障的可能原因。\n", + "\u001b[1;31m单击此处了解详细信息。\n", + "\u001b[1;31m有关更多详细信息,请查看 Jupyter log。" + ] + } + ], "source": [ "cap = cv2.VideoCapture(1)\n", "cap.open(0)\n", @@ -365,37 +402,34 @@ " \n", "cap.release()\n", "cv2.destroyAllWindows() " - ], - "id": "b7ce23e80ed36041", - "outputs": [], - "execution_count": 7 + ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, - "source": "", - "id": "10fca4bc34a944ea" + "id": "10fca4bc34a944ea", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "software_engineering", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" + "pygments_lexer": "ipython3", + "version": "3.8.20" } }, "nbformat": 4, diff --git a/utils/hand_gesture.py b/utils/hand_gesture.py index 69e6bc2..454c93a 100644 --- a/utils/hand_gesture.py +++ b/utils/hand_gesture.py @@ -3,7 +3,7 @@ from model import HandTracker from index_finger import IndexFingerHandler from gesture_data import HandState from kalman_filter import KalmanHandler -from utils.finger_drawer import FingerDrawer +from finger_drawer import FingerDrawer class HandGestureHandler: def __init__(self): diff --git a/utils/index_finger.py b/utils/index_finger.py index 0c6bfed..281d50c 100644 --- a/utils/index_finger.py +++ b/utils/index_finger.py @@ -78,7 +78,7 @@ class IndexFingerHandler: contour = np.array(self.hand_state.trajectory[temp_handness], dtype=np.int32) rect = cv2.minAreaRect(contour) box = cv2.boxPoints(rect) - box = np.int0(box) + box = np.int64(box) # 当拖拽点数大于4时则计算最小外接矩形 self.hand_state.rect_draw_time[temp_handness] = time.time() self.hand_state.last_drawn_box[temp_handness] = box diff --git a/utils/main.py b/utils/main.py deleted file mode 100644 index 48b719e..0000000 --- a/utils/main.py +++ /dev/null @@ -1,278 +0,0 @@ -import cv2 -import time -import mediapipe -import numpy as np -from collections import deque -from filterpy.kalman import KalmanFilter - -gesture_locked = {'Left':False,'Right':False} -gesture_start_time = {'Left':0,'Right':0} -buffer_start_time = {'Left':0,'Right':0} -start_drag_time = {'Left':0,'Right':0} -dragging = {'Left':False,'Right':False} -drag_point = {'Left':(0, 0),'Right':(0, 0)} -buffer_duration = {'Left':0.25,'Right':0.25} -is_index_finger_up = {'Left':False,'Right':False} -index_finger_second = {'Left':0,'Right':0} -index_finger_tip = {'Left':0,'Right':0} -trajectory = {'Left':[],'Right':[]} -square_queue = deque() -wait_time = 1.5 -kalman_wait_time = 0.5 -wait_box = 2 -rect_draw_time = {'Left':0,'Right':0} -last_drawn_box = {'Left':None,'Right':None} -elapsed_time = {'Left':0,'Right':0} - -def clear_hand_states(detected_hand ='Both'): - global gesture_locked, gesture_start_time, buffer_start_time, dragging, drag_point, buffer_duration,is_index_finger_up, trajectory,wait_time,kalman_wait_time, start_drag_time, rect_draw_time, last_drawn_box, wait_box, elapsed_time - - hands_to_clear = {'Left', 'Right'} - if detected_hand == 'Both': - hands_to_clear = hands_to_clear - else: - hands_to_clear -= {detected_hand} - # 反向判断左右手 - - for h in hands_to_clear: - gesture_locked[h] = False - gesture_start_time[h] = 0 - buffer_start_time[h] = 0 - dragging[h] = False - drag_point[h] = (0, 0) - buffer_duration[h] = 0.25 - is_index_finger_up[h] = False - trajectory[h].clear() - start_drag_time[h] = 0 - rect_draw_time[h] = 0 - last_drawn_box[h] = None - elapsed_time[h] = 0 - # 清空没被检测的手 - -kalman_filters = { - 'Left': KalmanFilter(dim_x=4, dim_z=2), - 'Right': KalmanFilter(dim_x=4, dim_z=2) -} - -for key in kalman_filters: - kalman_filters[key].x = np.array([0., 0., 0., 0.]) - kalman_filters[key].F = np.array([[1, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]) - # 状态转移矩阵 - kalman_filters[key].H = np.array([[1, 0, 0, 0], [0, 1, 0, 0]]) - # 观测矩阵 - kalman_filters[key].P *= 1000. - kalman_filters[key].R = 3 - kalman_filters[key].Q = np.eye(4) * 0.01 - -def kalman_filter_point(hand_label, x, y): - kf = kalman_filters[hand_label] - kf.predict() - kf.update([x, y]) - # 更新状态 - return (kf.x[0], kf.x[1]) - -def reset_kalman_filter(hand_label, x, y): - kf = kalman_filters[hand_label] - kf.x = np.array([x, y, 0., 0.]) - kf.P *= 1000. - # 重置 - -mp_hands = mediapipe.solutions.hands - -hands = mp_hands.Hands( - static_image_mode=False, - max_num_hands=2, - # 一只更稳定 - min_detection_confidence=0.5, - min_tracking_confidence=0.5 -) - -mp_drawing = mediapipe.solutions.drawing_utils -clear_hand_states() - -def process_image(image): - - start_time = time.time() - height, width = image.shape[:2] - image = cv2.flip(image, 1) - image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) - # 预处理帧 - - results = hands.process(image) - - if results.multi_hand_landmarks: - # 如果检测到手 - - handness_str = '' - index_finger_tip_str = '' - - if len(results.multi_hand_landmarks) == 1: - clear_hand_states(detected_hand = results.multi_handedness[0].classification[0].label) - # 如果只有一只手 则清空另一只手的数据 避免后续冲突导致不稳定 - - for hand_idx in range(len(results.multi_hand_landmarks)): - - hand_21 = results.multi_hand_landmarks[hand_idx] - mp_drawing.draw_landmarks(image, hand_21, mp_hands.HAND_CONNECTIONS) - - temp_handness = results.multi_handedness[hand_idx].classification[0].label - handness_str += '{}:{}, '.format(hand_idx, temp_handness) - is_index_finger_up[temp_handness] = False - # 先设置为false 防止放下被错误更新为竖起 - - cz0 = hand_21.landmark[0].z - index_finger_second[temp_handness] = hand_21.landmark[7] - index_finger_tip[temp_handness] = hand_21.landmark[8] - # 食指指尖和第一个关节 - - index_x, index_y = int(index_finger_tip[temp_handness].x * width), int(index_finger_tip[temp_handness].y * height) - - if all(index_finger_second[temp_handness].y < hand_21.landmark[i].y for i in range(21) if i not in [7, 8]) and index_finger_tip[temp_handness].y < index_finger_second[temp_handness].y: - is_index_finger_up[temp_handness] = True - # 如果指尖和第二个关节高度大于整只手所有关节点 则视为执行“指向”操作 - - if is_index_finger_up[temp_handness]: - if not gesture_locked[temp_handness]: - if gesture_start_time[temp_handness] == 0: - gesture_start_time[temp_handness] = time.time() - # 记录食指抬起的时间 - elif time.time() - gesture_start_time[temp_handness] > wait_time: - dragging[temp_handness] = True - gesture_locked[temp_handness] = True - drag_point[temp_handness] = (index_x, index_y) - # 如果食指抬起的时间大于预设的等待时间则视为执行“指向”操作 - buffer_start_time[temp_handness] = 0 - # 检测到食指竖起就刷新缓冲时间 - else: - if buffer_start_time[temp_handness] == 0: - buffer_start_time[temp_handness] = time.time() - elif time.time() - buffer_start_time[temp_handness] > buffer_duration[temp_handness]: - gesture_start_time[temp_handness] = 0 - gesture_locked[temp_handness] = False - dragging[temp_handness] = False - # 如果缓冲时间大于设定 就证明已经结束指向操作 - # 这样可以防止某一帧识别有误导致指向操作被错误清除 - - if dragging[temp_handness]: - - if start_drag_time[temp_handness] == 0: - start_drag_time[temp_handness] = time.time() - reset_kalman_filter(temp_handness, index_x, index_y) - # 每次画线的时候初始化滤波器 - - smooth_x, smooth_y = kalman_filter_point(temp_handness, index_x, index_y) - drag_point[temp_handness] = (index_x, index_y) - index_finger_radius = max(int(10 * (1 + (cz0 - index_finger_tip[temp_handness].z) * 5)), 0) - cv2.circle(image, drag_point[temp_handness], index_finger_radius, (0, 0, 255), -1) - # 根据离掌根的深度距离来构建一个圆 - # 用来显示已经开始指向操作 - # 和下方构建的深度点位对应 直接用倍数 - drag_point_smooth = (smooth_x, smooth_y) - - if time.time() - start_drag_time[temp_handness] > kalman_wait_time: - trajectory[temp_handness].append(drag_point_smooth) - # 因为kalman滤波器初始化的时候会很不稳定 前几帧通常会有较为严重的噪声 - # 所以直接等待前几帧运行完成之后再将点位加到轨迹列表中 - else: - if len(trajectory[temp_handness]) > 4: - contour = np.array(trajectory[temp_handness], dtype=np.int32) - rect = cv2.minAreaRect(contour) - box = cv2.boxPoints(rect) - box = np.int0(box) - rect_draw_time[temp_handness] = time.time() - last_drawn_box[temp_handness] = box - # 如果指向操作结束 轨迹列表有至少四个点的时候 - # 使用最小包围图形将画的不规则图案调整为一个矩形 - - start_drag_time[temp_handness] = 0 - trajectory[temp_handness].clear() - - for i in range(1, len(trajectory[temp_handness])): - - pt1 = (int(trajectory[temp_handness][i-1][0]), int(trajectory[temp_handness][i-1][1])) - pt2 = (int(trajectory[temp_handness][i][0]), int(trajectory[temp_handness][i][1])) - cv2.line(image, pt1, pt2, (0, 0, 255), 2) - # 绘制连接轨迹点的线 - - if last_drawn_box[temp_handness] is not None: - elapsed_time[temp_handness] = time.time() - rect_draw_time[temp_handness] - - if elapsed_time[temp_handness] < wait_box: - cv2.drawContours(image, [last_drawn_box[temp_handness]], 0, (0, 255, 0), 2) - # 将矩形框保留一段时间 否则一帧太快 无法看清效果 - - elif elapsed_time[temp_handness] >= wait_box - 0.1: - - box = last_drawn_box[temp_handness] - x_min = max(0, min(box[:, 0])) - y_min = max(0, min(box[:, 1])) - x_max = min(image.shape[1], max(box[:, 0])) - y_max = min(image.shape[0], max(box[:, 1])) - cropped_image = image[y_min:y_max, x_min:x_max] - filename = f"../image/cropped_{temp_handness}_{int(time.time())}.jpg" - cv2.imwrite(filename, cropped_image) - last_drawn_box[temp_handness] = None - # 不能直接剪裁画完的图像 可能会错误的将手剪裁进去 - # 等待一段时间 有一个给手缓冲移动走的时间再将这一帧里的矩形提取出来 - - for i in range(21): - - cx = int(hand_21.landmark[i].x * width) - cy = int(hand_21.landmark[i].y * height) - cz = hand_21.landmark[i].z - depth_z = cz0 - cz - radius = max(int(6 * (1 + depth_z*5)), 0) - - if i == 0: - image = cv2.circle(image, (cx, cy), radius, (255, 255, 0), thickness=-1) - if i == 8: - image = cv2.circle(image, (cx, cy), radius, (255, 165, 0), thickness=-1) - index_finger_tip_str += '{}:{:.2f}, '.format(hand_idx, depth_z) - if i in [1,5,9,13,17]: - image = cv2.circle(image, (cx, cy), radius, (0, 0, 255), thickness=-1) - if i in [2,6,10,14,18]: - image = cv2.circle(image, (cx, cy), radius, (75, 0, 130), thickness=-1) - if i in [3,7,11,15,19]: - image = cv2.circle(image, (cx, cy), radius, (238, 130, 238), thickness=-1) - if i in [4,12,16,20]: - image = cv2.circle(image, (cx, cy), radius, (0, 255, 255), thickness=-1) - # 提取出每一个关节点 赋予对应的颜色和根据掌根的深度 - - scaler= 1 - image = cv2.putText(image,handness_str, (25*scaler, 100*scaler), cv2.FONT_HERSHEY_SIMPLEX, 1.25*scaler, (0,0,255), 2,) - image = cv2.putText(image,index_finger_tip_str, (25*scaler, 150*scaler), cv2.FONT_HERSHEY_SIMPLEX, 1.25*scaler, (0,0,255), 2,) - - spend_time = time.time() - start_time - if spend_time > 0: - FPS = 1.0 / spend_time - else: - FPS = 0 - - image = cv2.putText(image,'FPS '+str(int(FPS)),(25*scaler,50*scaler),cv2.FONT_HERSHEY_SIMPLEX,1.25*scaler,(0,0,255),2,) - # 显示FPS 检测到的手和食指指尖对于掌根的深度值 - - else: - clear_hand_states() - # 如果没检测到手就清空全部信息 - - return image - -######################################## - -cap = cv2.VideoCapture(1) -cap.open(0) - -while cap.isOpened(): - success, frame = cap.read() - if not success: - print("Camera Error") - break - - frame = process_image(frame) - cv2.imshow('Video', frame) - - if cv2.waitKey(1) & 0xFF == ord('q'): - break - -cap.release() -cv2.destroyAllWindows() \ No newline at end of file