From 0d54c9c73c6ada5467f358fe6bc8a4c32b1489bf Mon Sep 17 00:00:00 2001 From: zara Date: Fri, 7 Jun 2024 11:26:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=9A=E7=82=B9=E6=A0=A1?= =?UTF-8?q?=E6=AD=A3=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + CMakeLists.txt | 35 +++++---- CMakeLists.txt.user | 8 +- logo.ico | Bin 8976 -> 24957 bytes mainwindow.cpp | 30 +++++++- mainwindow.h | 14 ++++ mainwindow.ui | 128 ++++++++++++++++++-------------- menu5.cpp | 32 ++++++++ menu5.h | 33 +++++++++ menu5.ui | 42 +++++++++++ multipoint.cpp | 177 ++++++++++++++++++++++++++++++++++++++++++++ multipoint.h | 60 +++++++++++++++ readme.txt | 5 ++ twopoint.cpp | 100 ++++++++++++++++++++++++- twopoint.h | 28 +++++++ 15 files changed, 614 insertions(+), 80 deletions(-) create mode 100644 .gitignore create mode 100644 menu5.cpp create mode 100644 menu5.h create mode 100644 menu5.ui create mode 100644 multipoint.cpp create mode 100644 multipoint.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c8c3d6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vs/ +out/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index c49dda3..8a60f85 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.5) -set(PROJECT_VERSION 1.4.1.2) +set(PROJECT_VERSION 1.4.2.0) add_definitions(-DProjectVersion=\"${PROJECT_VERSION}\") project(zxrcClient VERSION ${PROJECT_VERSION} LANGUAGES CXX) @@ -76,6 +76,9 @@ set(PROJECT_SOURCES menu4.cpp menu4.h menu4.ui + menu5.cpp + menu5.h + menu5.ui usbcontrol.cpp usbcontrol.h usbthread.cpp @@ -85,6 +88,8 @@ set(PROJECT_SOURCES datathread.h qt5app.rc.in ${CMAKE_CURRENT_BINARY_DIR}/qt5app.rc + multipoint.cpp + multipoint.h ) ### @@ -93,13 +98,13 @@ set(PROJECT_SOURCES ###1为用户所用上位机, 隐藏部分功能 ###2为zxj02所用上位机,算法在上位机实现. -add_executable (zxrcClient WIN32 ${PROJECT_SOURCES}) -target_include_directories (zxrcClient PRIVATE ${INCLUDE_DIRS}) -target_link_directories (zxrcClient PRIVATE ${LIB_DIRS}) -target_link_libraries (zxrcClient PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) -target_link_libraries (zxrcClient PRIVATE QFluentWidgets::Widgets ${LIBS}) -target_link_libraries (zxrcClient PRIVATE ${OpenCV_LIBS}) -target_compile_definitions (zxrcClient PRIVATE CLIENT=0) +#add_executable (zxrcClient WIN32 ${PROJECT_SOURCES}) +#target_include_directories (zxrcClient PRIVATE ${INCLUDE_DIRS}) +#target_link_directories (zxrcClient PRIVATE ${LIB_DIRS}) +#target_link_libraries (zxrcClient PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) +#target_link_libraries (zxrcClient PRIVATE QFluentWidgets::Widgets ${LIBS}) +#target_link_libraries (zxrcClient PRIVATE ${OpenCV_LIBS}) +#target_compile_definitions (zxrcClient PRIVATE CLIENT=0) #add_executable (zxrcClientSim WIN32 ${PROJECT_SOURCES}) @@ -126,10 +131,10 @@ set(LOCALALGO twopoint.h ) -#add_executable (zxrcClientPC WIN32 ${LOCALALGO} ${PROJECT_SOURCES}) -#target_include_directories (zxrcClientPC PRIVATE ${INCLUDE_DIRS}) -#target_link_directories (zxrcClientPC PRIVATE ${LIB_DIRS}) -#target_link_libraries (zxrcClientPC PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) -#target_link_libraries (zxrcClientPC PRIVATE QFluentWidgets::Widgets ${LIBS}) -#target_link_libraries (zxrcClientPC PRIVATE ${OpenCV_LIBS}) -#target_compile_definitions (zxrcClientPC PRIVATE CLIENT=2) +add_executable (zxrcClientPC WIN32 ${LOCALALGO} ${PROJECT_SOURCES}) +target_include_directories (zxrcClientPC PRIVATE ${INCLUDE_DIRS}) +target_link_directories (zxrcClientPC PRIVATE ${LIB_DIRS}) +target_link_libraries (zxrcClientPC PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) +target_link_libraries (zxrcClientPC PRIVATE QFluentWidgets::Widgets ${LIBS}) +target_link_libraries (zxrcClientPC PRIVATE ${OpenCV_LIBS}) +target_compile_definitions (zxrcClientPC PRIVATE CLIENT=2) diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user index d9ceb8e..f20f2e2 100644 --- a/CMakeLists.txt.user +++ b/CMakeLists.txt.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -407,9 +407,9 @@ 2 false - zxrcClient - CMakeProjectManager.CMakeRunConfiguration.zxrcClient - zxrcClient + zxrcClientPC + CMakeProjectManager.CMakeRunConfiguration.zxrcClientPC + zxrcClientPC true true true diff --git a/logo.ico b/logo.ico index 25cd869b5ab84f93beed8d91ac17ea2cf3a40316..90d996b4a8a1556caddf530030c748b78f5c151d 100644 GIT binary patch literal 24957 zcmV+3Kq0>X009620Pg?*0000W0B2zU02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|?*IS+ z00;&E003JRAzA?m5r% z`{T})R?GICof%2@{dz4cc4qFqbMJZ1bDrls1&D}|a8 zh=_xdKmgm+s$|lvN+yi}dLjZTfLevZF;Xer1}H>=UC~4jXFo##N+YG3lUrzcCc^~q zQ15GNYg2QtTiY-_-c=hHTa)X~1Bf9GAcs7%_4T5Jx4(wEzV|(Hb00*8IbTYzPHv&) zndMAqAM#ug5!v&wg#acc1nzPoy`EBC7P5(Xg6gQo&#@rfLIS4XpC+yVPiyo# zz>z%Q>%{-=Na)|b<~DQhL?;SKd`+^B=EP{vu(Zk3~qx36Y)(?K&9*U=m?NWNH-9 z1^5E5qbHX5|IUB%zIDNSQhKn1Euwf-)POjcScRl%MaBZa?-!kY#ms!qKi5Gm^VuQG z><9!Q(Ny7&NC1I|Q$(glEA+AWzKQ+(wM5Mq-}>mP7YpxE(NenjRQAX?04Zo&AwbfL z&s;D&Z@*F{xyy`W^fS3&Weip3%bW-zB1{BbrxbcXJM&6?^%phx`hRwI`m2&j)0)XR zL`&(S5eaVzDGXqXHc_iO&iF))%YC6nT%wB|0}4d6KML&|U=e2&=^9e#)_7#QihpFq z`Za$f0RIZ8_DBmCg-Ccy1Fb?*w<2SIH-FjuX7+#BBy@I$mjLQ}oUi_1_^{bxWvkHlrFbDL&DK~;PMQG<#Dy9Ga$rr!TB-s!5I|pXthz>k$ zI}##d>y>a1YEk1TU_qz+uw+8Sdj^Bx%ARAmK@QYy{XFC zS$zykM5f%=Rw)QX2x1$I_O<~(JNxO!|3*X<3ci7IU*G;hB)ml=^rGId;GCtiY}ajZ z_M7?{j>sHT_U+gph&bD1wAmu^^K+hg{M{0)1S0_+Bhj+CNOTkgw`2aY`7>?TZ87JX z`k5S&iUfB^1Vk`9t@URDSKl}Hl%Ek1BdXvrW}=%^1j6vY8(Pjha%NBOJqh;bL>hPO zh=@PUDDO3xZ!CX$?I)sbq_Gic-boTVS~^p_+Zp~!uZSz~cI2*KLm$iQ6Rh}^9gETwlL-M&_+;Z}= z`K`!UL0dFNhatK#6Qm=R(yf_{y?y=}m(OdV^1p4# zs}pH#h-ym@Lv&LnK$t{-)9L5Vp1EV^qlS4#4k8K%MpjU{5nMRsnH5r7i}>LvYBXXDJ1KJw75J%|E0_94<1(gnu_4Es;HT(EhmW6SEB+yqH1gJi7ZW_s)1zkJ8NC2l(spwu0Ai5djU_mNH?Esry zJFaOUnVAz7M9bwVLxFU+bFPv5KXBv8XD&{q(;O|I_Yw`fG17sQPNmcQyOYnFU(faf zJ=Qrz6b+;)grJCp5GQ5odUt=7070tUS5-Mg!aG({L3e@LZ1X`idS0#(ot3C_zgT9`v){IDVJ_f`<0- z1pr84{(f`qQ%NMe;~?Spel8J=`3kOnC<2Ish=qs)01u!lA~o>G3wIhsoB&oT_&X6u z_p^2NBxl?)@AUHt?UC(^Xsc*c!a7vfEjWMPY=7Gm5T{5=-fd)5f_5Zu1emyHc%)$= z=m|Ow?Sx<}Ls)|#AT7$xGC+MTX=q{e3nM4OBua#6O8Os71_4~HQhFQQ9j(u-yD%!` z9%;#+0U<=cgFLN&->;n$IW|T`mE!-6E&x9Hr~~njrZezZJv)Sqw2KM3LrsceNO^( zFFUCbI``&9EsF@?jsvh{?s%xE*|pMWD-;O7w&k)JNA$e(Y_&t9AGFb|i2EiGX8>KT z6?z4)_G$W`{#f<3m#n*g{cxS`hvVw2+Y*1%x$10fd;ZRIa#cNvx09_9RK^(=I!(Gy^scP&{^RwA zh99h4bNi0M>p|n|nKK3Hbg*#V`%&6+jNpB0d1j^zYzVe$aq?s@+xO`N@^8}&WLYZZ zdrLxudX>Dk$(uHJ<%UcT_Vyk==!k@O1VXzibNu2vn~2WsbHXTdy=4JJfu&X}wTrx4 zHrLdBqXhzMK8Z2m=*%)yC7C zjQ6&S*FX51gIW7l#B!(-X)6fsO-oiB69>-jV+Wz~-Y*733t*I1n<@60GdHeXaaCu~ zeLw(e&1CE(`T)sFq#XfH03}H2i`L(N`yZQ{Pv2?e`bHfy5V2)faim0xNZj>b1pv!u z&Mf;Sm5WGthhcd#sQ^&CYs*EoiedtGK?A??z<_wdqP4=-c+ES`-T3fVI{@7VsMbuz z7BgU<04Ai}s$|l9a?R~K&f56cRj+IQW}PvHM9Qk=1knBLDCW$CHzY5cK|xdUgK`BK z3GXm0&tw>YB!n*)0hFk+CA0`29w4F(ZHaqVUi`!#f3>!y#ajuusqDDdn#tHUKy`@d zvm`GBiYXpC*!bUFYWtO*MT<(D1}0f+$p>EbIImB`XO3z$^d z?v)a8F-2;JN&MX|7mfEfXXvS1!cqte?FLZq?)i0$#eJN3-j z6vTucblNu(-XYkU$pit+%AMr|R1Qa#0MJ5`BQ2Y2sz10g-JVY)5Ta6FOUTNC6YGj6 zA6&Of>+jSWPb-!(ET4&lg{!ow_Ofm<0N^0Bdk?xVJO*eb;M$UHMmwIH50q}n$0rF~ zmC<^)RyVHf{NsIL`JGZ<$6&(c^XB7f|G(|9n>~W&@+_Y@MnE0AQvhJ~L1_0z!aImi zt-Y!Df!P|E?O0HbB^ePYCt~BK`tt%1(xtwFp&>w4CzI+OH)Xcvwf;f1)6*VX-3FX_P$`QybfM`;t z&vAcGRl`jL$m$?qq@q}zOez7$D*b;#1QIU!veiPMg{RNR?VJVx*F?e_0RYB}9RYEW z5<8j+;206|q&8f+_KueYps9?ankcI?874q>*2Es_W_CoPOSyC=fLKIgFv`!-GyqtD zR3y9yGoj;yEYDylP^tBaK(r>X!Q+5nbuwA@RJ@_MrXZ-@wHN-Gi8jSh`syMCum@5N ziW*CO?n)pM-r*1{0#%lU7zrT{T3`AzkDY>zss1L@p0!Gz*NRYTud_hJkOC3U1c2t` z!L?m5D7g4iLWMm1{`|1- zzyWLrmp{3>G*BBr3sNa+-m-;)rE!`^idG_VUcsq~Qa*nHDIbiya<2ox*8O1r(h2QS zL_xid5{e2H>Vr5v>@J!V{-eT)W_e~g1MLSy&!YoYcm*J&QVMB+kaq2WAiZy-!+)P~ zd0nigpWk)I9le7;uZUQrJd-wyz=thq^1)NbP-ri;23E++nr1Zc*2rEhlg)>SYJY=9?;<4INpLn7ea!gDR5>RPXFCZLLWgkEX zpjQH}*?-|DkIy@$rF-tl&x^u_ypBDgSwGoz?DVJUrknZ#fewUuRWfO|W@bty1;dQS z0U^ACHU(@TLfWBF&**ojoPX#vmpup0zrg$Tsi%Y8G1ZC^9ub%XmKh`hC+Hh=I07I_ zsXk&Z!+b2FiJ>x9Xa`WnVYn7|Qt`VbeCy(&-IyUhv; zBJ7baOhDD<+&PGNoTZP81OZ?W zWI;L3K2{3VM&w5=msQ)|myY!Vy;bVn3+00$><{VOV=et~PyjRtCS20{BJ48+@P!Db zo_Uehc2T^y`yU>fd&)z;*4MrokN=t;OK$~&W%zoa;)Hm=+A8WmN(a8*wENbFzZG9S zf9YS{cf!f{Hu!yiY!v*RCp^8|TG!3wn6(hJ79xY7667%IGrrINtuE{pI>j$5NZ=GH zAwp0-GmMpGsZ>fAszg-Wc1IdP0>^A@J2Am(c3x;tP3Te}L1Gc*nYq`>4q)KwDZp5M zZ5T(I0zrewFcf-0+~veN=OhNZtci2qI-+m)lbQL;zIF3SXUz?3g$Yu+lH#ZL3*l`8 zlmKca(oRI^&PAua`}8~h=h11-U0dh)EZ>QAv2{KmM5IBYC+j)!Ikt%irH`-zR89Z` zIsUy*{Q1~Q4Y+SkZXp4vu9wfKgC;@glky2fPE>ziUG4TEUl%oM*jJzoND;_@i27N0 zx3wrP~94BHyy`v`g=s*Rp12 z-v4RL*?E1|x;_ymA|jA3#x7%62iSP}WnTcH(uVyJ01?;*<>?s76~NwLh)QC4A+}k& z{8bhl7$qgf0{|^so<4H=PGE1y<{lKr9h**2ipbMB80ofR#i6Rn=XW2{)BWg!b5H-~ zuTDAt(6HQWTbbpj;s!-XsBH;p*Kx|}$2~BA$!`wvvp3f{x2)IYT~@##(lkjs%cDWM zHE0il9J^<-001fdJt88X1>)>qRbqiPDfrY@Eqv37aguZTnT1N<^otD)ZKQX5s1YCkkxfRmo)8{6-Ziyd9~% z+IH3amJiSA&8=;)yfSZvdxe;wHBI8$gSps(;9$V9K`#pcY-^tNN?v4_0Z|zmQR{wj z+z2}P&PB=dD`}|)0IQKy1c>Bv@2w@J%h6GgAfib@BmN99^y-Az#)|OhhzMGsq}#Gp zF5ldo&;8(!bC=xy+l9#!TQeD3E?c7nh5|4Qb9UdXk)%3bJI3U^nw@UCX_x>10)&@<9D?IKssF+b#U4M zwHz6D4UX36PPYZ4E_U!eR76NoPvugsKdDBT}UbPZ%sDTm3mM;3%Rn? zv?fyh!eIE11A97L006EDCtH?gk-aSvi*i~BDUj)5amsP+bl?5pzWGc4=UYKF4=&{j zsUn0oH2eu^ch|h7pF6ZKcavs2tBctxke;H_tD-?**FXCWuOx$CPUC@KH**TkJ|>7P zvovS>zV*|^S2QlqWVoD8lCUG+?TgO1e1^Ec?q=%%D#wJv9+B!7+WMHC6KdW)Pe}nR zA|zxFalyP>)bS$(5Gidz(rc}oVck2I?%sND$NXjUDV;9aBwKdj6||{#fT<&;?wh;p zC$rgo!7_7RG!sqXz$k13X+?7ezZA~mqV)Z}?0_=$rd5E-vv4)>;Yats{9gp{n_F5m z%An~4ZK^esvAdmY{Wsn<|Fpk(U+|o!R0Eeycso)-7SA8fzG(LH?YX-e z9G|z-S*t~v673l(Uj)kWF(3*XO7A)Es$|l%r_*^-SRGf8a?~c?i`G5P*;&m0x@vCA z2U;^3y9&vYcsRoemQo#R>66c0JCpIIUZ<@>c~&C;0D|g+gD3iKVBfIFu#S~+{?S#W zOwgKj>hF^VX)DCAPNuo+PgX5F^E0iPjGamWE{pI=Tbo*$PP;#}Tr|6J+qP9T!b`i@ zSt4ahRq#y!vLa9-bAG>U*{s6f-awy8{N6{HXW6y1zIyQ^64bQbGqHxHa5Q*9 zTog(b-&zQkS56dV*|}!d_vO15yyFo5cKjHL6XKjCJ^)!}?x-6_JkArFtBw(We&j0ia z1^V_pmoP$3J8p3#B{$27KoF&R^VZIE{a?6q;pu<>zRpg6?Gy-bNrhJcS^&`d-uqrN zzkBEP(^*dG=F$sph!U_N1>$TAu=6=Iwlw}&<3bg$)q6wE7NKB|K9sv@1FTfKXHg;AEMrM; zA}X84-HWIkYwGd54glCXbDvBiqIBAIq*59zEjf`e8my!ch?tblT5D(c{olEH!LoNP znF1TQq+e_`l6ocJ-oE;gpEbj_?sm>E?@S(St$U8o0mAx5d$}fEX!XglpJ!2?fiN_r zcQCsc+Xc0L-(7z^Vd>BBUeww`0IwWpz(5C}!`jfTnT&mFM~BWVIQuXE_MS)XpW)os zG;>X#HLQqq*)!8cT$Li#1@}mH-cb*=0cv3LwQ$m^dUo?MG2m#+f~j|W4h;e1L}}j% zAL8f!`wt7=bWv+2V>?hhGpA(JXt+ms>%vpNaHN&b?X=d{P*d(s9|?hQj7aqeHf?M; z;`sM<-qeReZouC6fUZGOUvPZaX~=F z^PyY2#&fKD7oB$uxbG@$bAMecvY6q}@8Cc*LONw>5fRs5w0>Esk6!dt=eNT#6~12h ze|P)BQ{H{3Pe19g)}l@Bl={#>tbtpa(a&XpYufmB|E>yULyoHWvS{H~=X_TaV!= zXcg*m?381wbA0)=h(7cw1P5<_F z(_HS~tC<(~I?MeGCMr&*RxuDjJc8OGyfasgUjcjl5+Q}MJW`XF6(nWch8}i0MWE6aD;ow9aGU_* z+zQ~0eO?RwXlb*W{`0M%9Uhg}aWxb~q?rhPj%`1?e62D^_{?j4>Dvqp9V2!P3JtvB zJ+3S-Ob}{z`!1gqVG5p4g_sBdBycrKQ(nh^dwFN)HYqsO!q)?@Gh9c@`3(X&CmWO> ztB4hnBIsVnb_U_p#Gmi`#!94JF*;#P^#h`7QYiui(|7tmuY+#P3Zz_i$WRE8%CUpT z{uOPhRBZ5UPC-9f{f;MY-YJTHSfdT0%#N!!LLh-CIMf&&d%@5@EPv*ae@SiF;18En zQTRJu_~e7PyjWM=n$y@FR}?E#?Vk}5h-iq~O_JMH8~YCdC`{elL$G3^Lwa|gT?=Z? zmuP=?%n+F_Yi%>D5By=#o8I1<$=Jzm^G&G`Nh+l%opyJh(DDy66`kAT*b)s>WVcLE zP`QF@gpND?i9fdxf@S`|_k`M)5>?;a$=GF3VcJ(j2+RrNnN5m5wc^RnuSwuJ-gAv@ zfC_(57}QkANBxUO{Rmj|K%vH~{^(lm4D zwzmOzLu<`o8J1L+K6h#)W7FtE4XPf9Z7= zoz(zcQ!NU0qA-K#kj3O(eU+D3^X)l{E@>|aZkP#k)uZ=6@Oq-^Qij@^pz_(k1mQSo z>W2P@|F`D$9YE?0p7T&^-M#ot7uFFk?q}voa)=HE5mdi8H$%w@N58)Dy#?RHxRqPc zzvQZ9Qnv#ohGj7 zl$iegH;+I0()V?C`add60O1n)PgT`#&THBg+Q6mxjzCZZNNk8w~Uj|!4 zZ|ozKN~eVYk$nGW;=&NBKzI2N5RvM4%yG$o?z*LKnI1Yt$8(Hg3l%NTWZbGb$wWLS zpUJTjDsk!53BmxJ02b{0c+UP409-S8I|2Z;x3i>D`pxU^cyg=feZE$E8l@W8do->w zn@D}~@+UjLzRyy*AhQf78XNL-B3GsHdTM14NyZpi$Veg-@N$rGwT><_c(Et zwm&@r$})2UQFDFwrVoWq(QzH1m{$`l*C4L0=juj{qq7yPbp^r#wh%~+L{%x$4O+)N zh<9XMpMLv-)8ErROleO_r+F2U=92Xfe`z!1_6BVXV=BGRR7gN~TxGO=F{VFp(Z*o} z_n1ZBUShnDbi2H73Ept2j6r|~R8Al@AhQ&>{_Dpt-cto)j{raR!2Peq;wwT8%q3__ zqyQT;Ms2S4KK|AR9(eJZREpY%a1N%@X=!U~Q#IM_e>8zLgOm~>h&T~gh`5T{(i;qs z>UUOZTP_qni-Tdh64nbapPd!q9j zZ?JLGY4?-k7JYlEiG8@&ItwUIiyAeGO%YT-ATOqL{n-5i-@f=p0}CtlPexu^Yc~7q@na1m&-wXFt{bX`ivUrBepLtjS*r*C4J|8@)rRwVNA{IR|TyPa(}C1zdC- zetK2y!baZaW|*4Y+nO4Bdg^P1kIzxxN!rSpTIh^AMRkq^{md*u)fBZ)_DLBLfD<6< zQF!*ww_mZ~n)dcFw-zm$@P-3<_1u;lXFx9NcGeZYTyb1=NJHXb6A>xC)>?h+PX@^|9yH-89e!Zp~!u|1Mj0`Y}8G8;$Uc z9K=yk%HcQ&nB$~Xzt)?#=(?p>uD|!?LSeZ{Y0UpywCwO^D{t0p-(4eEMhx_c3vA;` z2(AYJI2YHRe#NU>@#ZJ*xuv79)jHazigNL7fNBT$4~tJbYFdBa24a;c6oe}4&0#>4 zh}0RadLWPNHdX(8;ra(|3twNAOqw8vw_PR^P8SaByXGzZ?%`}dw8J`|h$bPx1Q8KU zj^oDDuWJ4AOV_XcW~d1un&p+#V4LycjI6Ue8Y)n zpE?sgcf}kx<`|A>a?wlz#~uKuO@6a6=Ul#i?Zcrm7~AKAadr(r*8o5&MXR@Lp+Y~U zK=_Gp_rg=Ji22;s#OjnD_Q3)sD!+rP;91wN8Trk5Pd)bbk_vD5P*=}w`9w3huXS4~ z)Hy020Dv2H*B*^Kp}qcn2sLm5pe)2a2wXLk0RO7x zw9}63%HI@dU^tp!I3fdLz+$vgn>=&bWlwhAJUCBxG6+DclSv(Rx=*&XnJ@k3_D^~) z`}r7btdEsblbn2taE;;t)Thz4t$xNaS3P{!b{QrcY#>FMb;5uKE$%87094juZ4iLt zfD&zTTU7in&v<&xKYc!(&KLUoaxn!L2&1pS0#SF)TJiQRO8BMfq&M&5#6r^i zRp)~bZt%#9Cxb$5K) z@~kmW*Jx;n*mAC*2_Rp@O%q*T-Mj5#;EfS}LosRL4VTQnKWW*~1YXw53@KY#P=Ua* z2dA7z-CeacmtXSKnvS(CEgl0!)wY8v2(Vm}X?JHYI`%KN5T&OpZCJz~^VJK97U3%6 z=`BPbTe1F;Z^=F(k10h+yPq9@(s!4t_=kF}^8>H)*aqHswoNoaWdW%Y=p~@*zJ5X= zz^jshV{%n8X)fDv|6?!J#xHWDwkH5J9sw2zYcP~&^s906o{OJ+=qEqg>p`CqR;GhE z?^Vg9x!}pW9(csmys1Zdf2=dgu<(?fcPtP{ghZ-XzXjO0ob7N-T6n{t@cJAtZzSyr z#FlFgD=a@ml+L{-=FR7I-g|qv+$=?k7y)t(K$1@L*&84I%U3*=p5_@3B6c*v5kL$q zd!DCXGW4+vpL*n5Yg<}8+9%{O?f&Q3h2LAE)rYz`@4G#A^&9WF03skE0f&oe4}pP4 z!5a#z1@KUwS3yt(A}4_WFJrpyJI9`K`9Ax=NSc+MYaZGx)#v53+La(E8AHcF5x6)h zMauYFH2uY8>mK^?DkM$8o}Y3;2iymrxNqlEb5FWt7kPiI)5?@H5km+%$Bwj<<-b^V zas5iXF*#;1lNa8?4B|)x}TXf>;%Qvpg46qYRMmxaQ0MtfA=dEA+ zw%3*VL5(4!!7|)lqX>x+=6IlSKN@P>!8Y#Cjz8&pOHAy8;XW=6GaU#31Ey+mM8+xs zgoX0`#M>=Nk5%X;1@eehLOCVEpkd|~O;A}11h|Fx|Gsg;qRaOzp$i)L&CmYv@fYj# zg+8erag4l#77<&mL|dhHZmWvD`I7Z(uM4&Lc<=RO2wHPOz2}CXbl*44yJR=y@j8N* zG8NYkmd?yo#4~1e?^qoCwQWRUnyjP|0QuI%AC8~;+&xd%63xkqlp(50AYxs;@$?qw zeY^F!wI3~q;O=`xAOubaUNv{w$7;xa-8e@%k$tw%7!Xe!8!x6`C;I3mPj!BKALmqI zsr<`h7k=+#&wQ}QI-iL=HN;Z6AbzYMWHokcWj6O~`Lkju)(JmPyh}3<@f7zcCp9d7 zt!H)IgTIg+5sy%8E-0i1>Qiu!vige;KmX_rdz@H>J^tU%J?o^I)SHPjH)aK_g9hp0 zwFyLAqc*0Cu;De$skdx+Y(uea-0>26wSPbV^y3b(*|nOv&JWU(O0R`PY@;^jb!D$v zzHwdqX!mAPLKdp^<6eDuuBYh8oRp{3CIeihwA#x0nbonQKh*)~md?&H+b{?M=8@8^ z&pht3wW7y3%=NC3(~m;g8kgM2g?ZMJHCU1#&`vnoMw0bnJ9u6|c+ zSo7R26aQFDYgM+^HYDW3hX_ss_7v0`mPrX(*x)JQ`=`{BB4GU9)nY(GU`4buP9JaI zkj}49Cd=BGa{xkx!ExdGhi`kawszTW<=xp}JQMVJwa$1ky-DkjT(F_@JHu$)?=RK# zfiCCov2h1G^BE#BfLL_*E>Hg{OR+UR%ND>|7W8T7#T|)fmGV5!CrGPm5q2PWP=FJ9 zofGkgvpV*oK@izLoDG~8NR@~_P1J9{b?nJk4E935ZSC5Jx1nx%PN|)7BIQK#HKdfG zxZ7;JPo4AB!+-I?`)=MD76B;9Qy7Kt+ArGh;Lmn2-Bqi#9*gZ>Yy?m~Gqm93AGKUo zy)sCa8FmFw6fJ3-UR=hC+^$YR?I!i$l}|o$i=a)lSID3U35#v7?EK?PXFmPN1zU{y zoKlplHO6d(eE8xGo!^nc+d)XXpB;bl4^B0)5A^!Z$_N@aE<~cuPQO||>BxIFp`=+W zXkn=`T8UC_D;T>V{Hj$|JUFb;dm|;w;Ppe1&R8x0O>-vZOLxQC=tt^9ZjKo$1 zTF!w#*)PsfS$b0`_|W13Gn;wq9AIzP!=c|j3BnEoto(&`-zIydLj+D~I92r@fB>lt z6%z8cFDsFDZGaLHTE70lf7=c3>=%XKb>YTGzbi;-8nhksi(?o3V2P&p7c{OR4847> ziI7*=*%#B#lSY@PRHN_PK2kzNF2Rnc3*-0*(9rUf=oxkS&{YP)TH8;3pT%}Uj!&6d-_yR!E)<%?0yK9eK z@Pkt|y}!p=>xjJJG%f%@iOR-xmX)^=j_Y^%*{p!7jpdjoK2kf|44a=H6Fy$~m_zye zkpi*Jbu4;kDcL28c56*TZ^(CP0S zv-rv|kfS}=LsqMjNfS==Q+ZE|K^RYL8ZW-D&*`UwGPtErB_si2)<0^r_f1%M!zRX6 z`RpMcQ=J8uJQ0Bj7FuF&?CM^5Uu%TYddcAV7KRNJAKJg0xZziL+C{Ui1Y==m%sKh3w zSP!&**@=3Ml-^>MvJhz!g)V2*D~>Q?(2Xf*;3|PS#Zda2$1l7xwDGCXysQ$J$-}Wa znbfVBb}I_k#YiD2GFUonQfyXk(@EXd&G7Qtkfy?8;C6{=i=~bQ;yKDN0^jD z4V)K96*ILclm6z3Ctt7(?BWV5!Us%|I+^2lA zAqm@OloIiXK+3)N&b4b_2lm7l?>BU$QhFueemrl<`3sHr@qRxDz!+`)LSV|nhi|;s zpzj(3yxG#k9;Ol&8ZI|;NIM4O-$ zi}LzmOp`EM5M~jmfizEdr0RS_GS+&GM9{tL>=Ez|ziem!6@?^#{pz_~Qy9o=64}>D zWRpiFR|>=eSW?r!dd8dUfW5&`gPFAOCWvP1;4meXUJ{4~!Sm@Q0BBAo_p2FR3RzD7 zea0DebuPCo%a&-2-c2P02bG1EJdvL_jx5KtXGA;}3(Z_lf?ALD;l}Yaw(d}|wh=x~ zAeTKPMsmJ#d<21)lGqs}`NNe%oz`kPvx`|0k6HO~b}PW5bjgb@4y6T7H?+n?hz-xNhi$v*{ncmlxuY)Q~@nHCcrg?xbQ=} zy#@tLbHNB1wPc?FqDY89{gk&`tf#7t(OQ(+>;!Sm>cxCa`-WAoC6fizp_b%v<%FH_ z)>w}k$?4lwwReSL{7x(N=DfH&oafGPte-NXj?^G#rSo}Dk#%k-D?p8T8=r`TsM=D^ zWbaWKQ2?BRysm@CRPqT(iOAvI-iYU&wD1}Pu~ky?NbcZ!*`gIeD-XVCpCOh&aUmH~ z9fQIXjgi*V#rbuPrOtzQ6gfB3d7_lF)0M;olINT=jTnVO85IG z_@4KdZ1ZyzX?S9eaN0HjR3*w0oa{0p)dt#AY{&I%SusS0%X!*=ARu4K%ehGpd}jh% zvmB2~K=63~)Vzg#Q2OP(>Dz?N3r1;CW2=cw5I~5u(=bBVrGQ;I;`L5rt2la6k$E*| z+(sDv0yH-H+C9RgdKJ_C&WpY5p#LDy&$BjvuuA`lwRaE5y+CZ92GO%t)C<fI(P44MQ89;UkeKq> z&R`iX&T3x-5Cx(xD0C&vwZOg=AqwBU;-3==o^>mj%_1mAlDbnwJDWy+&!mO7H=o<- zAbW(VbP)L>U`;20XvF=nN+E2w847UNHuSaGb>H41^kkjZo{S-$mV(VkMMSe4xL=g% z2YKC2dE2Zq>+@Q_#0n3HPCRWr^Q6=riqxtyXK$;4mm6S)sM z_Odg0HE&c8i`@xvISrNfn3|o)upZBlpd1JJ4W6g7BL9A6=b9%5R)7q`Kq3Er(ghW5 z3x|c@zIE}%aU;?k1Wc54Y>NRw3vI(O@9im^e8>rJ(!!gM>n?_X#x^+@6Y|AEF&}-~ zqVs2BfKXH_cP(uFr(Z2RcUB<4Z7O^y@4DlT-d)wTS9L3TrAA>4aw zu1ho5YZ7e;$7#oNG|M8z{U>`qpBVG`T#?>6p#BSD)*cfhUZJdite3ZEEB0q3NS~#g z#L34@_|AupSNX&~6Fab-K9(}Ris3gJifvNzo8@o6{4)i?Wgw_7N&w$>!m_WNV!PVH zzZK=C7MW`b-}A_qduJ+Oc3y_xs+lSj03w%Lnf}WW$H9b!H(U;Rthf3AKwQ!9L>vQP^0|uvpn1!diqpL5R7wdzRry_KR1r}v z=TALr(+ju$==}2=RwC$%z7lCCsg%BI-NVnk6px>uBYL@-pn0_JgTkop%gutL7(DTy zX}3qpXd$sS?@XSKBFl$rpHKGSA7&+gDmXtQ?))W+Z5=y%EIXSQ!_%Cnb|~eMkmQAQ zkJfg&=kp192_hhey9DLLHW}r;4*cevjgP%Ov}@=BuiL(Nl!6M`l5(4TLjcx+|lq0+VrJsk2 zbvvzIQ-pq4>Jc6Dv||(VxydnnG3rodls38C5!!Oqa9huNHLfw+l>Oh0#{1QGa0uk*=983%A7DzhJITVOd5Y4?R^uz zu+Z`H(OYlLJHjg_2(l`*CsE~@T?65WQ+K~`5dk6CCRSQe4U5^O2}Vf24j>E9+fuFIvV!N7Z%?SsyJ|Z` zNy$)>m4n}8l=qtA|2_MuCx_Iyx1ZSZ=|dEMCF}dvCujnoMF5w-ngB_s(^GcuCqhS| znY!O~d$NY?@wqazsFfgi5C;0$(cU}B8dlH%gq7Q%0iYZk^8|ni!u)9fzz|KC%f;$s zQWGGxJ>BnXB-LbvEg@)Z-Q~nKS$o>D%{{k%BbjU@v~x!)r9%OJ>thc-`*KzMygc#C zHF|g(m;e$m61M+%QtmLQ1Pr5J89vIAHO6tBkc(-hJzqNl6FGME5UywO8;zHrAy6?9 zH26wOb>2S%u775h2x^E`Ou=35H+st3qU`^k`_yA^mmsV&5L^U;d-vRyPagvLN}unn zBhnfmAyU2UB;okd-=5MsCsoM#o$?1U4hRt4pZ)tFwyCsBW&j`}>Jt$Ltp`RfzCOtt zmkbV~6OR{GOp`m@gdp7`K2HZu|HGmsm(wr}u}e)Gpq6Jc+;M)Yp~mGt*3V94KvOFs zGF^^sBiqxKZtl7D8_6pgSEd6SxHXfpl1k~fKK9_VFIHEbmnC|snn=sAHn38XM@@C! zUr;Cha-Xc1H(n2*vc972ka(8CuPITCnD(t!J)*HgY11zh-wls^r!YhN{mZJHJB*;> zgP&z6#l*0Up7LH-_;vEBC*EEVzP%b38GFZxEuWc5{FSV4ttHaoBtSvXy{l7F)zH`V zDFS39o34~}AZYG&>&eR&*9u?W>zGU3Z%Y8tfbv=OasA9c1ABc-Ls66(R(bIr%L*W6 zYuKc~P9)*mum7m!vg)mwnPuNLTAoZQ0=W6rXTH=(+-%vtVF^Z|24;KO(k(CFwnu;m z*uVu1e14AjrD}~~ZD2W&{G3dbWNw@@(UlX0VVIt3*SL zW?Sv`WsinMA}30M5Y2suhC`rnn~XAB#Ql2tQ;+`D8w59#v3Jc~`k7h4m-}p>an<19 zJ5svWF*hLpp6gCIXI@bAs;%q-+??D(ARyMy|6i3TRi^MxiIIX+c;>t{H*67r+NUC) zH=tbrpgZP0(J!*oD}%=w2uhOni|{PQv2(j${nARLU1v*6*|cvskZ(L`=|v3|@9(wj zh}4i18xfh^j%|~3%a(3=`L-{gwW4Vy(oWj;+Q4sp?7?SWtEoOOOX{WJY+yo=Q|p7s zWBxLBEJ5Fr*%q+5B&iej78h2lW97L)_#hdze{|F$gPOje5g{2(q@roaR z+F#FvyRhFn2UQM5BmvKj!Ek5blY(ia)pELNL)v?54}a~}ud zh?LKc5Am}<{oSHBol|N74x1u>H<_xPyKU>uH7qlI7RDG#sf0Fglk=CIwEeZ)zJJz= zrolGw%175c_vb(ZzgVjR4Lp>(QiX^*2c3Q8S5#lv_P`KBGlbv}5=u%pNH@|Y2qGcf z-7z#sry$+krF08ONq09x2+Sb)&hK5%AMmW_{%}5?b=KKu-S>6&6`O{&&-=w0*;arF z@*)PFh*qHPRTfE-PsK(duVsEX&MKYnG_#8JJr<`zMHD}Q`Ob{c0K{&&jUF$?$Q<>( zj#Kx(*`eDXb0m5^2lRekm~HPmAsUEXqDlC%TN%`|ZobCKzwpW6ULMfHWS-5y){!ru zZ0qiutMC$LBoV?yfIhB3nK`-k(C+;n6Z;}XECES2=p*Ho&%&a7u-Wm+jnzXhjaU85 z5a0G0Q6sB^w4A2Ln@&{2Iw-QUHn-e$yuBTS;KAfLjA{r6NC}=^*1w834jKx3)H%_L z$7gQy%&FVWwS;!fo*?z%R;y4#39&>E)i$AcTSxutk}DFPaH6! zSY#I!n(YZws1k)zW+TL(qd!ns8AFVKYS@YDJ4WAE1)GLCuR^t+z4=$WZ^$}Ecjol4 zWyAo3H5EeX?UxhY@7bB(v99rl87LsPY8r{G5s!@%Ha{0To$lSHqS+6ssE1_?{A5hO zB*Zd0&?m%b+ldx22^^k%`O{H*CGHRUOr}L*_bv?!B`;4Ke_+&kJjU-ypz?t2@y~z4 zOk!=`Q1)=bRumi3;JX1N>HOH=Vg7+~zWFEzvX$)nwkkZ+3GT(42duHp zTM*AJ0L{KWvX91MX>~goxP2UJGK8C0fG};kt2kvy^p2Y})&^`nb#$J`2IFgf@cH@w zkCg}esJ>}4k3T4lG1&$gZ=tRC$uRKa-!f?rgdbP$lSme)pBybiK4^i%j-rXXy~(J( z#AHY|_dgTqh0%LS;?J#ldyDjCn9jI=X-m%Z~AZg%+`!Mb2Q~QA^8^ zuEm`!bK_Nr=dW|@NYuiQw#Pbcm(9l|@t@~@9DCDvsRGacwRI8vM}&61OLj&BMLHp( z*j`ne+!v#{x^pCJne*OYx7ie5s~W5P&5+-i#VAW`iIj?F_>4NmXK(MeUK{Z2R5(?> zW;{xY=%D*Dvij$IusdKYIk3aln70&Q(-s6pt{kpIjQdPdW1RJB>Z5VY z?YT_~uZPeWp-Oagt0eg>8IeKh$mzTfEIj-r*<&{?+HLFmG)mVm>7A_jVioBlb;ZSdSU>O^XHK5y7S0&dAp z&K8Nf7;$^_bMz+`^8D3e{D1KQ*c6J(yvJTZ-d?m$i0^HG?Cs_i7A}lud)rf?%zq{! zGcadc*c$D#@z-+U=|ImQ_XTVyg0aK*sexeJ<*a?J%Q3&~G*Ok7h{?2KMn<1d?;_H1 zTflthxCMq6QEQN)h=}nDYTuQF&xwnESXTJeepLUk2A`VXxWoTjD)(pL;JDT?}N(4^xOexARPhyA8#ik%m6Z zVL4ku<`2z0q|^tqycnVZrZm4;=9(L8w%W!-cvkv?0fqi8Wtr)KRiC>smF5)z@od5j z2jH;Tl4T1NG$5()hD1Xde24Z6Sli$-saIx6d)>gJL@6=Eol^EPe3cSC!tZt1#ilS$%ogcmLXe(#Ks}<~E z73HvH{JfzRHpXkO<_bS*}#SCEVT zs~qoB;EuJR(d>EMfn;voZe;|{^A5Wuo5r5i1{Boux=*UejOH(i1dA0l#X9L5NfK;e z9qO)34_!^dn^L78uM|Lbo5Iz<9qfe#LQ&s&VRa(cN`4=fjWskaN~db(g-0n|3K5-L zLB0RFNAW6fVG7c^=Nci=rLIijSp}jYS#?dOL5~MX#TYr)N%f=Wx?Er| z4usX!&PQ`lp-xB{E(w$ugdu}b6qCSBV-ETPQqn@l4WJ_^nMN;B3wwIY#cZ!`;Ma_(TZ;@_POeiV15+!qgutO#KiSftfB`rFl<_Fue zOIzDygtfnU3z*ppW0WZY1B6fbnZ{e6qjfdX;49u26xf!h^M0rx#ZQF z8x?0_t()aFPGs_H4EvTstrk^d|dUclV+=bz+ z|BE!Gg_4cU+j6hOoULkna@{ktJ@>!K41R%Em>j<1L2mfrpSZ!tYcBtXC24Yd{S&(` zb(BK4jl)d|BzHZ%Z(iN)wH4m{%uP*jB~c>t4V1vEc|F2+^wd%FRHiG1-8U`B#Qr*n zj=Md3mw?Q={Cupdn`)DjAO%}$6`F!Cg{S31nq+|-iOT>!2`8)|N>fP58$B`GYC&-Y zi8yLKWQa#4$x*e;B&h<1h zgVCj<9G{&Aa2ykgSD)IpdMR{i72LlcUe23!fg~PdZ_Z&v%hdEtDO}R062Y>DY|M?R z7uSWQs`tZ4L$TEeypU@T;$&`ee)*S?`k`NU@N)&_+I~n;cz@D zVCJQpnYL&th%CP>Px*PR`Re0JKNB-g}81c~LqzR9_Yd+fmt98J%x;qL5=J-Dk z*)HRjyvC2>WUF+)vGGI%r>zh;`#q@+t9~$QTMj@85yGeYe3UJ63`zgA{Nwmvo|mC> z({9e|Wbd&qKk@_d#(tq(38UR^h&Zam*G4R29uC{bI8qAgr#YF$@(W8Dr(R91aT=BGvSL^Oe zT+)%9!ezGi?R_MNMlzmmXI`t4`aTz*oOg>>W$T=3AvL;L02}wmr0zA0NA+w5H5t36 zU}_P%ZGppYh-l63pH`1M_DD2))ip6u0Ag1+t#u^tYc*Z_G-=1r$C@Se0kyzzm*izC zjeER(wdHS%oyW0%6tAAnn`N^GF{OhHfq9)*;`cc!+MnlTkIRL}!)f_5?d0XrTGp)` zE7NpDUIg5Iq6%U^J$PXcXB~3|Ej)A^G+k%WyZ)mHD;DG6%@4N61WF3Ma>iTc`Tp*) z_$tTmwsElGyBz(h*xep;wQC$~<448()*-b;C8*^3aTY+ZEpBQx~csyFl{MqO$ zD>`e{WC9j%fCABih+1ysd__i9Tb|nJKls_KQFU_52IFW4od-@5`5;r3B99`ZYP0@!I{dLhdYx6 z^~kAaWIS^+cj@{0axug+Wps$@@ot#}y_XW1HAdDY8Un+-XB&|GhTrG!8{Q_Er|7$= zdOb;IXL!E{{Wq=UeHI zl?u_2uO@OI56jjVOw*dxc0Fpn{Zy&@#V6i1E{df<`#_s;w#3w+I0alhJ+{x9D|($2 zIPzr~_Js(qgq)~|gccc<ByUvQV`v+!mPq!IG&S?P8!h`%;Tp-NTxsfm1j;+^E22?9*Odf}%^-3uW!cM=bQP5Cp<_a1M zT>ORSbNr5bYl9RRzSHu8S>QwXvx2ST;#bE$3-@6@Q((~v=$k`qPB)6fMpA=^Sc1e|I*{e%ZIy$b+r0Pqzo$UQP?6$cEWgO=Ybhss+AR(+ z*@rJNnup-kt~VNpjMl350}YfzNX%+)Kti`q41U4)xOs_*?PlS7bdh*@p7;07nVfWE=WLp?#2Dn(04K2 z?AB*JMjIb8k;uH)=*M3b6Ml|PBz*fw+Rr{Urk@|^;BNurfOb~KxqR9PaHj9~82~sv zVjaBARP4-+6$!BA%WK~RFyJIW-V>j=5YAFyB!lLds%22tux+m@S~}ey{RPm^6|G~c zxAbLs)Nwv{@AlDKAncxtT>iE;hyFD3sFU<6rlZv=- z#NBR<@*Pp3J90;7;BtdmuHl`Dc{TP*VIG5QSL<#{ox5UZ^+m@DM329n;hjyRw!I&gbpbA4I*VmZL(TQy5advMVh+p@U+FOA4s;YY>L=MYs zTG>IYt6l@YEN5 zt|~1JjarK=uh4b8@A*wV1MtcjQ2Q+<#jH}maLYGn@TDRQ#YM6=RJC;diz#!=Qh-)I_5?79k>l_8yY@IypDJh=fr8O87COWk->ibj(U{TRhbBKDH-%^qm4|5rQSL%})kU%j z$k6{bMGXsI?N-C8ZT%h^kRm;yi%j^@C^cA$N}-$t01?cHntGL%Bh=cm;y7X}#x~J_ z*5^txc8VrB7>Nzk1x$ldkHj$9AJ8;Q6Un|-Dd2B+THqO}W5<7SKb5S3Q+HqV`sPsG zF6k&_R)1r@A4Bu)0i8?0C$d5??VnK>c;gX-moPCRWMx9UbjH%O$C{XNz237oa>{`f^?R{#0sX4Xn^)2P7fKJKHjb zm;Omt^rZMx1mee&G?t*I-efc|Lhs_O-iN6+)bZY~{F$La8KcXn76oO;2*>ADiulfl zhpIQVf!FiryBN8??%d_A$i$dqz{T~e$OM3m4)-AmjcisOHY;Bz5?N7|r?BtW6KIy% zN9T|dDpw(q4t;rwLuEqS(}hq^Qx& z++%v)Oo29L6;bBY7Z4%I3#B?F?{H3v0+wasY10#~M?T_a0$*PYz0sDD8IT;X8XGR3 zx+u(cefNGje_g~##Hp&qO(rqY!NWPy49&!v`eT3m+`fOm?>->PBF`dpl5ptB4y*Tu zAiTcT|J`zP#lG>&pW@5CU@+L+BG6V?fSGPwM7YrV6Tug`zaP&zaQEt>1r-GK7zO** z_X1GwYXP{PYxgIJs4@v&fX-qUQ*ldS-#@AEx&*i1As0Eo*o%AW$PKoFP<0;luboCm z&|s|wTc(FNU?dg3cIxdz@oP8gaMk`t{w^UpQyT1`4E$MAcyGjanW4r5QMi1VZR(EPj_4Njuk3+WK4fEV55ml90%Y zMO){N$(=(JH8P+$ip=gd?3AtHTnc8rQ!<1bwi8g7c?b* z{SJMcKShH1^n1GSi&@b5D`uc|lj3W?HHxj74XV_oyC+XL^n6{%wPYU(%_vpi}moY;Pl27 z^E{-XXuh5x^zbbP`^>S9?@&1dh#ihjuLL?Yl4C8N}K*Hf% zUQC@mGkF`}d*TpEj(Z>kFqdAl&S_$5v|SO5@rsGYVrm1c=P; zmskT0K2`w*rIpwO(C7gXNzhIWP3eGIAqi86y7Z7 zlZv$Wl=KyS!!Utc9IIOOMt+(ny?0;4y>ERowH)!NsT@bFc`EO;RbyGqq@gWbqJAJw(&DejXHjnX&%oTpVx)T|ap!ZEvP&4aN zkO=EKXhRyt5wAO`AHQQbNOT7E{sjhWO?bg=zBWg6$g5+dcTx2@^BxOfF0Rq`FO6tr zY+GXAFC=ctDQ9w7CpnWm=2WdI^jr1y`nF!C31IhZ-kx#^{fnb0F4za*Ht9!1;}I}M zh*pN6gy9ZJk+X=T`JW&k;1YLP6Ycbb)@~;MbUQz-&TRTFBwNNrXbF5S-FqUcy|e^9 zpk{xoO+d`nG6~lv&V*pRa*Ldkk{O63aa|HzH^Y15m!E9Q%g{K^V<>FqwVI#x-YiOQLdoJ92S&yybqra8#dg zVX`w5O{b>m0pww)iet#xl}n)xT8$kusneUvNDYt5pfjx&QdL%$)Cr_}aKqP}JkG2X z;Xp*n9H&Ps3+P9LF_vh~Ue!yl-~G@EDa}D+UU(+HG?w+3XE|jd;)WS1nC|CzYk7WN z-h9C^#B_yaDDJ8U#6fM5gb2dWC~qsbl4FAk!SGte6xk~1+=`42gFvQuCkmVgjbBI1 zO7t21AU3bc4Yh*C9uy^RUXAydwmL1PpQ9b6h6 zdLiz{FGhOgrur=wcv0~BUnj*6ZTe~O(JUE~RooEF<-Gp=mFoCDJXmDD29=mCMU2QN z@+v+vSOC?eG}>Qj9?+jQbQylT;zVLg7lrpNivfrd8KEOe5yU{LU@v=ea#Bi)ofdn8 z5-U>{6~PiH1yI)t(Fgi8;(z$!0%>8jnqAUX z7O^_-b>t`xhQStE@*a=DzN;yT#iWD9b65)t%EeL8}(PFIhh1h)4rX>W7W^i=!H2$MtA5 z%W2I};CxfVJjU=cWaQ3BX&715R>9tq`FMI3eg6t*(ePMKNKRToq3S^sH~;(l{^^={ zH8XPZ$$gR{m~PQtK;=>INF9Fa8Wu`>ysannuvt9^;TWHPpgM{NZimfhB+p&bTSxTr zI|}ZQnbjGi4r7JjN)dQ-F)UAU)QMx)vkQ_iuK1g{7@YjWMq0=#q$jDjOf;l-#x&^`DKCRD$R@B_xCN>89@}=&4q4NSU{OO&<>dA2??Q#@k z;2B8|gHFq8iGB|sYe0j`>4!;Gsaw@f&(8ABFCIaMsj${4K?;lB0ZzFqQx*`)A}}yd z9;D1P6p~{%b5wu&IW7XaP!J@_-M+NVzHb zVzXaUL_v`8i|>54nu+`n-&R3Wz^oq)zp)2pTq2!q-(g0+-2$}b_a^)$5D|oUXm?_} z)Sz?dTMDS#VameAAUadTSEN0*qmz8~bE>Bj+xNo@vseLY?o(G`bpcF;(8@d^U!?s6 zg==Q(Alk$>Za^L3(Z)rHedtt@LA~#u*^LkhoxBb*ox~NNP)) g_J1kB#WN86)~kcNcDERLfC4~KR#m1($~gG{0s9Cr6951J literal 8976 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 HS?K=&3Q06k diff --git a/mainwindow.cpp b/mainwindow.cpp index 9732cd1..e87c6f8 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -62,10 +62,13 @@ void MainWindow::initUI() m3 = new menu3(); m4 = new menu4(); + m5 = new menu5(); + ui->toolbox->addItem(m1,u8"相机设置"); ui->toolbox->addItem(m2,u8"算法设置"); ui->toolbox->addItem(m3,u8"显示设置"); ui->toolbox->addItem(m4,u8"保存设置"); + ui->toolbox->addItem(m5,u8"多点校正"); type = gray16; rows = ui->spinBox->value(); @@ -143,8 +146,11 @@ void MainWindow::initConnect() /// /// #elif CLIENT==2 - connect(usb,SIGNAL(signalGetImage(cv::Mat)),m_tp,SLOT(slotprocimg(cv::Mat))); - connect(m_tp,SIGNAL(signalsendimg(cv::Mat)),m_avg,SLOT(slotprocimg(cv::Mat))); +// connect(usb,SIGNAL(signalGetImage(cv::Mat)),m_tp,SLOT(slotprocimg(cv::Mat))); +// connect(m_tp,SIGNAL(signalsendimg(cv::Mat)),m_avg,SLOT(slotprocimg(cv::Mat))); + connect(usb,SIGNAL(signalGetImage(cv::Mat)),m_mp,SLOT(runData(cv::Mat))); + connect(m_mp,SIGNAL(signalsendimg(cv::Mat)),m_avg,SLOT(slotprocimg(cv::Mat))); + connect(m_avg,SIGNAL(signalsendimg(cv::Mat)),m_bila,SLOT(slotprocimg(cv::Mat))); connect(m_bila,SIGNAL(signalsendimg(cv::Mat)),m_sagauss,SLOT(slotprocimg(cv::Mat))); connect(m_sagauss,SIGNAL(signalsendimg(cv::Mat)),m_dde,SLOT(slotprocimg(cv::Mat))); @@ -338,6 +344,10 @@ void MainWindow::initConnect() + connect(m5,SIGNAL(signalsave()),m_mp,SLOT(save())); + connect(m5,SIGNAL(signalcalc()),m_mp,SLOT(calcData())); + connect(m5,SIGNAL(signalsavedata()),m_mp,SLOT(savedata())); + connect(lpath,&QPushButton::clicked,[=](){ QDesktopServices::openUrl(QUrl(path)); }); @@ -418,6 +428,9 @@ void MainWindow::on_pushButton_3_clicked() void MainWindow::slotShowImage(cv::Mat img) { + cv::Mat o; + cv::mean(img,o); + fpscount +=1; if(flip0){ cv::flip(img,img,0); @@ -741,6 +754,7 @@ void MainWindow::initIns() m_sagauss = new sagauss(); m_tp = new twoPoint(); m_clhe = new clhe(); + m_mp = new MultiPoint(); #endif } @@ -761,3 +775,15 @@ void MainWindow::on_spinBox_2_valueChanged(int arg1) ui->label->resize(cols,rows); } + +void MainWindow::on_pushButton_4_clicked() +{ + saveeeee = true; +} + + +void MainWindow::on_pushButton_5_clicked() +{ + +} + diff --git a/mainwindow.h b/mainwindow.h index e488636..c9f9c60 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -8,6 +8,7 @@ #include "menu2.h" #include "menu3.h" #include "menu4.h" +#include "menu5.h" #include "usbcontrol.h" #include "usbthread.h" @@ -20,8 +21,10 @@ #include "sagauss.h" #include "twopoint.h" #include "clhe.h" +#include "multipoint.h" #include "qfluentwidgets" +#include QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } @@ -64,6 +67,10 @@ private slots: void on_spinBox_2_valueChanged(int arg1); + void on_pushButton_4_clicked(); + + void on_pushButton_5_clicked(); + private: void initIns(); void initUI(); @@ -77,6 +84,7 @@ private: menu2* m2; menu3* m3; menu4* m4; + menu5* m5; QLabel* lfps ; HyperlinkLabel* lpath; @@ -87,6 +95,7 @@ private: sagauss* m_sagauss; twoPoint* m_tp; clhe* m_clhe; + MultiPoint* m_mp; usbcontrol* ucontrol; usbthread* usb; @@ -133,5 +142,10 @@ private: cv::Mat lastimage; + + + bool saveeeee; + QMap birghts; + }; #endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui index e6af38e..d77b77d 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 1374 - 607 + 1386 + 619 @@ -15,61 +15,7 @@ - - - - 开始传输 - - - - - - - 恢复默认 - - - - - - - 行数 - - - - - - - 1 - - - 10000 - - - 512 - - - - - - - 列数 - - - - - - - 1 - - - 10000 - - - 640 - - - - + Qt::Horizontal @@ -247,6 +193,74 @@ + + + + 恢复默认 + + + + + + + 开始传输 + + + + + + + 1 + + + 10000 + + + 640 + + + + + + + 行数 + + + + + + + 1 + + + 10000 + + + 512 + + + + + + + 列数 + + + + + + + 存一帧 + + + + + + + 计算 + + + diff --git a/menu5.cpp b/menu5.cpp new file mode 100644 index 0000000..d3b7e49 --- /dev/null +++ b/menu5.cpp @@ -0,0 +1,32 @@ +#include "menu5.h" +#include "ui_menu5.h" + +menu5::menu5(QWidget *parent) : + QWidget(parent), + ui(new Ui::menu5) +{ + ui->setupUi(this); +} + +menu5::~menu5() +{ + delete ui; +} + +void menu5::on_pushButton_clicked() +{ + emit signalsave(); +} + + +void menu5::on_pushButton_2_clicked() +{ + emit signalcalc(); +} + + +void menu5::on_pushButton_3_clicked() +{ + emit signalsavedata(); +} + diff --git a/menu5.h b/menu5.h new file mode 100644 index 0000000..72e0880 --- /dev/null +++ b/menu5.h @@ -0,0 +1,33 @@ +#ifndef MENU5_H +#define MENU5_H + +#include + +namespace Ui { +class menu5; +} + +class menu5 : public QWidget +{ + Q_OBJECT + +public: + explicit menu5(QWidget *parent = nullptr); + ~menu5(); + +private slots: + void on_pushButton_clicked(); + + void on_pushButton_2_clicked(); + void on_pushButton_3_clicked(); + +signals: + void signalsave(); + void signalcalc(); + void signalsavedata(); + +private: + Ui::menu5 *ui; +}; + +#endif // MENU5_H diff --git a/menu5.ui b/menu5.ui new file mode 100644 index 0000000..841fea6 --- /dev/null +++ b/menu5.ui @@ -0,0 +1,42 @@ + + + menu5 + + + + 0 + 0 + 480 + 640 + + + + Form + + + + + + 存32帧亮度 + + + + + + + 开始计算 + + + + + + + 保存数据 + + + + + + + + diff --git a/multipoint.cpp b/multipoint.cpp new file mode 100644 index 0000000..e4c8120 --- /dev/null +++ b/multipoint.cpp @@ -0,0 +1,177 @@ +#include "multipoint.h" +#include "QDebug" +#include + +MultiPoint::MultiPoint(QObject *parent) + : QObject{parent} +{ + thread = new QThread(); + thread->start(); + this->moveToThread(thread); + ready = false; + b_save = false; + n_save = 0; +} + +void MultiPoint::saveData(cv::Mat img) +{ + cv::Mat temp; + img.copyTo(temp); + datas[cv::mean(img)[0]] = temp; +} + +void MultiPoint::calcData() +{ + + + ready = false; + if(stagecount<2) + return; + + double v0 = datas.begin().key(); + + stagecount = datas.size(); + + double vn =( datas.begin()+stagecount-1).key(); + + stages = (double*)malloc(sizeof(double)*512*640*(stagecount+1)); + kstages = (double*)malloc(sizeof(double)*512*640*(stagecount+1)); + bstages = (double*)malloc(sizeof(double)*512*640*(stagecount+1)); + + + QMap::Iterator start = datas.begin(); + QMap::Iterator end ; + memset(kstages,0,sizeof(double)*512*640); + memset(bstages,0,sizeof(double)*512*640); + + + + + + int k = 1; + for(;k(i,j); + *(ks+i*ms.cols+j) = (ve-vs)/(me.at(i,j) - ms.at(i,j)); + *(bs+i*ms.cols+j) = vs - k*ms.at(i,j); + } + } + + } + + + double* ss = stages+(k-1)*512*640; + double* ks = kstages+k*512*640; + double* bs = bstages+k*512*640; + cv::Mat ms = end.value(); + + for(int i = 0;i<512;i++){ + for(int j = 0;j<640;j++){ + *(ss+i*640+j) = ms.at(i,j); + *(ks+i*640+j) = 0; + *(bs+i*640+j) = 65535; + } + } + + qDebug()<<__FILE__<<__LINE__; + + ready = true; + +} + +void MultiPoint::runData(cv::Mat img) +{ + if(b_save) + meanmat(img); + + if(ready){ + + cv::Mat dst(img.rows,img.cols,img.type()); + for(int i = 0; i< img.rows;i++){ + for(int j = 0; j< img.cols;j++){ + int k = 0; + for(; k(i,j) < stages[k*img.rows*img.cols+i*img.cols+j]) + break; + } + dst.at(i,j) = kstages[k*img.rows*img.cols+i*img.cols+j]*img.at(i,j)+ bstages[k*img.rows*img.cols+i*img.cols+j]; + } + } + emit signalsendimg(dst); + } + else{ + + emit signalsendimg(img); + } +} + +void MultiPoint::meanmat(cv::Mat img) +{ + if(n_save == 32){ + img.convertTo(msave,CV_32FC1,1.0/32.0); + } + else if(n_save>0){ + for(int i = 0;i(i,j) += img.at(i,j)/32.0; + } + } + + } + else{ + saveData(msave); + b_save = false; + } + n_save --; +} + +void MultiPoint::save() +{ + qDebug()<<__FILE__<<__LINE__; + n_save = 32; + + b_save = true; +} + +void MultiPoint::savedata() +{ + + int k =0; + for(QMap::Iterator iter = datas.begin();iter!= datas.end();iter++){ + cv::imwrite(QString::number(k).toStdString()+ ".tiff",iter.value()); + k+=1; + } + QFile fk("k.bin"); + fk.open(QIODevice::ReadWrite); + fk.write((char*)kstages,(k+1)*640*512*4); + fk.close(); + + QFile fb("b.bin"); + fb.open(QIODevice::ReadWrite); + fb.write((char*)bstages,(k+1)*640*512*4); + fb.close(); +} diff --git a/multipoint.h b/multipoint.h new file mode 100644 index 0000000..d8f5670 --- /dev/null +++ b/multipoint.h @@ -0,0 +1,60 @@ +#ifndef MULTIPOINT_H +#define MULTIPOINT_H + +#include +#include +#include + + +#include + + +class MultiPoint : public QObject +{ + Q_OBJECT +public: + explicit MultiPoint(QObject *parent = nullptr); + +public slots: + + void saveData(cv::Mat ); + void calcData(); + void runData(cv::Mat ); + + void meanmat(cv::Mat); + + + void save(); + + void savedata(); + + +signals: + void signalsendimg(cv::Mat); + + + +private: + + QThread* thread; + bool ready; + + + QMap datas; + + + + int stagecount; + double* stages; + double* kstages; + double* bstages; + + + cv::Mat msave; + bool b_save; + int n_save; + + +}; + +#endif // MULTIPOINT_H diff --git a/readme.txt b/readme.txt index 0a38454..ac2f9ea 100644 --- a/readme.txt +++ b/readme.txt @@ -1,3 +1,8 @@ +版本:1.4.2.0 + +添加多点校正算法 + + 版本:1.4.1.1 启动前添加延时2s 取消双边滤波等功能 diff --git a/twopoint.cpp b/twopoint.cpp index e2f003d..3686a42 100644 --- a/twopoint.cpp +++ b/twopoint.cpp @@ -243,12 +243,108 @@ void twoPoint::setpara(double range) this->dbrange = range; } +void twoPoint::saveData(cv::Mat img) +{ + cv::Mat temp; + img.copyTo(temp); + datas[cv::mean(img)[0]] = temp; +} + +void twoPoint::calcData() +{ + double v0 = datas.begin().key(); + double vn = datas.end().key(); + stagecount = datas.size(); + + + kstages = (double*)malloc(sizeof(double)*512*640*(stagecount+1)); + bstages = (double*)malloc(sizeof(double)*512*640*(stagecount+1)); + + QMap::Iterator start = datas.begin(); + QMap::Iterator end = start++; + memset(kstages,0,sizeof(double)*512*640); + memset(bstages,0,sizeof(double)*512*640); + int k = 1; + for(;start!=datas.end();start++,end++,k++){ + double vs = start.key(); + double ve = end.key(); + vs = (vs-v0)/(vn-v0)*65535; + ve = (ve-v0)/(vn-v0)*65535; + + cv::Mat ms = start.value(); + cv::Mat me = end.value(); + + double* ks = kstages+k*512*640; + double* bs = bstages+k*512*640; + + /// y = kx+b + /// vs = k*x0+b + /// ve = k*x1+b + /// k = (ve-vs)/(x1-x0) + /// b = vs-k*x0 + /// + + for(int i = 0;i(i,j) - ms.at(i,j)); + *(bs+i*ms.cols+j) = vs - k*ms.at(i,j); + } + } + + } + +} + +void twoPoint::runData(cv::Mat img) +{ + cv::Mat dst(img.rows,img.cols,img.type()); + for(int i = 0; i< img.rows;i++){ + for(int j = 0; j< img.cols;j++){ + int k = 0; + for(; k(i,j) < stages[k*img.rows*img.cols+i*img.cols+j]) + break; + } + dst.at(i,j) = kstages[k*img.rows*img.cols+i*img.cols+j]*img.at(i,j)+ bstages[k*img.rows*img.cols+i*img.cols+j]; + } + } + +} + +void twoPoint::meanmat(cv::Mat img) +{ + if(n_save == 32){ + img.convertTo(msave,CV_32FC1,1.0/32.0); + } + else if(n_save>0){ + for(int i = 0;i(i,j) += img.at(i,j)/32.0; + } + } + + } + else{ + saveData(msave); + b_save = false; + } + n_save --; +} + +void twoPoint::save() +{ + n_save = 32; + + b_save = true; +} + void twoPoint::slotprocimg(cv::Mat img) { - img = img/vardim; - img = img*vardim; + if(b_save) + meanmat(img); if(b_savelow){ addlow(img,n_savelow); diff --git a/twopoint.h b/twopoint.h index 387fb5c..d4b927a 100644 --- a/twopoint.h +++ b/twopoint.h @@ -6,6 +6,9 @@ #include +#include + + class twoPoint : public QObject { Q_OBJECT @@ -35,6 +38,16 @@ public: void dbon(); void dboff(); void setpara(double range); + + + void saveData(cv::Mat ); + void calcData(); + void runData(cv::Mat ); + + void meanmat(cv::Mat); + + + void save(); public slots: void slotprocimg(cv::Mat); signals: @@ -67,6 +80,21 @@ private: double high ,low , kmean; + QMap datas; + QMap rmpk; + QMap rmpb; + + int stagecount; + double* stages; + double* kstages; + double* bstages; + + + cv::Mat msave; + bool b_save; + int n_save; + + }; #endif // TWOPOINT_H