From 1a2cb5c5bdd25d7f5adaa0457c19dd3074f8f15b Mon Sep 17 00:00:00 2001 From: 283375 Date: Wed, 30 Aug 2023 01:30:58 +0800 Subject: [PATCH] [feat, wip]: `FixRects.connect_broken` --- assets/fix_rects/broken.jpg | Bin 0 -> 7756 bytes assets/fix_rects/broken_masked.jpg | Bin 0 -> 7229 bytes assets/fix_rects/broken_rects.jpg | Bin 0 -> 8758 bytes src/arcaea_offline_ocr/ocr.py | 54 ++++++++++++++++++++++++++++- 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 assets/fix_rects/broken.jpg create mode 100644 assets/fix_rects/broken_masked.jpg create mode 100644 assets/fix_rects/broken_rects.jpg diff --git a/assets/fix_rects/broken.jpg b/assets/fix_rects/broken.jpg new file mode 100644 index 0000000000000000000000000000000000000000..58f498ad8afd1e5147200f8f5702c7039775e403 GIT binary patch literal 7756 zcmbVwXH-)`*KX)l>AgfjM4D9T5CH{20YRlI5$PZzB27XfMS2qj1cWF>Kn%SINDW1b zhTb7fM39oGga|2LeBZV1{d0fZd*`f~bsTLw~w!% ze?VZ^csOTpNiO-UfQ&Q7%U%brAFL+g0R90S5`L3$E=6zFhOKV&E$Bxbc6zKN`Gv)$Wh@T=ZR7jqkF9Ouuit+TNQdOVNB?*+0a*S^i_!icc?mFhG5@mx z$3I?7%#n=BBEZUaT9aMS%z?u*R7g%Mj#JqD`P;^RE_rQ7g2=r`Q{19wbg&A$07g#0Vtzs6E&mXyT!1*J8zHeDeeR^5j>E+)H~9n zI6d)9%#m=IupbgUezNwvh0uAccR?{EWwJWfKD)OS_SEzQ`8#EKOZF5|t-G#L&bpyR zq3N?!<6T{r#a5UF9Uug`LA1bF7QTg;P>Xtf!fGG0=fp~ zpo9@N@v#1`JEl^$9zT&q`^o!tPP@i~m(lsx0X`AfmxP=APb9GrF${W1o5mH64OYR7 z^r%Fk>*B!VOApd7b=j-N>76@D+wBe1)-5S>-FlK)+#fAHq>$x5HY(w$ z^?~nH)~gH0x72rKjzhPcdI>o}poV7M*X3dTo_H1O5D~-8F-L3t9VXMcQ3#kUb}SF; zckkf~)Gd&_)+v_pIM-8eW-%o^mU+ip*{+bfbE$^S`cwv{oVPYf?bpZFkNQDje+l43 zI6qV~>QB@StTS>gXt48BV}Y$Y^62J5!O3z7PidQpi=Q`Tes&NPcZ7~%Q8$L1iYCB~ zz#&YkhU+Zl!kotEs8ck26$2(6z>1|7_%JAYLWiM7)WU`3zgt| z5|23bPYJAY56x|qOs+*5dW0m4uD?dfW}H#DPe#)>Pc=1H>Z;$wbcM+w0PjA(#!2tw#eo-D5y3oTRBj z$8*URHoA|jsdY5@wodlz&i7;F@2$p1Zw*Cn#`j`M(T)2%bHwIhc$)_T8+(3aS6jxM z^L%iQtACc3Z%2}bM$>1s?!_~L5%^G%>BgHr=L0P6Y0Q?0?T`JSJZxq_wxk34uYm&8 z&Mxow!x&_J*x&!{^AB8=ap!P{ecZ*Yy~}2GCVHpxH0U8BA>NJ6?es zxE_>*Srr+r#40aYx|=$v_9}(EiZ5q56AeCvVDUmgys%VbNtJqv%Y@8dcRX*K=*dH>}dJMSw4S$*7% zm^H4}Z0TipWzn?7=ohkm-|ltAgd~KHp52&pzq^(9y%Wp@F`cHUu-14L6onPOgI29< z-Ff)dQE*N``Oo@9napnR>Dk7Z5SChT7V^Rz<}9OlKt= zTB1Igq7qf6qTjatB=>dM!GyonjecoaTx;zYg?m5FM;})eERvlzZ_ln+5a@t0COW{T zSN_}6Cww>l{;BH}ouY_T>SkhRIhpBzinaFju+h_Cj4YBbEcJt;gilwI`kyT+G!YVAgQHELX@l8_6trso6Y zo#r9qu#@gr#0{|ZtJ1p?G}+P;+n5&JNjG;ZFVDc7m4Ud^Nt#d7*a4MoO)U*A>2@;+ z!S!WUt`OF%&oZqpve~?mMchW+S^B!6q@^h(8HIY{m~8C$HyRJBR9STL&RI5YOl3YO ztGMH+!X{dW5s}zL!+&0u{%l~cIK3Yp%;MCx&>~|Kqq3rsSo(Eu-YLsP!CXQ{;^D10 z#jP~#&q$&`cjz~$m-%2(k&Uiq=Phqk% zB)@YWrBR}&2oUBCtnCa;=u-e83ylw^NXpc8MEZoViso;rK2*(k%Q^tk2_43)bpMPm zQFQnbxR(9CM*-FkrD;dGlTcGVTo3~?_+3=8c_*>8Cl1yVA$0rGix29g-~^u5SI^dZ zLvIs{j-7EHFZ?h-vJwY!Ux;j{$+nPbtX<LM{j1X6oaP`%S+035XBbwPKw7!{j)Gt@;QY80C2ENboY&GxX?quPnu$ zBVRK4DJ{e0{;B2Y%NVEq#PoNd>OdZ6u|(}#HG+4P~3)N zPjQ>vJq663<3>9bpL^qONyrY~W ztAqvlAy)gFrq4Ci1n|bN7+jL)W>Jqa}Ssp!N)B(cOqB$WlSS4Ne@p@E9^=&28Yeay)x9n=z0RnHUFQ8Pt z2mMAHwmA|;3xe*!#XCN=5FS)a{TTSU={L2{|0%Q$O1M7gH`TWbPU>wx*-eNfnNw>% z`4AL`o~)9le-t&R`x`f0iK9ggTT2WyNbH%_uOYa_|G>#g^IdFko?6J6)~-)H6vvS# zo{q7kYKjUWhIZ1A93G}e5m9$2HlIQEAh5*}mCL-Y^2d#&h|7g zl;g$lwTyKhfL;>9-=PB-S13Ei)QHl;3W)LCo=$ZuOu)Z0F~2h-AO53aiR)XA4UaU7 z?9I}LK_3~tKQVeM_nd`JE-xf7_8ffC3v-yPUf-I{Is_x0RAU)*yYsSXZN%sPy0?>> z@qOR>w?$pN6w>~TZoYTTI*rO}$qIi~IX>~iQ2iN*V2?`4g{aLkOncWO(9o$$^i{|O zK4yw~yZf4jP3y13p@S3VH+9?Y3w_tD&LhM~#|=_K85krXcV>EY0_I_yG?OhTkgQkZ ze-!&Wh<2_`&#n8zp+p0Fw}Rw-s)*!9v#$E zp{1)qI8ag>dL^Q>#cqBo`nuW1DvOlLho{=r$VU=!+nnFSi8o3*vX+$vk~`l1t{P;l zH(244A=0`5rh7)#~1FSUDFS>hj=j0^w? z*Rtax48!41jTH#>IQ!HGe?s^IoDJ9Jlk2zUBPLPNfz63G^O=#gCtXTamLU$f6X0Pq zuc;2X*8R0Ttd??~P_nj~R>5_);L`dxX6t@m)9#>{5vUr$saS6a{mh=o<1lq$%_dlI z#k%0qWYz5XyH|9goWK6U0+nm8TvWBZqW|@zX88N%FGa4miJ6Ktu3*A89dM(qp_^Jl zQ(LyUFkq#&+M_uwao6cCPtK`PfOL+D(hVAyCLsnn4R%@HHkBh%ciWmHdFOk8M9YGA zvGGf{V~f8Y+jNQLYIi-Vo4$!_s59lJ_{?pjTM+Db*Kn-!_29AT`^I;$F}r7_wm$#$ zbWcW08p*Q%Vlw%;0Tv}6lQPL+L>2dDVr0fA>vD3b0d2hQL;J7G22nlNvu;xQW5UIa z9|i>mR@w@WMqKsUiKYV>egkktf@23xJkjTPb&=vSeg1)lQN`7u-*A$Z+uw3hHTC%n zCM&O!;y{kXsUSl74L2t8^AFvgy@@}x=}o5wKl^qu=Y{%pGo-q_FnVc!2;G`IVxPXO zh=j91yokykch+jZ#GG%}NE=`^s_e*XhcphqX*6Aw&QaL`E~mEGhLN<$HTYczQ8mS3 z5dYaZi0T5j@E6`-VYw|ULaGmI_VvU+L(&KSv({a!Zq~q;rN%@R7xKIBb1t5O=jnhy zqqZX7(IU{(uDydY*8(tK1g}*$)nMDoYN%#qT_z=V!$6lejP-`Q!X!R|&1yX|p##{L zt(x)sgRlZ1(Q1Vb*m7LhbVy!!0WOCTg12|c2Si~yVD@bY9Z+fBTu(V01WY*|At})T z*}Yk4lFJ43cNH9J(Si}y1rZBK2x8T4%&}#FtbM$Wy*T;{c31oQ#m1jPBii4i^}^dS z;$vkBB$Pk!t$-T_c}!c0ok}-%Uf@kz5Gx?9&A$sTY4f1g_5nDMaygk~Jw;PqBHQ=t zo@gHNI29*doM^6HwGtgTQku0m;*iU9;=ARe_z2wq?V33$SH@1yfH)Y+q_4U`LA1;F1LYg@&~yIl7s!>EWAw9Lrq)bFiz*t7*!3~~>)y6X-fFtkD9;#^6@;H@YkdNj^v;wH&#vXWYH-&A3o2sG>NQNxwo+#2TTHjS2&3&=5IPkn`t0;%wG z0usQyWcaX$Y1d>6ETL-faKVjtVIA^BDdMrV$iNQR@uG~%k;Y_?)(}Ao*_q79JHP^N zYO4#1AX zIM;tl>fkmnWgc|2I<>r(E*}c&v0qo}ck)qi=jA*lFlEh5`=%W^t@F`)rm{^#aw!HAti`!&^e-)2ZX6K)NO)=!dY_ujp;7l z61o#GXN|Hm{q5CAEu);kqLxuu3W5+eoNqC_&N4rJXx@>uadioNR^r~PleZMIS^Xr~ zq;fPKKG+5ZOg$YHY$9y z6KT{eiY?KC#w`>?{POrO7zyTWNiSa6wJxX5fbFH+S1$5Jp8ob?${0Q1KZW96tjVx6pP!|eKi*a0M8+8lJB1Y8^%Q?pFv@M9n%3*_K6#+O1Te?BI zMGl|?cxxHAzaDa=-+OYxjl7<5**G3l@CoG8cfa=buBApiJ$aR%`DsL!O1M)|xp%8U ziD6TH1a)SzhZPM^1-Fk3!BRyNO-rx{*%72ub3%U(l;neIVfZi`iUA#v5C_$bQn|@6 zb6SvL9%7>XD68<@@(^1E2bb8yZ>2|Othmei_*Urpc0nl%Ln?$eRMggprvn5B!&#d; z=O{NmG*cFwA9Pi{dJ(?}klV~PKUuNx3wdlqc`y(2hh?p+knuQgfi-fmThX6BDbs7- zxN~NEf*L7&WoaK&9v0`yOK{G`r-K-~6a$A5ZtkknxRnrK+5}7plM?q#aO<$G@lo>`(LQR2g1B4f)Aii1i%|D6Y8U?z=S5y z3Zgt|>}YsT<*Lu?u2*O7ZPbYi4RacN4I;?*dt4xHCPG3h$?4dL=GdyJ_+g^rbp7M4 zjIe&KoLh4R&lAAcD3{16;tZ~}J2?v$(3`qkz_>kn-Jf*%0u`c)8?4?-b+~1r$)c7y za(7f;d|KSc>0NQSZpFs9Z>%Q6W?vU}d*q>OXbGDBHVv3;HxCIWv=4Vy6a|0k2@D{P z`|ru2PxcUd%~^F#@ue-|duglhJf%<1~~Hv?7UGgkggXju+ute-M`5ZhZ-G2>x5Jv zmBtc;NF&rTPyp%~TFh9FSPPcS$}1;x2I^`Vvr5Gr^tQUV-hR>AFzqF-C_AS|5w0cq zk>iL9q#w45*yJRqtK(=M_jPjm^^!#0Hk(Yj?k^LFUxRNivXd*n6gpg+rr*m-=dGXE{y{<-S9zGY_KpC8$usQ|rP^Sa#!p6)1!|esDKv)XWQfP{PQd?R))l+P^(pSLcC~ z5Y_P=vjinZ0P{rb9T+*BY@OOIo!zSgf=FZARJrG$eN6Gf&ecTa<5#LWatN>OW&lu| z@ACo!h%IadiYEz?$q-mIIl9%B#ifb%l_*ld*XHxIv!O_paEJ5j43ama?vXL?a8;}2 zHVc5`$?(I?%);3^=yyJ{>OO@LBVL)YL{vt79xe!rUTCzc5`NVc{wRejVkMweGNfkT?Cl>6Rf;ky z@Bd{p^I-kJmaCkUpts}~eT~|0b0ywPA-wV$OE304SW6D1MfWJI*_ZziD|iy~H{^_z zcot@=O!Ol$KNTClp;lLi__L|`+VJ8Y51UEqD$+FRS$syN_mESI|74zPurPWR`ZEeo zt~INh3-5kIoMYC6sP^Qg@ZEs7?Ady^k(KUEA8<*yHr_%mD<|xh`%DCXh|A6%?_4>hi zP#|P>s;q?CMy{H%iFf5|60?zyLU!ZILH&0;7M-LD0f&=f9lv7*ESXov8<^mgPfELv zO(9x@&8Mw=!tMclCg1ouGWS;XIpCgKU^YXY)shwv1Uc3m?-==e8|A>5ssYyT+oJ^Q zw`^T9K7lpjp-T0&9YO;G_Rw2~&%qyO5)~Z8-VbsCD1(iF>?|F=Bp5&BmPQ)VEMJ@s zNDImUaBO%a+DEMif>h_**CAO zIo2rFyWFi}5^^s@@p&#MFY7tn@qApHfF-4X#Xq+M^q&Cs3 z=XjbVHLE2x+$b{=mz=47;dp$B^7CVPaHHlWS8>5X6f0C!}@MZjQmoT<6Y7(>=wnkC4 N-IUja3$M|a{s(h6VN?JB literal 0 HcmV?d00001 diff --git a/assets/fix_rects/broken_masked.jpg b/assets/fix_rects/broken_masked.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6f9596c210d5052c92ffff9f0a240e24f1be8b4f GIT binary patch literal 7229 zcmbVweK?ct|NrGV#yvzTvC8sL9?C=Acga!-sg~|ah$W9pT8ga9mfWEUArqBV5*6lQ ztdQk#m81xnuuZ8%u2Ji{+qG-ItIy{+e!qXdfBb&G^E%G+ICtzk&*SxapYNyht$e2x z0s1?4c<%sIQ~*E){Q%_%unkaE`Q3hxs=u4M+V4?AU0qFGQ$thpKV3_Efu@$WmZs(c z%mQtl-wmDVVsvzW|M-2#f48b?sHth_XlZKwXUYH5pnM7#EC5`Ab~TlifU1Ftnt_V4 z1Hhp;HU0w+1^eHoqN=8@p{a$!z@Q82^-=h0YA9$86fwFw3H={XH_$L#vCds{p>K%R z%2*@EA3x}dGI$Yk-7rK>EhtZi01yR6^v=U*GQZTHyW>E*ri z@BIf3`W^BQ2n`F5h>Rj1I~^B)CV_hPT*^NeQ`6EfF>~{-=CcZ}6&Bqoxm$X#to;6i z+B$B11Mkt}#H-@H@+ zwg1vW$N!O+0m@7D_Z?{c=B1*VfOa(lb&VD4G!5N-wL)SSu5?UZV6-*oc1^3ch0{LJ z_~@xOI*ahm;#Jb$)c(Wl|Bl#&|1W0$o7n&1B?NTURM5*)GXMwx!gz`o>8$k@{3zW; zS;Bcl5ET%>ouuJt83_4Hh)fcf2OHOkwWjA4c@mY-Qd z9&CTb{PV-Xf|oh=M(OaaFaTmi$90Vz9LW0|H zX!QW)ds3(uSaB}tK|sL0n|MF{ZnGc4pw5lQbf%^boVm5UIyME-ZbJ9(f}Se@jU1?x z^L4yN3H(!!O=W1h5*Xnz51}SWaEnW!?T7G`nMJI5;i2JsWi*42kM(WWO9iG|^LkBv zjPd{)uDD;&Wy+PyA^25BM)QgVg zBjF{5;f94F4e|s@HoR0USEFI214^K6Hj@O#I<#T6pzA(!d~Wk5Nj8>zE=j>IH0;3@ zQV8iRuXe#oucoWvL5EJdFURE)H26`JY<68F^Mq@>d?S2Pnsz?E`^o0%6F;&wsI0F$ z8;b_+X6@jejk)U?mC6@NeK^~CCR-*DUn*qAXw`_sg_W3Y(&X)-d9FgM}pg~RC3?qT+{d>@m>ANKV3O=#S^}W$*$foog=rR za%3sc8uX&yLhjPM4g@F1$|Bn-nAXxtg!5^9WW@X9Vwa{uLcCG$$&nBSOY_wm7U?{F zA9+=hm%MJ#ANIz_ zKG!b%6i$x&+SCNWth&gn0Re&-{2eRuuGck0bw(?ytDqMavT?ZRz(y7fqsK(Nbs-vm zUP>>uFA?J|{W|6o&#)!O$j+*(4((~KsWE(y-#3;K_^f-+gA|&b>3O=fggMUlsik+6r-D$3GUDr%F=#1C1nr=^dsbBE|!jHVz>9eo|pVMRNe5&gU{`j*gLFO%0 zrZw7ac2-YWt5}x`-@URHo|Bw6WCm4!@xBlR+$kWxTIYVy%ySPHxa#WxtQMI^-v;Mt zs|%jCSfq8b!7J{Pa5;X=@Ns|hrQ`UHQv1pilB8PCMjQ1v?*$gq(c3VA&+L&mI00WWtmzQj`;Fs}rJi3sKi_`m^LDQL@v@IT>&N}v@XfVzXl zxYXW>J^b<@cioMgLQKyCfB)LvSXb7NFtg|7oS|$a zZ{HGscXfShwYM#1#~3x(^W3sG^i4E-C`F3(yEZa9@|CTJ*p5)obdA|m+I@^(Vps2= z7xePy!Fev&?f7g(>D^mDc?L#DMXWr;$?Z9Qn@Mq8Al$rja^)*?;u?nR3Y0C^Le;#B0Qzt)k?MD3 zgWYX7Jtc6QlU$4~=tMT95Lb3Kd)_+~*v8`p4%&pjoi2X$9@nG3a8)KA~{b z^XyWeQg@?jeAlEoL$*MQgIBbuOA7>8)YVC}(p|Cg?Xb}tEddk+fN$Lrp*$b|korOH zNP75`Yk$Fnnyxu9_ssoYjY@a%p|~DP;vZiFE)IMUCb~6gOkTUIT2W8>B~@9>Q7HHJObnv~$HO+@0?U?qTxp%fyb+TD)mkU=eRQg1sE z+U2bHTcQNglmM@JlVzsjw%%C&qT9MdN+9ZdNd@aUdD-0VCp&FzEZp?haY9hNJWn{v zxyYy~gN^beWoa!sP)fUOY)K0mhZTjQ>zm3g_^)X*xE+IGJva0PW>rPugJZ((sE={~ zPPje|dg?&$L_K>&9Z3c$ScFIplVFT2 zj~>_MItbO;{fd`CN!To_w4HrFyj^@{iSJ?}yk{ncPsh!@xNq3}951b?=1zvon~*;a zKniJrY`>zSnIy%?!l8@hG*>B!iEKDll#ot~5#84;;Ea8dxdBkTUBiuErPV&YHF(~T zlc~FP^2hl6iAd)9E!e9BQ3W5QSk3sLSCj*-xsAM50*hLlAhk~OrGv2hJ&0}%|FwB; zyz{|(a$WGAdrK-=PBBI-o-clkQnNXTk-D*GB>SuanBYFOHp`Otq=Po<(_%tGpVYNSW^{N0+3PHQYwD=OU8 zm-+GO{ft_zuGwr-wbgkg5HUMUkYW0f<TsJ(M-Q{4gT4((^K(%u$WvIWi_pO?%;Ep{0R`&0WMRSsv^d%z; zE_X{Yr<&=wPw@9!*un8ds26S|fV;a1n5l$fP1K6=36Xj}hck#bzbEPieD$oYZ){x9 zWqt2acJNJ6Ci@uop>74!XTkgPWfC;sOM?x0vU)TM_`;#Jkh|O$I!(;o97!}OULs|r zezSc1rvA}etKx?KZX@F4mT&iM9e3oeh#Ds|qr&nge`t6S2Kk|U(H9KqQn8vMM+t;D zB;&aBIuS&-rTU3etH(BgoPW68cI!7AglBl9j;#m{cdp)Mc-oHZU^(Rb+8ptOCl z{&p2e>|wN5#ltB67ItVB`tx%nqD@AXM4*ObB1FYH=pf&=WhK%}!nNo@f$ip-peB&e zWp4b&HKy!3D#>U!JUB3rS@k5!&_=KGYF*d;c=P9?B#p{9+(_Xu!Cz3!3d>VB&Dl8WL=z)ke~Hv!GsYGsk81%OarDlABv? zknTJFTP*u$EBt($4)w>?dYj+Wor#H|WY^yhajAa^EK7qI_KQrWGf^;O^j0AWHugkx z%)p;}TNI_p3i8h@G&_h`fj{`GIL}nmqk(t1aQEHXz~@H1p?T}vSD4Z|{fb_^3IE#0 z-rooqyaL#$&RbDU5Y?Q9_+50ZB1LvOyaxOrP-h9l*7d9^&MfnEm1aa6oP2XPIl^D~ z*NO1?%$KPV@kd}qjl5%n-A*3lWzkEI^NP1yk?jFDcWHJ?iw)Ap zz_^CUqo6!VS8~;q5St#S*wktMM;)(N&(FK>ZgR}@59^r~Tp!aQLzAqLU71I6LbSa?+e1EsgX69kFZq#Ba z$pl`(%qD5Ue(1MLgZi3D3<=*DBJ8b}qM>IuL+-e#N9BTPchXkzWU5B(m2}@+amT)A zpdd9NllWy8UKqMd>Nn$uDos9pkX=`GNg7FP8gf;W$g>UIZ$+P*ev3ItGe`}cm~?I~!kwpW(9W+g zTzo=ht#D^d$rIMFVOUE`gxuMYyXfGpPU}<&r56Wnus|?cViL5WgmL$S}*?JM4lHYZ!^IAZd3FQ+*HvJ@XjZ z(&CovB&@KsF8cPQ%V_KSRqu-7r9R1*t=jPvYg+6|JMdFpPqn1|X8Jr>A zm9`VA6ccr+CY_B{#YGM&-{+%meg0*YHqCAFD$KS1*p$1*`l!$KFS%pGkuBFY544SJ zv1GaHCT`ih4bk4($`{>d*ZB&p&@?yYtP*%MdNWC(1hmMidw^^$P~diHsC;F?|D8* zWMq(Pv(w-ZF*})!n?{y(RFjtwFX3Qd+Tb@%#c`|VrpNuqL;Ho%e^$Bm z=(1S5oeuAqv(-DP!Hwx(cjKEBx}BQgAJZ&(qOAecRR7b}jjsKbmiBv?$^TfS0r=Kmoic16hC; z6V#Q!+fv0Xz9<*X_q}Hq2f~rN-DY>ct{-Rqf@jM<=e!SmR!LH}<#b+NhlOpviw3 zTgL@w0-ux8ZyWQco8Wa$z0`CkT8p$|+A*SM4axIlT<8(m zc!yoc4~p|GDK6Ily=b1m8UB zNrrL9UOXf0?DX=+6x%#+EB5ABvK#7izN-3I^E*sypmd+ghgfe9;0(clA4SS$EQZ&J zv(?~W=;H*|II2avA88f!n06GeYHX>0ZMV|{mlJN(=NQmgyI^6MyWjD3mqSdsR#^s7qIohpD|+QrYku+(jPovsy;Xm z07siQGJ#)eh&lQO)Yzp2?&c$}anRZLUSwwlmWc!R@<%>Rq$N{YOlZdxkLYWu?d==c z`HE8UxDmW-ARdF^uijroSU;ASnzcJuuq@+|SrxNgT`hRC2at$u8_y`>PuGZiuo>fZ z8)j~zzDt{SaLBcLbD$5DWIUOpm&FWEdOdpV&1kE0frCqB^LSY5Sahgvwb#(mxLlz_ z35-T~Ehk3n$>vCL5V7@_U}mJ;gZz*@?;qq-O0{yYZp^ar&AGf`eS<-7%yQkGJ(#=c z@4~{v)oC~nAdX~&*wK8UiHYm8Ou|z7s%T`b)UA9aS}!(Xx?K8!`O3G)rxF|`XUO-`91$U(eU|x?Zp6b-l#H;wgxN zvxAcZWWxpsWCQqth({rIkc}JumcRAJzh#re-&%6hCW%d(B{y&W&n2~W%Vw#qQkyq# zk=e3U`fmY$$;wE}{{8cJkpJqsQBp!eQd(-W)PI`%KUL!Q5XCJJ8%T@9hTV{jiW?*p zH;7vyP*6_E|A+?)`(I_lMu|<5o25W8WWWYg1yFnm2~cQBP-3w4eegMClcJ>3t^+4F zE4yBm+I?Ha{K1p_EqhK@HmRQP;piUpy%W7vT1{PJyQZGLfuYe}3(G@RhmTm>ow9du zJniJ{cHyGC$EC}je%Ji32LuKMhu#efkHAFUi+LCu7oU)rl$QQ9BQxvS^XvjrVbQDN zlG4{z)f8$Ct+uYdxuvzOz2igY$KJmFfx)5S5hja0{cUFU`;WPK?()j&Z{8a4XZ)N+(>UuHIJOZT?`3%E>4Bl}%gs z96Zla^}W+0t)^?i(&PSx_8(;bcfg|mzmWYeVE-Ez6Cx|I0h~MuMFruhiSWBe7=DO5Yw(GEQTmiqP*RknPSMf-WzB}Rl$IXE+ypT%=v|nqZWX>#%Eu5 zIb9PNaR=Yz=?f2-d5G7@#n~QvMnoEqGEF9vE28qQV2DO9#`Y}kNJnK256+(5tAtys zo~^pLi%ed+e6$$-*@XPUZ@I9kVt^ryZ=xZqtq53;SAf?0Ne&V*66!f*Nj|Bit>xH@ zb@jg;fse3=K1^oC9c3?n{Pi&@N#>veL^o+!3<37S1PW*`F(ldv-+Y9O>k&gV8a>EB zK->2Cvs~H(oaTwhB70oJ@LXT#?bl7Z>b9PduPZbz`%U;o${tLhh(?<6CJ2GDhZyqM zQZ)GZRJ)==(pqW_7@L&LR zx@;+SQj;-Nm8ZhNCsG*3e0U4pu+IisJUQ~`$(x=(nJYloHNxFHy2*787YE`uDUot# zR-F3oqy-&q&vi13G%~Jj8yP7MAZOR>+c;)iNXjrc@~U7-`r>u6VX1L#Q{mXP+}vyz z?_iv-KuwrWx5ahk8P#%!7JhPD+I2PznXax?HVoRRvc1TA=TYuyM>NN0YMy8pn5o=6 zmsUiwdsNaTogl6i4?1anE<}Y55{J?0@j$*);)ZUyCyI~$MNVIIc&+cY(f=+ zEKFA%`(wVn__XiokU>=3W4mWl%kNgE;{}S!JQxSrQu-Sm4dYy@h@)F^L)wdrgVv>D zW$D^tNMcIY_^R4#BG-tkQxtyS`_0eccOKBpHAwOncmv!QF{G+E&i3$S%$_r~Tv{TD z3v0zE^kJ-;=-Qm6*c%nLLpYL)Vxp;;<?tW#!FuF4Mz|i_igX zIT!WGI&f+r`~sO&OH`V1zC!MDp1V_j@dD92$DLqs(EZ_fZ_u5F>NY3ctB%OQ>=WAd zxGpTX5@PPa{viPR2C*Rme=$Td0JOA+cIY7XyA%5aa`MsTzbqQ+bd#*o7V`!yLVTl2 z`Yme@?zY<@`=R{vkir8ZCjwk&U>`KNX0c^xK+iy+LW4&M)fZFPxl$e0t@W8@7Dham zto@g438e88H&SjXmY;F6(@o!POlqAU5>`JHc@hEr3Nd6Sk|&b*vsVn6N)kf^Zv6i%|XijJE`snhElgd1hirwMC2=0=Lx~`bJokVt1COr6|Ja-`=KmGTMl~L@MxQ5Q6t$;ucnAqR+l$F z5uUgG`sGdg<`N!0dEITb7_bll3M6m?HE~=FX|e|mCk;=IZO9$4X<4`8Gv#SEE^r`dZ3tm^-UYV3427|A=LMm zkP{v)|JrtV1rJ!MH{PVku4#BZw=#ckH#0c&Qb(DOrxS)TqGtRG$X;@T=elbwUW=QM>FN&HF^f11fT2pt z2j6sq4#oUxX`}BGk}TwR1o7gK6u_$uDsS=Z4LYLr2OTw6!^^VsGyg!p!kw8uH~O^7 z>LZ6BNS+ZxZiykkbrQKYTg8ywrT8(Z(7uIe3r?`@?}}jt97y2|cC)Qo5Q*zcZN`k` z@Wfa1)&{8-i^j)$$u^5NLCc@erq3g8;|-W8(+H)mK>CGSd!6bXF=7Y;Kh;l=#%=<< z_Lu%td$E~1mmuLyApJZ|@-_=i4!cB{> z@xoa$KvNG#K0U1nom*}L-dZB@#DpiLf?*5F(j>>AZ!*x`Y_Wo-fped9gARmmnjp; zZ0AQ}k8tH5-4(*wlCKD?abv{5uZ7ijZf$F#kl*y@$65<6=bWnST`=99IXF0f^h2-r z-YrEB^sV-TPW-JS$evho9D_&n!?VVXq+usdrZk`oTw7%a#2nMQCYlZyK- zv;Yde*GY?r2|TdR zBi>dLH+D~c;Q$z%x`jln#7hhgoj9p%fsn(V;oGd86#cxY+{TLvm_(~Y;QvX74=hZq z7NYl(OAv=tlRE`!P3@?)0MXU}wzu6hRG_t|EQqMQxL{dASHTVWs8<7bhO+JJ(odwK zl`z-Y4$&tx!ZL`L1~xoRH^_?G=haxHfZKsOhjG_F=#<`4KbRjDc_^>DyeaaPt|HU> zeu4j`mtomuYc^#Q6>8DeN1m6+iSEw(cEj zRpIPiT>QJ@uLnObFc3pxL53@70Z4G@-&w^1eN9{`7vCa=j815$JBYr^qJ$5 z+pjqJ!#12iLYZIxvc)fT$i@68I>euHryk4A`^QvNx|qfA1zF~y?;`1Leh7eU5<^t5 zavXI8hxWiGr1+gEWtyOaNn^J6dp>-UpS!pxC~SkujLONM!Jl?_sl5DSHcPPMs0*~T z_-;Tkuapa0h`G&eXu7wQ)TkXnYGRW(yk+Ab0+{Nm(XAnmp852-ETc__*3``ZWOBw5 z+xi^Q-(7+tRCGX|v?)zU!Wn^-gx0Z8$v=j51uD1_K7fBd?yHVwBjnk$zP^9mp$uQt!s%|NDGVbbf_u6wDWRYCmC01vM|%G&+d7o>;z9*t)4NAw zy5G-QIURcX`lRXDNB9Ni0L%oTWm}e5lvQ!nwJ*KY!KTxmQsl0f@swovQ*E%6x#l@S zG{HBy!ls7BkR%2Nocs~_OG2_Bl<$GTx2e_pl=}JUBo+d}7~O36^TD0%PI|jkPh9_^ zkp_9+xhGTjlrc5Yg_^cnAhEicLp-9eUZg4Nt~W>~n^a(rs<-WA-m0V4XA1WXcSY#c zZ@;PRQdgg-e6KV3>*v&_5kH}hFdl2bLPGIPR57Ho_<mm!^Oe&R=GA9DBN$Mr`Jin}=>hHT{C!0V3nW$9z5&^k!l`+!5LkOc+L8fJ^!U<@r zNV1+OihEubct{f;M?D5>1$R()L00CKYvz_c!CY<)wvMGN+pWB>S@&wuqc)%2WqY#p z**?2wp)ayyW|nH}4=v-vu{#)Qv>66GPd0eAOofA1w-WVqc7K9Dx0|OAWdT@*4(;~M zFGEzqLk3$1In2R-X(3km$m0PQ@LeKAIgAH}hG=Dw?~~|qUZNg6X9X%JumSEz7SDzF zO*0u#ynT1aM;B zXH6<%J@}h2(JP3)M?Uu%v5j_xKeLu*ou8Ox_`e$O4ugH3qGc)HIR0h$)OBQnSH?6) z41s+wx;Hs8%vhH#T{|y^%sAEwGeF(FTxW#Ii_YT;!Qr!bHk~l8!q7q{qC%iw4=(k6 z#^92kDicFE_Q)h6$N8WxR7r64_0QWi;bi?3VI?Hg623)F15Rvax=<9)R08UGzOrC;oQb75ww&&ATY z%el~(_bRVzp{I?I|7@l|-}CUtG~tXP)v%}9t!#^vt*2|0(?VYz;9{@h@fCVbbq=R0 zhNK_mPJ#vtM(H_5YuIeYe{*vt0QTz%NLioaS6Ahg6JTSz#1JGnhwHfK>q5}!wQdLJ z^8l`G3g44`LJTP)%KcnU=6wZRxNc4Bj0Ykkpqf>YV8M{Zw6Ka}!Pun4)gh4(lBqNv zV%yxg@%yQ)e#g*nADfTZ)Syj1xHlcH7y!AeMz=tbz%zsXzW$gXcmbe6Y6E(gJ>a{} z{16@Fe2>LXk?|Ce=3!58wa#(kTM*lrxG%76*BI5=%t0*^=`TTMWVQLltMJSLT}CQX zE3PJPV#)>6mWR3d&+=R1vKtt&Yl-U)3f%p$<;!5`t!1pEH%6KXl>4UC7r=9i%@epL zCQ_j4D3aFZtev9^i$uGE)*fR`0K^+z_w~GVt_MbRHT~mv@C&2wUh8IY^pL8V6@|;vW0{MfidS>$EHl?wF6yxc`3z?Hr!;C z;;o*-2iGq%kKFWMN%NIe-TehimI9cv2`%;Ao`)ySm z#^T+f!-b7bq$l|?3r*6B(@4&Pnj^wY*!2nl>;-=QBC;G=18%>Gj>76jRn`(4v0}ZSO8i&>{A0J*lGCK0pvr#cw?h<_SOQpf1nU{6FejcUr^@{`U^eOJjWl&%y zv!H3{g0a-g)l} z)7R5@NSiIqT}M9@iPVicZ~tCyJa*CNz@1{5<<~uoI+b!#LekAnB|pm5K;9f9BIYgG!w^;tM6E>A=?f9ae(Jv}Z`z;)9l zL3?q;PZ4p)ge4+NVClUM_=9e=@Kqqesy##g=W)xet#Q3>A=(QyAJX-HuUL)bXS}SU zZZkC*O*Y=-_^smtw(Mg)o;sn*iJAK|6W_*KUEQ8X$n zr~gGn?09@~zDs-bgHq(qBz1&L(x=*F$+Mwu7k7-}8)w&yI_-VJf`j;-foVe}c{1Cd za($2vMW?$ihG~Vrp5fQKxq6iPR5b8MexwadfZoKKfih!yO?_`e3`g+Xg}IGer$!~% z-LW_Y?it)+?v?O`tO%uGAH#mrMT=6ItOd`! zY82|Ol8c_jw>*=Rz3_rZ(UIViZi?5=SSbykS1)I1&4_E{UbZZNwx7<{d_i1rR4d>nHWs>!QT9v3c zLo<5y=IfzPF~m;K_-@{_8I`CAFiOzCGO|k*XgJ zk4uABDEN$a>a3kN=t2w9AJTYY(6wpq;T3hL#Lb%Xc? zO2g^rX@)ZmX~u@W@SM4{iID*Mvtt9zqsR3#Psm2ycN;xsC)#?li7{15taj}%0R2@= zBc{&>SW4H#^>#E*juJT)Hh2;y zhp)cKxGwt2mt3_%2CURL&7hZS(8K(Q0FEl`u-g@W2E0C#SBgx1Lom?2gs zjct}no+bt4Um5|@dM5^K^zwfk@cOenHur0}VJ`hk$4BWTZiy*eb-6mjtW>{Xyx577 zo=ypFdZ!dJqQB~x*eZ=5`RJOQW#VieY}CoLEdA(W_-Z^2eQNv(4@6^Yi7DfOTs!6@ zEMSRg_P!oRj35J2(|W{23zWB~kuEiRzN4c)w%^FS{m0^V%+viI4tr0_7C-sZ#t*6dh_-k($x zk~4XZuYx))^~y08V?0{gQio(kryb3UIBK!!Jg?8?Z95{6`c? zN3VZZWemF_`Q{P@h3aHRS<&EzN=KJgZ@-#LHK==#aTibhciG!%JNJIs`q1FJ7k`eu z6GP&Uj?Rx|&CJZw4rNixv1>J1L%4>8*HN%HD|qQ*E3<)PL@NWcV|BvOW#;$ipdHl1 zsPT&?d~1;M<1{hyQ`?@DplXOpjaOd<`j~LWBC;!~A;-RthP{RdT@96uI6rdfQ;Bn$ zk6zoms>bSPEe=%%Aa87Pu`yy3b?{Bzus|~jj8=WUKW$p)Ff|=XWktVP`=7F~DKoV2y>b_&_m4TQrEI1SHcn z1$VjMlfr~{-ke_*B|v=Z`aWB=0ZVtk@=2zrBkTEML0!MJivfE|GJ#JBA1{;FvsR@O~}`9$~8zY-_&RR6)x`~vKT5zseizkle|4Qq!h1oV?F81;c>+6Zf$TR&`_kvIE&M;Mt&oOCT zIJ4j~(>*##!3)$7qOCB#r>JKTN$u#E9Ij~29%>CSUVshf8B&F>ae8xopg#Qm;Z0tJ z!?xLL6S7RNBX{`;S2_;}zomX>Ax10M0RrV}B!D2#O;*ac3^&Tb5*kAbg01po`b4`? zwz`!yw5mR;R;XTMeNB9E_h$e42{t^rde7PLElNAdZG?{A_VclO&y{?eKYy>cBqQVW zq0w7Ty6N|-zkFV?J`yW^*U;_txA~rXJ!I9u!G}3F&w&p^YHDmx6eJn{AiR(0P~I z+vqL!5_JF=^d#xvl$T+*0U`MUC}7VI!jO)0y5m+qP=xXheTxgdT1Nx3f*nX7bU8H`)Lb=qrxk!nQe&D-kFAQ-YqKAslh9p zq%yH+Z<@e26YW+4-vwq?dXG1v#1QOdF@&4+9>@oUXaFA+VQ+Cv)|!`6kW_lvw7l#* z&V!c~k9EtRtB;MH%-HJ!%|RclcGU0mOSK={He`P_dPBw2A4S60H2hZ+m|!F98)BW> zLR^)Eg9Ek*2yepB%snit7Bsy*)btY*BoQw4bns1R*CCS(W#Sl)=H^$vk5fj#D)T|>0Y=&$!! zm}Y6o6eeA`<|o$$o+XT)me8&~Ik)@JcJP25`i$a!!8{2FRwTjIT^)>c$?#JdnX46* zaay}t|KWUX>FKz5F51<(-#g9S`Bw_hJM36BoA}6fGxj#OYpqQl)PWe%4jvN|FDx@C z0!KC>o>w0$oXk?PgXY|ZC1^SwvfpvLeD?5#i#s5D*Vq= z6qhGPO=B#LWqxOy$T;=>y3+9~I8n1O-Z^n#dyz5mU8m|4M_xl^ZsH@u|wwo6}M{H@zrx4lm04L%27XHN~U&Dg%K! zgU1v;qzq$^@lCw~^K^PlEcnUB@-h=B`ksNiD8uiy>gE*9@cc4F&?fSJ)9a~v>E`ei z-^&trpi5^- zw4{!lB_4d5=JN4QPSv}N8G~!(ykBAeR5j`#&xaX>9&yqgD?ZZT!1H)fbgeEgX*5>F S)w{Sr#nm42e_nX;$o~K~BIEY} literal 0 HcmV?d00001 diff --git a/src/arcaea_offline_ocr/ocr.py b/src/arcaea_offline_ocr/ocr.py index 801befb..70300ea 100644 --- a/src/arcaea_offline_ocr/ocr.py +++ b/src/arcaea_offline_ocr/ocr.py @@ -1,5 +1,6 @@ import math -from typing import Tuple +from copy import deepcopy +from typing import Optional, Sequence, Tuple import cv2 import numpy as np @@ -10,12 +11,63 @@ from .mask import mask_byd, mask_ftr, mask_prs, mask_pst from .types import Mat, cv2_ml_KNearest __all__ = [ + "FixRects", "preprocess_hog", "ocr_digits_by_contour_get_samples", "ocr_digits_by_contour_knn", ] +class FixRects: + @staticmethod + def connect_broken( + rects: Sequence[Tuple[int, int, int, int]], + img_width: int, + img_height: int, + tolerance: Optional[int] = None, + ): + # for a "broken" digit, please refer to + # /assets/fix_rects/broken_masked.jpg + # the larger "5" in the image is a "broken" digit + + if tolerance is None: + tolerance = math.ceil(img_width * 0.08) + + new_rects = [] + consumed_rects = [] + for rect in rects: + x, y, w, h = rect + # grab those small rects + if not img_height * 0.1 <= h <= img_height * 0.6: + continue + + group = [] + # see if there's other rects that have near left & right borders + for other_rect in rects: + if rect == other_rect: + continue + ox, oy, ow, oh = other_rect + if abs(x - ox) < tolerance and abs((x + w) - (ox + ow)) < tolerance: + group.append(other_rect) + + if group: + group.append(rect) + consumed_rects.extend(group) + # calculate the new rect + new_x = min(r[0] for r in group) + new_y = min(r[1] for r in group) + new_right = max(r[0] + r[2] for r in group) + new_bottom = max(r[1] + r[3] for r in group) + new_w = new_right - new_x + new_h = new_bottom - new_y + new_rects.append((new_x, new_y, new_w, new_h)) + + return_rects = deepcopy(rects) + return_rects = [r for r in return_rects if r not in consumed_rects] + return_rects.extend(new_rects) + return return_rects + + def resize_fill_sqaure(img, target: int = 20): h, w = img.shape[:2] if h > w: