From 0ba215a1d5fa4f275a0fadb88a888e4b2108abd1 Mon Sep 17 00:00:00 2001 From: jingna <1264204245@qq.com> Date: Thu, 14 Aug 2025 11:17:26 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B6=B3=E9=83=A8?= =?UTF-8?q?=E7=99=BE=E5=88=86=E6=AF=94=E5=AE=BD=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/renderer/src/views/Detection.vue | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/renderer/src/views/Detection.vue b/frontend/src/renderer/src/views/Detection.vue index f3212390..25ef488a 100644 --- a/frontend/src/renderer/src/views/Detection.vue +++ b/frontend/src/renderer/src/views/Detection.vue @@ -179,12 +179,12 @@
`&^y;uohtKNccz()wuGH((e9Km8 zxf%NSuhz@y`a^nI(cy9(-loI%boc`uzO2LaH!mOP{k^WkPxbn}I^2?`*E@XlTGmNx zbQ%s7Yh_k41*QeGX?U9s9Xc%4VVdm!6e1K(dOAO^_1CaKmq%w@dWTjX)Zv&;m(u0f zufxIXHM*(zO-(J1rZ#*M)FcH$LB@)1xH#R~;MQPhd(h$UX!eISQXzq8ABi;Wa0LC^ z9c}*LW@!smZ1Xoup@>5Yg&b|6;AUM~HvSzMe3!K&ef0(;EY9?#zcIu4kKyK-eT=$~ zr_|9RHiX7D+{D^&ilQgo4$JXpKIJsI{{@e&e)4>zyTDzluqRe_@p^G`NE82GfRaA1 zQ@a||qT;%zzI^vmrGUcFtGM{qLrDe&av!UP2=d=2! zwvT4;O!K0)#GCjaCVb|TjT*;A>d9~28Td@Td%$-Lb%-GsJXA+*>B$@q(WjpR%5>u2 zlxOvtnl*!$UA<&Od~fa7<=eZiaPNDc`mMfk %T4L7@x_Apbd&m-gLHFs zgO}OF=cY`23+ikM5N#uH^nH_tYexiyUUABG1Ez7#(o$wC!M=PP*MSc^@wq3MYcxAr zP$j+>rEgG60`$$NQ&=6nlPRKhrKQcS2%`mMjG3uiy&A7Gs;j7(131S7ZY|;5lj(44 zkIl^_oJX{+pNtc98z$lE1zqE0oS@q>3D+R#!oWc#x_k|St`j)AZAgC`OMd);AzgMx zNH)YLM)R-HIJbq`q;^sYtq(2ZZJl5G(wAB`(P}b!qppXD)a>+BiN41s;qDZDGrY(a z`Xagpjm|s?r_tGfD>b734()qeH$LVVC3!^I*?}x8b?Z34{!K1={VLID^F^a%j{!$( zmyW|%#)wP6Wz6eR!qGmf#57K)c|kpV6LsltgUL@j(`BfMVwkW6VIGkvs@M>459XlF zrl=^hM%V(4L;r4=zLN$Ddd2s_&Qe$t%D{CR#&JS!!vANF0oPwSWm%<$JR{3nn#1zS za>53qff>JoI7M(J{NyS#%Ws*<@*6BHf9VXC{|#H%4PR)0Zc)vO?ndTbBxBwn=DNPD z6rSZa@6Q@FPRq(FVsqx_u-OJX%N;ePvcp;RPh)-GgLd=HS LckMzY~MkogSsQ*eg4*=#Ow#!b*qUY5|;e2bA;TFj!o8$-VZ$t&7J4U@{4K+qA- zOuQjCo8_*|Zp^}*&tGC@OFl3%`y11lMalzDGaCdC!{v;9OXoSc41S YOmO#R%9uC*nQQdcAEv^6QYodfA8ky&3gX z-kMQAjqH7?m0cdWbSOVOyD>eshe7i|Azmnh4?!Wr>a2Q$HHTR-1}ny3Et?)TOf#@) zWQ%4aGe?YJSW&4)gZiZ=X1xS7b`!>Ykl77AEQj<%_PTT$vy|o3lOE|IDD+nfI46(I zfv)DjR_8#6bI{kEGW!tG(PP6)XL=eDOQ$}h&lK>=l)7x-9|Z1Vb!i^7m!K!TkDzs< zQ}0Vu;KznU@splRy3`aps!#99GU*zL!IURGo{lLpr^(Xo_qsJbA-pq68&GaT>O`Wr z(TT7_vE^|<`u49I_}?H6BE5~2UB&RgMp-s9vWskFN?O|5CgFWI`z3Fa pc@3v44gZIE+2OSoxnLVaMuIZ2pp}Y>F3uR zIrMR{XC3J2`Ro0SricIE?{BhLYq&k?i$yp2Hv1)Ci?Cr|TOcaYpG=L{Mf^=IzE PM{DTa4L8Xi|S zTiI?cPg0K)+-CAs2U~nCA>XD*sHvs7DJuDzB%icJ=)m8B0kS7dBzlW4(8Aa+_58h| zK#<=5iC$wt!M|?Jy6XBROSJ*RpnSgSjt&uOcvG;Y%^z9H*aBcNZr}I~QCei|kEYf% zhr&B(Uk*OLXxQHzXbm*`wrH#<@)3KX)7pvarkhy1zdh=Q)P*`fX-C+P;kJg-J?Znk zu6p&_+ZsG|wUF4iL`)LP#A%p(=G)}o90+O(@pmw`nMwXgdmxBF%9b&3-qzF>Xz_)c z$X-z83qm#MEf|XUrC0=7!U&pidxop8EjT5%i;FbIRxn@Gzs1)YXro3Hs|!FE3bqC| z$0B}Tun9J@-PaV^ybZ4tsh@xpKu=#9ukr`C1tOtfyFZB0E}cXX3ewE^q^3=6h{Ma7 zFM=^dsUN+jH5P0Z_j8yJe}}(0Ci&A +tshbWyI~^l^F#X9 zh#$Q*g#*Ry(c ;|;1=7l=r)rna>~bPFr(HLVS5hSD-_8>@t(v1XXo z_@&RRc4T3Ztd2z@&?+tou);;zcTElH8Be3wSF=4)y%375@;8yJ^$~xRCZh{=HU3Sp z&71v^G;X!=j+j5Pquw8B4Mp0Ug3TBiG~ yKSlBoM5|HeD!minYnQU)> zQmdjEl%H~}&`=YI(sXOY-oU0vQ)EXqY%R({*|fN8# UlX29iop5PsNz5#Hj zo+tQqJ^wAh50KsfPl8T|#)n|Jo+r2qiTc_NXq~U+ZGev={Tgiv9?|gxKh*PMfMp9b z`lW!kB9Tt;evsX#<2wNdbv(g0ufqL2cq)KxPK@U!4SuH(<3^tT9}cIHQpgVh=3lMx zC-^4PAn*#{7Z&2Yhx|^!hmgqr307W%@dCdQ@Q3(7@dM v{C{*XO^D1`Oie z1j1tH z@wYcci`xUukx(?$Dit?}+HY)%wwG*Mve1D|X`mIy$90*#ftACtT#Ce^k_U$xo!f%H zz|FNlv_s1%juw%Cv_mfg6Y+mBhF<(F^^w3f>|QtfqvMsC)wSYOf?<38+x%_#W&ppH z3!9>z;I`0Ke`KK}7N}~b?Rn+G)~2?of1zXXIG^Q xpx(B;Yb`N!rb+hl8 uzgP5#`w{-g;3LW-qmPU|!oJVy5tqQDe1GHqJ^Oq1U)afCG5@b>;6DIB_ns&K literal 0 HcmV?d00001 diff --git a/backend/testcamera.py b/backend/testcamera.py index d71e229c..263025dc 100644 --- a/backend/testcamera.py +++ b/backend/testcamera.py @@ -30,7 +30,7 @@ class CameraViewer: if __name__ == "__main__": # 修改这里的数字可以切换不同摄像头设备 - viewer = CameraViewer(device_index=0) + viewer = CameraViewer(device_index=3) viewer.start_stream() # import ctypes diff --git a/backend/tests/SMiTSenseUsbWrapper.dll b/backend/tests/SMiTSenseUsbWrapper.dll new file mode 100644 index 0000000000000000000000000000000000000000..04eb4e48a87e2a8a555e52e8525772641def850b GIT binary patch literal 18944 zcmeHv4Rl-8mF|%(*@_cI3bDWe(kMYDhG56BQgCog Bh^oFB-&OZC>v(G+z@AGr7sk?I@%VvxjkyMqj9zc5B;`cxQF&h}0 zIq%?1_QbTK^Lq^5qw^cK1fq^`B(yow)b40*3I;=xW0T(zi3J^jprhvYHIDXBi@(HT z$#d$gAH3tbubnDgc{-i`z>l9kiSpNKZ$5QYz*VQ77qIHoYXVlEdKqxwuIf{-0@`b< z1^!fN_33{@d3Nosr%nsFQiuO?S}VInd3B(93-vX1Wc9U-wcMY>4s3mBOS*29EpSZF znmLy_fVob??k@ziiF_x9ujR8C%Mqvv$o2t2O2w1S8bPWxN`ni_8m83E*eKdKsu bQAdry>HG-IIvHyKXmAMk5;o|w*)+-#kdrP}|Ac*uQd@3^Z^YpDNn`3^Hrn*3 !1zp`L9!eqJLU2*Wj(~>@ I9<=7}1o+m*7eKm5M+KCiQg%H`GrmTM6$tp`l=2>fh- zHy`ghEalOtij)yEa8H_YQMEf|-TeqDDOvpe8er$)hszCMBU|1 iL$qrJm$|bEEb8OO$9Toywi!xw9yOTzaW$bo z^ =W*1pM~{y3TkLk2xPi&b#%`<(}l< zm_6B_R9g=iOIj1P$9N+4BGOw(f9CP~3T#~V*&^_g6+HftEjr6;%jNyGf3~8zbyn?* zBY(ri2+-MmTz;R&e`n KK%17{@kt|oro2)iKe=m~hqxEdWFA~soh9~ZR3vuMf zRg7T>H6=wnS$7QMI9qLfvZmzPJ+ wKm;}yrF7P#MfSY7}mBURg0prcl5w5VTq-s#?CZNIWI8`TTo zc;ImvF-R`I#B~CWtQ@q1I{P)An0qza^*~nk6tu+dH$9B9au{0+*mv1Ss_K;oyh+mr zAY3PS0+G4S$`f#G*I@)VhiZR;f YRsV9O1G(iyF$uyv==e*(v3Zq_d=@Sdbqe R02_nxT2<9+2kSv|xn`eQ%UhL4rRt<9Zk zA03wl<6paumK2XX%H_8` w3G|E= zwJtRs2p5kB!hfYo3~-JSP(;Dx21LO>4nfUhBXd-H5siZ;El>Fn!GOyrN3uQgYh3=r zEy)>C&!QJvYnI& JuD8*-l7f)E6dtH^L@Nrdh`8}`vu2A?ejTri^Cv{_s1O5RsUvv#N5jM}FnWS|Y z`;1RC1=9>@+C4z+gmynA?S86jcfUZ-SaG3h@2485_BXWFT%g(l)qWJ=Kv(TQi1p|s z)|gkk@-sX+W2<-3Z(S!SXxxEqjz_)}%BquBnMqUKP%<<{g!1n_^6zLHgHd2eq$;7H zs(bDkz8?K6Accmee>h1)WQ@@BA1)=&zBwNhlOIwKww`Uy0`eP&=1KBP9{F8(nnzZ+ ze4Z@A^}p}N@WBD)i?sDg8bdr$K_a__Hz$qTX$QuITVo6ebQJtl`_Cria?@-&_-_!j z>A8 Q_F!*VF|bX{+H_BH`7~Z} zo?BO*cfC@Fd0D}e`509y9R=)lvRjWssq~g|yO##=IGltw@`<@OqA%>eO$(^^ichyk zc{ZF&6}t?m_IB(tj%~X~=_460nEK09`-$0N>Q!kv9e*AYLpiDKi0A&UoJIu6(a*CY zPXkJro}oOHb5EaAf%WT%^7;4mSsjnB>MYfMJN)P%t;Dbx t@tpFUMJyS!DgRsKX@qZ)WOw1P_>n5* zC 36mn_yHePv{oFE20{p2A8pqc9al^=2 zNGaOhpta3az5=ErbCh`~V=gvmLKw?ZBe}{QC_IkCA(~Pf*I}g+kpahuZ)^P0ynLYB zor+PTOO(}GAy@GrGxAPGd*udTlrsG2NNNwW!rGI0CUbb?bBO6U*2=@mKCDqVHC-D2 z$Pk+a*TgC-AH{JN`$$X(onJQK{2}64DOrCxS-qRI<{Q3$2F)z=bgN(@+2EX`P!kPk z_yJTZ|BN4SHz{3$bYh%Iy*#`d8O;uG(EBkOcOCu}bik}NeS1v*h_bR0bE(`7GF=1t zO1)N?27T2cJM#A4iPL`iOw&lyg(J=8_&LM&dzBwy5-^iRU9ZHPkn$E{{1VPn5RRl? zP36O)ER{gZu2yTv^b-Uj9v@K2Vdj7Uw!8p9_>Wdx1n`XM!^MmlgvMb>Pa#+^}Pi^qx-^`uV*@fY3s78f>;BhrS(8n zK2P3JfRhrkIS8$t-sFsDId;sRisMp&e9H`PMQ fyWbU%()zK8n=oPJ-5 N#U1h77t5;%`MNN||;M+mFdZ{s|U zVgZa$_Z^8A6)aF ln!+pRIuRLB1q_yj}`0Y3K zqCh6C6rkJPDd~3QhZvi(ntpcR2M4fA&^r`Gn>3|W^T=zIUxFvd9jJeu?g5gPUjQg> z)c2d(z?8PW?lKh axp1~ZU K@-cbg-GQXR$TH`GVGfci|+6(4bBqXW8`Qq`%S;p zb3Jee#qvoa zgd^3S3wPx5FUG*srPjg+k_~i2_dC^Yry7iP8IQL(%OQc6ZtYNun*~x!DW;E*Vf|Wx zrpKY$KZj;&e_YMl`E!~)-#y|Mo5!1MU}5TnEc!*UUt}RHT@*teF3!iw35tnH`_G_n z4bh946>|?a(XVA~u9WMrwYx^{t#!RpBR^NQYcweN+p2cGd$T_ntC3I0qprhMxHYPs zK49&x+Vx%_==UUy&f4kELP(>0j%GE{;G7Yw=W)wbMUc2~bcJfIOywAuR8-lRlf|U@ zm0<#xn;t*+G5pT4-N~OaV18(Zxb=Iz(fk_Ow50@5C_Z4QNto_Nb|e?L24s3D;?yMh zM-`(xuO?a1dyPz%ZA|xVJ^06I(Y)H}y=XfhP5MoLyHK0|nuO)6$XXA+m2ZuIofsu7 z+kyC%xK5cH*6OZ^?f}J=(J0s(26^x64nBR5V^j{ZM8|@@8~bAGWz$Mf#|O;)rX|Q= zU&<1u#mH5i>2pZs@c~D_sQ^V<_7kQ{k?R4~V9ix0Ybs903Ir$T(DI>}C2l!;HR5$* z?!N<&hZRx4l;CLbr)}ceL %x>3qFC@5?ath)xN5|&-h6J68|2_leH zJr7c^!mqpbket_&ShCgvfwvLixE|+AH(&!9ifVrq14Y!PhyZ?AVR^E4)cP%Gq{hjq z)6*cJ-rTDFWn>Y5XJ9*HPV#K!HzMXf vi^LdSYcbgbp_J8&Qe zq6{wt<*&-RUn~B51Q%Y>7n6A0Uw{tkaP%!BK5{M2m$kU8zY-;!zm`zmtmTt+4y{c0 z<#Me9&2Tyya&Q;&u38&+_421MHF&`3DimB3U14j~i>UTnCv~zBi|<*Oqv@wqL`1z? zoDnEk;~uGUaW0e-%fb5x=z3y@L+{)QNpQ9BpHP9gkhIuQ9v&dQCrxvZ$Mort_U>;% z6dpG_l{d8v?mB4y1)A>&T6kRgo!H#jVw+Mq17PG5E@zXiKm;Srdc4ofD_)BXYikGO z#m!)5+qY(t0F^@knQaG1qZet5sX3w+p2rx}!l%XWlj8SL@%s Q!f$(JLR9W>?8>b6s=2@$5-&_Ho`k;Jxa&r@8MIIp4 0Om6_ zhHR@e9e3-7?D){AH+#VALN|x+8eZ})ojJvx220)+8&8B`WF7jR(<6TY0=-v97jeT7 z3(E`6aJbbsDs7lGxz^}xJ#$i6LG2Z(s 8--6dyN0rBfH;AQu z{2-UH$x{oX2pwu+48Np){h2s#t3zpACd{ZWJU^)^Pwp*({)V4;n^vT~4$7NHuv3M< zz0GBV>+r5}OhC%|tzNkoehIvA!ngO z_{&fuA{0e*Z_@HAT6*Q$u)G$la9yMF`l!aK6g_JX%{^}RiXk)(QP$mGfxx(+DMVRm z#2ApDMRnt^l(0{*0YSGnQ(te<#mv?d<>||rD=%_6vn?0 7M`(H%{{>7TKN z&_m};%4_~e5^C~U{Dj0k)*8qfpgdkHj=y5mFQu;(?-uDDW5)YM^f!z8Q@)EE4y`kL zMrV|t=uGb~UMWZhdoXb)n`9BQK$(pH(VbvFyZYPbgP)L~eMdv$oPPWJ=7 ze5nr4>-aZyctVFy= `&^y;uohtKNccz()wuGH((e9Km8 zxf%NSuhz@y`a^nI(cy9(-loI%boc`uzO2LaH!mOP{k^WkPxbn}I^2?`*E@XlTGmNx zbQ%s7Yh_k41*QeGX?U9s9Xc%4VVdm!6e1K(dOAO^_1CaKmq%w@dWTjX)Zv&;m(u0f zufxIXHM*(zO-(J1rZ#*M)FcH$LB@)1xH#R~;MQPhd(h$UX!eISQXzq8ABi;Wa0LC^ z9c}*LW@!smZ1Xoup@>5Yg&b|6;AUM~HvSzMe3!K&ef0(;EY9?#zcIu4kKyK-eT=$~ zr_|9RHiX7D+{D^&ilQgo4$JXpKIJsI{{@e&e)4>zyTDzluqRe_@p^G`NE82GfRaA1 zQ@a||qT;%zzI^vmrGUcFtGM{qLrDe&av!UP2=d=2! zwvT4;O!K0)#GCjaCVb|TjT*;A>d9~28Td@Td%$-Lb%-GsJXA+*>B$@q(WjpR%5>u2 zlxOvtnl*!$UA<&Od~fa7<=eZiaPNDc`mMfk %T4L7@x_Apbd&m-gLHFs zgO}OF=cY`23+ikM5N#uH^nH_tYexiyUUABG1Ez7#(o$wC!M=PP*MSc^@wq3MYcxAr zP$j+>rEgG60`$$NQ&=6nlPRKhrKQcS2%`mMjG3uiy&A7Gs;j7(131S7ZY|;5lj(44 zkIl^_oJX{+pNtc98z$lE1zqE0oS@q>3D+R#!oWc#x_k|St`j)AZAgC`OMd);AzgMx zNH)YLM)R-HIJbq`q;^sYtq(2ZZJl5G(wAB`(P}b!qppXD)a>+BiN41s;qDZDGrY(a z`Xagpjm|s?r_tGfD>b734()qeH$LVVC3!^I*?}x8b?Z34{!K1={VLID^F^a%j{!$( zmyW|%#)wP6Wz6eR!qGmf#57K)c|kpV6LsltgUL@j(`BfMVwkW6VIGkvs@M>459XlF zrl=^hM%V(4L;r4=zLN$Ddd2s_&Qe$t%D{CR#&JS!!vANF0oPwSWm%<$JR{3nn#1zS za>53qff>JoI7M(J{NyS#%Ws*<@*6BHf9VXC{|#H%4PR)0Zc)vO?ndTbBxBwn=DNPD z6rSZa@6Q@FPRq(FVsqx_u-OJX%N;ePvcp;RPh)-GgLd=HS LckMzY~MkogSsQ*eg4*=#Ow#!b*qUY5|;e2bA;TFj!o8$-VZ$t&7J4U@{4K+qA- zOuQjCo8_*|Zp^}*&tGC@OFl3%`y11lMalzDGaCdC!{v;9OXoSc41S YOmO#R%9uC*nQQdcAEv^6QYodfA8ky&3gX z-kMQAjqH7?m0cdWbSOVOyD>eshe7i|Azmnh4?!Wr>a2Q$HHTR-1}ny3Et?)TOf#@) zWQ%4aGe?YJSW&4)gZiZ=X1xS7b`!>Ykl77AEQj<%_PTT$vy|o3lOE|IDD+nfI46(I zfv)DjR_8#6bI{kEGW!tG(PP6)XL=eDOQ$}h&lK>=l)7x-9|Z1Vb!i^7m!K!TkDzs< zQ}0Vu;KznU@splRy3`aps!#99GU*zL!IURGo{lLpr^(Xo_qsJbA-pq68&GaT>O`Wr z(TT7_vE^|<`u49I_}?H6BE5~2UB&RgMp-s9vWskFN?O|5CgFWI`z3Fa pc@3v44gZIE+2OSoxnLVaMuIZ2pp}Y>F3uR zIrMR{XC3J2`Ro0SricIE?{BhLYq&k?i$yp2Hv1)Ci?Cr|TOcaYpG=L{Mf^=IzE PM{DTa4L8Xi|S zTiI?cPg0K)+-CAs2U~nCA>XD*sHvs7DJuDzB%icJ=)m8B0kS7dBzlW4(8Aa+_58h| zK#<=5iC$wt!M|?Jy6XBROSJ*RpnSgSjt&uOcvG;Y%^z9H*aBcNZr}I~QCei|kEYf% zhr&B(Uk*OLXxQHzXbm*`wrH#<@)3KX)7pvarkhy1zdh=Q)P*`fX-C+P;kJg-J?Znk zu6p&_+ZsG|wUF4iL`)LP#A%p(=G)}o90+O(@pmw`nMwXgdmxBF%9b&3-qzF>Xz_)c z$X-z83qm#MEf|XUrC0=7!U&pidxop8EjT5%i;FbIRxn@Gzs1)YXro3Hs|!FE3bqC| z$0B}Tun9J@-PaV^ybZ4tsh@xpKu=#9ukr`C1tOtfyFZB0E}cXX3ewE^q^3=6h{Ma7 zFM=^dsUN+jH5P0Z_j8yJe}}(0Ci&A +tshbWyI~^l^F#X9 zh#$Q*g#*Ry(c ;|;1=7l=r)rna>~bPFr(HLVS5hSD-_8>@t(v1XXo z_@&RRc4T3Ztd2z@&?+tou);;zcTElH8Be3wSF=4)y%375@;8yJ^$~xRCZh{=HU3Sp z&71v^G;X!=j+j5Pquw8B4Mp0Ug3TBiG~ yKSlBoM5|HeD!minYnQU)> zQmdjEl%H~}&`=YI(sXOY-oU0vQ)EXqY%R({*|fN8# UlX29iop5PsNz5#Hj zo+tQqJ^wAh50KsfPl8T|#)n|Jo+r2qiTc_NXq~U+ZGev={Tgiv9?|gxKh*PMfMp9b z`lW!kB9Tt;evsX#<2wNdbv(g0ufqL2cq)KxPK@U!4SuH(<3^tT9}cIHQpgVh=3lMx zC-^4PAn*#{7Z&2Yhx|^!hmgqr307W%@dCdQ@Q3(7@dM v{C{*XO^D1`Oie z1j1tH z@wYcci`xUukx(?$Dit?}+HY)%wwG*Mve1D|X`mIy$90*#ftACtT#Ce^k_U$xo!f%H zz|FNlv_s1%juw%Cv_mfg6Y+mBhF<(F^^w3f>|QtfqvMsC)wSYOf?<38+x%_#W&ppH z3!9>z;I`0Ke`KK}7N}~b?Rn+G)~2?of1zXXIG^Q xpx(B;Yb`N!rb+hl8 uzgP5#`w{-g;3LW-qmPU|!oJVy5tqQDe1GHqJ^Oq1U)afCG5@b>;6DIB_ns&K literal 0 HcmV?d00001 diff --git a/backend/tests/smitsense_demo.py b/backend/tests/smitsense_demo.py deleted file mode 100644 index d2a508fa..00000000 --- a/backend/tests/smitsense_demo.py +++ /dev/null @@ -1,194 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -SMiTSense足部压力传感器简单演示程序 -展示如何使用SMiTSenseUsb-F3.0.dll进行基本的压力数据采集 -""" - -import sys -import os -import time -from test_smitsense_dll import SMiTSensePressureSensor - -def simple_pressure_monitor(): - """ - 简单的压力监控演示 - """ - print("SMiTSense足部压力传感器演示") - print("=" * 40) - - # 创建传感器实例 - sensor = SMiTSensePressureSensor() - - try: - # 初始化 - print("正在初始化传感器...") - if not sensor.initialize(): - print("❌ 初始化失败") - return - - # 查找设备 - print("正在查找设备...") - devices = sensor.get_device_list() - if not devices: - print("❌ 未找到SMiTSense设备") - print("请检查:") - print("1. 设备是否正确连接") - print("2. 驱动程序是否已安装") - print("3. 设备是否被其他程序占用") - return - - print(f"✅ 找到 {len(devices)} 个设备") - - # 连接第一个设备 - print("正在连接设备...") - if not sensor.connect(devices[0]): - print("❌ 连接失败") - return - - print("✅ 设备连接成功") - - # 获取灵敏度 - sensitivity = sensor.get_sensitivity() - if sensitivity is not None: - print(f"当前灵敏度: {sensitivity}") - - # 开始监控压力数据 - print("\n开始压力监控(按Ctrl+C停止)...") - print("-" * 60) - print("时间\t\t左前\t左后\t右前\t右后\t总压力") - print("-" * 60) - - count = 0 - while True: - # 读取压力数据 - pressure_data = sensor.read_pressure_data() - - if pressure_data: - # 转换为足部区域数据 - foot_zones = sensor.get_foot_pressure_zones(pressure_data) - - if foot_zones: - timestamp = time.strftime("%H:%M:%S") - print(f"{timestamp}\t{foot_zones['left_front']:.1f}\t" - f"{foot_zones['left_rear']:.1f}\t" - f"{foot_zones['right_front']:.1f}\t" - f"{foot_zones['right_rear']:.1f}\t" - f"{foot_zones['total_pressure']:.1f}") - - # 简单的平衡分析 - if foot_zones['total_pressure'] > 10: # 有压力时才分析 - left_ratio = foot_zones['left_total'] / foot_zones['total_pressure'] - if left_ratio < 0.4: - balance_status = "右倾" - elif left_ratio > 0.6: - balance_status = "左倾" - else: - balance_status = "平衡" - - if count % 10 == 0: # 每10次显示一次平衡状态 - print(f"\t\t\t\t\t\t\t平衡状态: {balance_status}") - else: - print(f"{time.strftime('%H:%M:%S')}\t数据处理失败") - else: - print(f"{time.strftime('%H:%M:%S')}\t无数据") - - count += 1 - time.sleep(0.2) # 5Hz采样率 - - except KeyboardInterrupt: - print("\n\n用户停止监控") - except Exception as e: - print(f"\n❌ 监控过程中发生错误: {e}") - finally: - # 断开连接 - print("正在断开设备连接...") - sensor.disconnect() - print("✅ 设备已断开") - -def test_dll_availability(): - """ - 测试DLL文件是否可用 - """ - print("检查DLL文件可用性...") - - dll_path = os.path.join(os.path.dirname(__file__), 'SMiTSenseUsb-F3.0.dll') - - if not os.path.exists(dll_path): - print(f"❌ DLL文件不存在: {dll_path}") - return False - - try: - sensor = SMiTSensePressureSensor(dll_path) - print("✅ DLL文件加载成功") - - # 测试基本函数调用 - result = sensor.initialize() - print(f"✅ 初始化函数调用成功,返回值: {result}") - - return True - except Exception as e: - print(f"❌ DLL测试失败: {e}") - return False - -def show_usage(): - """ - 显示使用说明 - """ - print(""" -SMiTSense足部压力传感器使用说明 -================================= - -1. 硬件准备: - - 确保SMiTSense足部压力传感器已正确连接到USB端口 - - 安装相应的设备驱动程序 - - 确保设备未被其他程序占用 - -2. 软件准备: - - 确保SMiTSenseUsb-F3.0.dll文件在当前目录中 - - 安装Python 3.6+ - - 确保ctypes库可用(Python标准库) - -3. 运行程序: - python smitsense_demo.py - -4. 功能说明: - - 自动检测并连接SMiTSense设备 - - 实时显示足部各区域压力数据 - - 简单的平衡状态分析 - - 支持Ctrl+C安全退出 - -5. 数据说明: - - 左前/左后/右前/右后:对应足部四个区域的压力值 - - 总压力:所有传感器压力值的总和 - - 平衡状态:基于左右脚压力分布的简单分析 - -6. 故障排除: - - 如果提示"未找到设备",请检查硬件连接和驱动 - - 如果提示"DLL加载失败",请检查DLL文件路径 - - 如果数据异常,请检查传感器校准状态 - -7. 集成到现有系统: - - 可以将SMiTSensePressureSensor类集成到device_manager.py中 - - 替换现有的MockPressureDevice模拟设备 - - 实现真实的压力传感器数据采集 -""") - -if __name__ == "__main__": - if len(sys.argv) > 1 and sys.argv[1] == "--help": - show_usage() - sys.exit(0) - - print("SMiTSense足部压力传感器演示程序") - print("使用 --help 参数查看详细使用说明") - print() - - # 首先测试DLL可用性 - if not test_dll_availability(): - print("\n请检查DLL文件和依赖项后重试") - sys.exit(1) - - print() - - # 运行压力监控演示 - simple_pressure_monitor() \ No newline at end of file diff --git a/backend/tests/testsmit.py b/backend/tests/testsmit.py new file mode 100644 index 00000000..d6a9757e --- /dev/null +++ b/backend/tests/testsmit.py @@ -0,0 +1,85 @@ +import ctypes +import time +import numpy as np +import cv2 + +# === DLL 加载 === +dll = ctypes.WinDLL(r"D:\BodyBalanceEvaluation\backend\tests\SMiTSenseUsbWrapper.dll") + +dll.SMiTSenseUsb_Init.argtypes = [ctypes.c_int] +dll.SMiTSenseUsb_Init.restype = ctypes.c_int + +dll.SMiTSenseUsb_ScanDevices.argtypes = [ctypes.POINTER(ctypes.c_int)] +dll.SMiTSenseUsb_ScanDevices.restype = ctypes.c_int + +dll.SMiTSenseUsb_OpenAndStart.argtypes = [ + ctypes.c_int, + ctypes.POINTER(ctypes.c_uint16), + ctypes.POINTER(ctypes.c_uint16) +] +dll.SMiTSenseUsb_OpenAndStart.restype = ctypes.c_int + +dll.SMiTSenseUsb_GetLatestFrame.argtypes = [ + ctypes.POINTER(ctypes.c_uint16), + ctypes.c_int +] +dll.SMiTSenseUsb_GetLatestFrame.restype = ctypes.c_int + +dll.SMiTSenseUsb_StopAndClose.argtypes = [] +dll.SMiTSenseUsb_StopAndClose.restype = ctypes.c_int + +# === 初始化设备 === +ret = dll.SMiTSenseUsb_Init(0) +if ret != 0: + raise RuntimeError(f"Init failed: {ret}") + +count = ctypes.c_int() +ret = dll.SMiTSenseUsb_ScanDevices(ctypes.byref(count)) +if ret != 0 or count.value == 0: + raise RuntimeError("No devices found") + +rows = ctypes.c_uint16() +cols = ctypes.c_uint16() +ret = dll.SMiTSenseUsb_OpenAndStart(0, ctypes.byref(rows), ctypes.byref(cols)) +if ret != 0: + raise RuntimeError("OpenAndStart failed") + +rows, cols = rows.value, cols.value +frame_size = rows * cols +buf_type = ctypes.c_uint16 * frame_size +buf = buf_type() + +print(f"实时采集: {rows} 行 x {cols} 列") + +# 固定映射范围(和原来 matplotlib 一样) +vmin, vmax = 0, 1000 + +try: + while True: + ret = dll.SMiTSenseUsb_GetLatestFrame(buf, frame_size) + if ret == 0: + data = np.frombuffer(buf, dtype=np.uint16).reshape((rows, cols)) + + # 固定范围映射到 0-255 + norm_data = np.clip((data - vmin) / (vmax - vmin) * 255, 0, 255).astype(np.uint8) + + # 颜色映射(jet) + heatmap = cv2.applyColorMap(norm_data, cv2.COLORMAP_JET) + + # 放大显示(保持 nearest 效果) + heatmap = cv2.resize(heatmap, (cols * 4, rows * 4), interpolation=cv2.INTER_NEAREST) + + # 显示 + cv2.imshow("SMiTSense 足底压力分布", heatmap) + + if cv2.waitKey(1) & 0xFF == 27: # ESC 退出 + break + else: + print("读取数据帧失败") + time.sleep(0.05) # 20 FPS +except KeyboardInterrupt: + pass +finally: + dll.SMiTSenseUsb_StopAndClose() + cv2.destroyAllWindows() + print("设备已关闭") diff --git a/config.ini b/config.ini index 691600d7..1f8f5e91 100644 --- a/config.ini +++ b/config.ini @@ -19,7 +19,7 @@ camera_index = 0 camera_width = 640 camera_height = 480 camera_fps = 30 -imu_port = COM3 +imu_port = COM8 pressure_port = COM4 [DETECTION] diff --git a/frontend/src/renderer/src/views/Detection.vue b/frontend/src/renderer/src/views/Detection.vue index 5b4ebadd..ca0b37f6 100644 --- a/frontend/src/renderer/src/views/Detection.vue +++ b/frontend/src/renderer/src/views/Detection.vue @@ -204,16 +204,16 @@