From a1a2cb0aeb4101bcf08b0cf876d7e77f8e7cf32d Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Wed, 31 Oct 2012 15:20:49 +0400 Subject: [PATCH] OpenCV Samples testing problems fixed: Memory leak in color-blob-detection sample fixed; Default face size in face-detection is set to 20%; Error handling improved; Some possible mat leak fixed; Manager verison and engine interface version incremented to fix incompatibilities; Docs updated; --- android/service/doc/AndroidAppUsageModel.dia | Bin 2700 -> 2571 bytes android/service/doc/build_uml.py | 2 +- .../service/doc/img/AndroidAppUsageModel.png | Bin 32787 -> 30468 bytes android/service/engine/AndroidManifest.xml | 4 +- .../service/engine/jni/include/EngineCommon.h | 2 +- .../src/java/android+AsyncServiceHelper.java | 2 +- .../src/java/android+BaseLoaderCallback.java | 6 +- .../src/java/android+JavaCameraView.java | 117 ++++++++++-------- .../samples/puzzle15/Puzzle15Activity.java | 6 +- .../ColorBlobDetectionActivity.java | 15 ++- .../colorblobdetect/ColorBlobDetector.java | 25 ++-- .../src/org/opencv/samples/fd/FdActivity.java | 5 +- .../ImageManipulationsActivity.java | 6 +- .../opencv/samples/tutorial1/Sample1Java.java | 6 +- .../tutorial2/Sample2NativeCamera.java | 6 +- .../samples/tutorial3/Sample3Native.java | 6 +- .../samples/tutorial4/Sample4Mixed.java | 6 +- 17 files changed, 126 insertions(+), 88 deletions(-) diff --git a/android/service/doc/AndroidAppUsageModel.dia b/android/service/doc/AndroidAppUsageModel.dia index 9f714698569d8639a8271c1b42e3a50df6c0bee0..0313d5c642d217f0ce3a640bcb77fa92d630627f 100644 GIT binary patch literal 2571 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 Gr~m-^@ic}2 diff --git a/android/service/doc/build_uml.py b/android/service/doc/build_uml.py index 9909a73c44..df9eb7bcd5 100755 --- a/android/service/doc/build_uml.py +++ b/android/service/doc/build_uml.py @@ -20,4 +20,4 @@ if (not os.path.exists(TARGET_PATH)): for filename in os.listdir("."): if ("dia" == filename[-3:]): - os.system("%s --export %s %s" % (DiaPath, os.path.join(TARGET_PATH, filename[0:len(filename)-4] + ".png"), filename)) \ No newline at end of file + os.system("%s --export %s %s" % (DiaPath, os.path.join(TARGET_PATH, filename[0:len(filename)-4] + ".png"), filename)) \ No newline at end of file diff --git a/android/service/doc/img/AndroidAppUsageModel.png b/android/service/doc/img/AndroidAppUsageModel.png index 81d03acaa8e074e89fe2c28c17c0f77110f8816c..b5ec637c7fe1f63a0eea46ca48477cd759c9d855 100644 GIT binary patch literal 30468 zcmb5W2Rzn&-#`4*K&7J0>=}iS%%lj($f%T&nQUcmDwW8Vk(Dil?Cb_bQW+&B%F4_Z zWjycWJn!pzuIsw*=l=hn<9fZWvvN3&-}rt%pZEIwZfj|(Y~Q+PD?t$3RZkq(AqX-z zg4nQ|as&P)Y4W}@{zGo2rgEHEC;jh!ZB8^na1g4;kDc~Nn)vE&sN1zJKkdH3bgvlK zeUt7$dTPmi{JJZ2;|hZNf}dPIlbtgJNa<7s8fgTSfm17 zWauW&^r(nGe+GQ+ovOR@c-MySt1B7dmz{rBPG!#a_qYm&rt=@AjR zM%hfQOr>z*ridA}f>$osF=bi22{dE++K zD`)??v_NQUTCds_uI#k5?;!{3g6`b0D;xTe>R)&19UCuimT>OYv4unG$y{`;BVi)Eyhp5IWNC;m#9$E;GTDX%aetL1`VbO9C=~zxTWQBjb9%fBqu* zPPU#Rx?5CCT>tn*^#rl35WVA+WszKlUax-4O-@WWIXizTi_OoUd~s{%j3#fO#Yq}v zQ7Urtt^yVVPhWn+5NM%6!$nT;ol2>(?#M2$=&SLZ+negcRpLagu%5+1 zvym`0HD#8tvr=m*toyx>hv)c5(sdCHYYeh=J((xxy|}creMoXWzVeGiW5BPALUxA*?_ z^J}Sfhlnxtm>AAVe9z=~VLf@k^z?LvV_(6!qHBT&`1z&WCK!`7`<`6MFx+-L*Im0b zh%DfNZjOwUR7`9vo1E9_(#yEm3kwS!*%~EfWp~Z(DHkNRGK%(ZWV(8kAgyGnz+)$b zX+_MA+HpiDCvPVN1O)#6r^!1}O+zhlSo2u4+Io69nVHA6Pg`2@;p!Nvi>incA{SrN z8W?=3s**7>`g-%`P1R^V(>jjM1zI=Sjq5ushycx;0cvv2O07@YR4cL(WCY7|4xR(W zdm6Q9&lnjAg`|8LdVP2Q+>dwblNEgv6BC05Taq=WI&Y>(!StL`=94}RU$bV5~C z_0*|%EiK;5v%GOFlRgz&mGMt1Dz6$E8rs|2ySqJmo?Kzsq0+0w$zzZl8b3BRHZn4@ zd#~o;;Gnpdnt=iHrF8~tE34cG53EZs4>m<^qZf=ncxlIxuUiE2!c^`Y<&e7k?P;u# zL6hT-#MZ@`nJaE?<;BHfl9HE7x?QTc*hfZ*BdNyc&nF}%CdS3ZMMXu$$1e@HG7}?M zVZF89m)<4`Ol_cvBFj@OE-s#!oK)R;;lc&%x2eARsdIX@XYK7L6AoUwNyVg4r;JnS z?>F;gxDgTK%3~&MT=(d~gDnKhjvv1l#&rrG=;1)6{8pY^y-G&Rk9SSs<7W#fIjwEn z8;+}}>=zIqJ8EKLVq}yoXft->_3PI?U%!$a)zv*HEq%Ush=b?QWJr7n!+|JnLF^c@ zeYstEg@vhyZ0U)|=N{eK$^N>UB``CC^_Dlgyx+vgNYlWKf}&!DT{qW|xdP?=v^3L~ zcbKkRxssio&BVl1RaJ$rPJ3%(+d#SLTAJc5OH0e&fBvM(d7u4waX}v^=YHi1ZcXYD z-`|ZP3`0gc6p}xDoO>M^8JUof@bTkEl`xh_>tnS^d3iQ=c7h>|!J(n6%Rf^8eq*+_ zx`syR?c1uZuC7i_#W^{b7-BxOC>=lUv$p(WadB}c`;mqg2JP^V+1hW~GE^Qud}w53 zBx+psvOP;JG&Gc5&dX);^C8c!Yg##_0%l?C@;iuU&z^}1ldr}F2fs#X-LdXBN4a2_ zKgIvG-rv6|f)i!hf2MzPB^SBtRoq^4b90&G3+K-_TZoa4h_&-KKc9fW7NVxMmiLF+ z<;xQs0O5QP2kteoFh>C8Zq_pZhb?n%)z%9Gu)w9FG-l9U=*xD*B*!4VVd-38$Z*T9% zkL9DcTHn2+Ac~EyXh?S1ow3-RmX;CF7RVV#e(k~X{Vd|Mc+?C}<9mbXu@Zftg(#k$(QeLMOAx2dNZ&A`OOVb`(F z*;%LHbT)ZE^`9r|e3qR|O*xgc&!0b!`^#|1?eb-GL-yl`f_~F%y|H7*j=_(4*e1Aq zZxarxoc_@i$*n5)XK|8Q)a-c1&ZZx8=+TCThQb$WmR6RXXDasC7i8s0vAq5E>^hcQ zqS3?isJ7$*Sb=H|H?`b9{tnZzw-+K#NcAthlV8uw%zTp~$4pqhOYxofBzkg!dbYnY zq^z{G$=DnaVQ|o*xg`-_e^O0N)@krWU!5=6w--C*C%OvR3H4-|51&3U5_b0X8#iwB zUmjv;X6HG0a1LLE+0x08!%8;e^c!~)l{t(E6BN^9xrnBj#)$3nX_l>oPWH< z$}D&6bFj9ywz2U7K(MUfO3UL_i!HTv(4Y_5Ola&aR>-A@eEvxLRXDq(q$Inv6A!WU z=g<1wJNX9>9;CZBi*F9Zwzsx^FgT<^M@P3X+Hq?zt#)T$86RoOn3JrFJ*H9E^9=y+B^;aXl^URl|p=;kD8XG_#v;IS&#aTZoqBSS;{Qj?G7@ynN| zu|v)Y#ugS9dh8Y7BP1$X^yJAoW8*#?X+y){^!FF}em>|G13(12+3Ibbo#Nu+HJ86D z7#gx9=%4m+-j!#QnZ?x@IhEwIPPuS8pN+b=!jYZWL{9GZ%|z_hi`&3Sf1G&24ByUS z?X^@>2g(#IXj3ig`V71bmAD{sGc!FibFi>}O-EZB{WsQKh|<+?oMzzLHxqMnT^$`K ztSDiAN*eT98p=&5H&O1KG-Jb`#f`B6y{}!ro}85Qv!}9S^Pw~#;`8Uu(K0X?*Lt}= z58N^NcpOE0fGw(3$saGzF$#MQDb{7SNAims384*K|w0w zY`*>thQ!zUetv5o^9{&MP%x#2SjR>`d$~>lu>eX&rKZ+<%$Oz6ced2}ulu2GmX(zq zy!3X(e|>7b8C_Q9VLna9qem>ecfYU@GdDA93L;lEQdE2~(Ot5>GIz?^d9K{JM^fe8fA&0iBE`y@92gkr_EqGzR>g-fl`(_ z8J!itq?rHVFKiGgpQXpOwX2Txs~_wA*E>5;zhTJKl5x|X?#MaStPwzb8ys{2MEm{Q z%ld+A&$elg8uYH)d?QIxSGW?Kw{a@9|77K*xq6fuXn~FGg0?mpVJG2@ORlM@i7y%+ z9;PB!+_xpy1SlphG4T(U5$KX(y^-^7c~4Ywu&!tjadoK6m9j08~Z?CdnCa2OgK#7*9IL*aqT7ZQp9An8Kc zICJK%yAVO3>SFgiQ(^ZV1R(tR)4|4O-&8Pll+Xhu^>{M1(29Q?hE#v59 zRyF;3A&}Z;%l`@c1Bx#%FMBUea2786)Qv=bAR=O8-PTr?9h@{c6lw#DYqmvXqi5`3 zKa$ikBqJ*u&LS;#=+K#!wuNIW$f!m;u!=L`IF*t%786Lw=;)}Yr{@9Vx9iS~|41{o}{%HY=T; zv+l|%J{)z&6&1~Y&yTjm3Zd->*5oOGT?mK9 zTh6F!Z{2gB0wMf(mwL*L5v_83Y;4eoMxppachK#yu(LWk8v>p_J-TwkIs=CQZbJk_ zN9&@H*R&ivaZ|=skPr9@6-XgXL{QKUyCu2Lc3iHwq@=c{27I%&wiaSS`lCl$&eu74 z+Gm11SC)!0GPuKEZQH(`E>)VWOj}d)ZM>-YzWw{V9-S}o{^j5qcRfPgMTB&P-lr*I zMXau_qOtE^DE7LI4g93KdfTRJnVCGNPMspXb>4OQxRZs2g{5V7S=mA)w@RjgR$>3d z1Xk+V;Plu7#=Rpldje?{Rg^^!9XiCv$M@mGhvw$yrHYE^;{(sI5B(OqFQH0v3XC`L z52FF&=LH1?@duJ~9zB90z(;(l^{zO|5#cUPsd`?8Yj|m9fS_h!5u7yhde9ub7l4=H zz=fU~PhIR}o{N)V@qd0z{TLja2M}3VnknYbWk~NBB_ksvsCVz?PCI|`;?T|Q%wcSD zpU=2*@@&TYaW2I4;v%13&!M5Qv6C5XR^s=fqS^z=ugcdw7;Bifl`N4V(~x7PIuL+CDfiBq8CvhsRR3Mk4rqRx#G|(Q0l!Ztjf)ZVq=^ ztDdoMs)X!g{RWfJlm8+)57pZaRxkdZCmDJrM$?|D&i@s;63$0h~gI8t4g zNNhDLf{0^y_AFl>WR5oMt)X2^y47%#U{TKeV`baq?5q z00gDj*x18tQ&7q{TYPw-HnP;=&f>_)JHJ`9p1NZACN25 zuY6#(Z=DZx>+0$>-21ZC6WY-k_MS?KSdV&ejd#8;=JxI8$uAWl!K9ajWA6&?8xUc~ zsEfRO{oVa~e&901`)!vN733~>JKC6uFcKW51>_723^Qx;>nqM}28y?K$T<&FdA5GP zT(`dFJ^OpKBL~1#A#EDxgC3YJyAkL^{LrC9hv(0pp>+Cj6tW-oIGWReYTXo$!?6@$ zbnL66b4*Q5Ei5QtV_?uTFxamjpPa0b(e}Efr8)dCTexOUTx@LA=P(v&E*ojj*+Hmq z!RfgGS|9|O+1V1mrNY_dc1`7dSW7GeBO|a}trn+uE6ByD|E$}#WeX=m{_u|^*qY1uC8BL5UtAUx}Z8(BtAz{@7&dw@!&ji44uhTLt}ef3$K9gKN!fK{Qe)L7c{); zjTAeeMqaM$!774)bMfNEG8vnA5mN;%t@j7&SDe7x0s;cEJFf3xVyg99ttu|oS&_B& zUT?tqBs2N==zLL8k+!xrb{JZr&yl|7=G!c#Hfnn*UD@T=mIg9aqd)sTaeo>>Mrdhi zaincm(%x|OCfQb4msfk8z9Xx!n$hAJw1 zg@o*(+r54J*29!-?Dl6?(ZSqH5Z(eMzEn6~5`pqyj?aR0(C7Qhh*>tL%?h*(+7uQ% zZ@pft#I_wfjzIhjX+(L+YO?~UZES3Wh=P5J4g;;rp|h@_z+qwR1Hb}sJ@%xqa9F0g znOQn2X@0&?bTi9gkIPO@PHHzclaur9-HRps`OTY0-Q-)gYyoA0fThmo49&!1!$A43 z1GHPAnSmOdJ!`Rre7g>{5Ua0UbDi%Wfiy)pzmI|C zzYV$LwaMw2VRd*Ty5`2GC{UX=kg?s4iM8!2APY!LG$@%W?w(+kb@N#sii6~P=-|N@ zYExP}+kf7aIMat$g2%aMd ztdAHs(b~=|wK$Mbb#?XWQW~AZtheKF#UVhJmWqqjs3br8F;~C#+m@i*vEwD{sZ0-< zUH?LQlr)p?@Ay*bd`VL?44wS>jcr3l+Z5Wno>hA56&OleG)1hetU!`ctGIt*2xO(t zXKs74=K9a-DR>Sf5e;t*(ms1O?DlO_u>?_3QH$f(KkwhW_tNK5>kU^)AWCK}r6u`!iz0xJLsKP*L#3*&1jDp0al>=a zOp1?;6t(;G7!X1|<#2a*x3s8es@E+U}S@>IOYGu$t*)1ICr^|$Z8#Kgq`hpfPN0C4Bgy^KO7 zpqmX2_^PMJu=fM>Y6~%n2TD}W24>PTGEkRR0Wk#J9ulB&0D^Hs1`;0ACM1zlFG95; z$l}taob2r0Dpy?79Po2~+Sg|Lqasx+7^!a7Wan9kC1CYKMPQb7dsJO5%jR~hHrS3k zTlU1slY8X-YU1L$u>J;dOKUYLF4Zbhrj`Hyu)&`HhhvtxL^B7J(NeuB(Ca{Bcsy=R z^Iv~f3S$I{_KXYAa?EL>F^6L?wTpUe5(EW+y~6&>B9!iIM^rj50141$BV#&++SqiZ zJN5PcxX8zkAMdCDPJs?72AWk+2y0BOjmr|Nhj@&Z1CBB?1mgm~yfL86w(E6{SfCfL zQV8STy?Z4kEABzD+L(Zv3o3;zCo3)8{7@p$ixY1kJ{4cwMzBa-J}MsZATN*W_VrWY z%DEwMg2Y*y{-#B5ZY5=AWl77*mYjP8l0$GD01UcLb6qP=d+=6L5V_c(%3mf%Fq0^O z1KdD>x(qVi8B__>V$l5*Gy^-!+1VS1h9dU$uh$Ted~M`&WvZZ1!^@P{BWn0zKr+ov zPcuS`3sru>Nu@BG-bAB|3V-&jaz-2K)bGW~{ZmfVW1+MXX87yj!-tzJMA_KbfC}Tq zij}obySkRuJUl9-bM~yISb|Y)n{e-iE{^5dkv48`Z*Rh5euO6bPNz2QT`2J|D^gNY z;^KbI4yg&p?Vn25+K;A-<<;8SD$NoW5)zV=^8+~7qDpCV&3wU=C!bndg(M~2m!`kN zWFfu{4Y|U>w6z__qMN}Nq#*F&>FHd{XFp}kEU!R>D>)}P>loB(NwIlzGOPu3 zP_#^_z_Y^CW&Qa1=FOY2$@={MOoHw~es5Yo34Ckpx2#n41>|cJaU(e1a_+{{n9-U? zj|7Vcwh;exW8&Pkb9He^cd#9{GBqV5pmcF?+%GRbtDn4Izu`m^L%O-ZK!5)R0wPg5 zFO)U(oOXe#-8cVM&xODAKxqMoAq#l%9Wq93OL<7uQ>e3U6Q9zuvNjXwr)YO^Co8tn ziRKS)Yr7hQj@8!D!7S%hYNgtB{Eim?;N0@AJ%&#%e+N)27QP%jbxH?UPeeb5Ba&Dt|nv$C=*q;I|0vVFVjl`B9N35PvrA&M)l z_SAao>FVm1Zkf?m2Sb8Zv@kzkT3SlJgC#yXn%i{uq${ijCk~LzN9J<(Q_x1eP*n*N zGcz4S!=C0|S{}2{cMlw|)_K|3coAG1Js36`45*w2E@ggNc#;wF6HptVDkLAgq?z#n z_#T^W;aA^0#}UJSWC8qjY0nrKKq^u!?g7r~>WXU_s)NMV7)C>mp%>ul5EFWwM``-PZ8NoBC1@9yK<5?-sn52;SV z+1=rO&8q;*jO-~)a+w~*oxR#oC+n#5v+sB`tU#vun^&Zpi$aKm;p>5#4E4m&$SCor z7Jj{_&NnfMIXEl~FpsY*2NnO%pFh!txp{dfPn_VGWLAO@1&wNtqyx+KXG`!h8sb9O zLzu9S3kwg7YPbkyXK9qSp*E2{{qUj8$d>blwxQvp>}=(nj^^&`J4PPJo=onRx5+c| zRu2mc!zRsr_>fy3{U4?^*ejYlq`=*~qfr4R^|SsvP)$l!RaZZ)r&m!{c2O(=8VMv- z2kQ*z{iuBzD&euyD?NdMo3OcUZEg9Yp$w=OOLi@4h>!o5IMP#47V(^9P($^{J%vmn z`ytXL`qalvDcqgJ!qu;p&Od;t5b6-Bn}#5;Apmt_+olbkbT^F?;;8??Ix9tS#@4gV5tP}jSQ5}@5)lDV0Cizv}*K;2%rkLwcfvi+s z8F-1r$nzm561s(8a^~S#lo~js1W~#5;g>3x(J0`^7y(^uf|l2>=>^Yy`|-oQzhTR$ z1FxtkEKGBh1K8FmIVg&#EbyNVORd^~c0CWLX)k$B=hbs@)VYRy6h7h3j}7_HJ*7`M@z<_jO(ub`2vlvt;d~gr45E zLgRWYphFNrziVIl));}tS zH?-1&mTx%r>z_Nf@_W1x^cHX(%^fTe_J>0YeMxaKN)~LeMh4Qkf&4*6c5rYYreVIJ z^P#ObzI>^fBqb^@Zwxo))vH^rmOqAu5W0Z!X$h`9XqFXwq!G88*?uzt6|lH?7FIV* z>2j+!F5;V0B@ltd&Rl^*hsu}^TEYl1Ly5}KOui>}G1y9hs@YhfBTC=qly)b&5cF3a zU0vA7Xa|C0#?Mvi{;3e@|4wPHzY56gYEoCUzGFs)TGQwOEY_ZTkdgaFHk|DiIBfG5%rfW#YZniT$)& z$v9AyPrHu1=WH_o7Y3b;DtzehTj1W;;1hm+M?#gofe@9nfex{%(#e!ErfkrzVcSYV zQnRvpTwYG{mQf87<>)y)zMMq73`}>#awgTwIjoIJCj!6}`@{DxzR) zPDx4{s;ak}Ef&kIdp2!2hUQXzmS&adw6-=r5-)0_k1YQx+lU*9;@G&j(jPz8I)8o{ zJ_B&7eGgY+D|rCY88h1Uo}SV~kg$t{hzNDr2#BWCrULr$(1l&5{v1>|5RgLzk7U^cJ7{{50) z>afruUn?qJFJ;h(6R3Jy-5oCICs4TwoyKBc_>PgEG%qYm9KTj6EgB{zCs&(TzA5NA zFn*Rl7?L_{`7bEk%~7BTvxz;Tet*5t1Z6LO3kVP28P}54G1^}r2zUnQ1=tRi15i^? zZ~|o*Y7G9`)HDLfk|^m&FSG(x4*eEs8C5@?=oiu9i%241apDI2Ef+<4%YG@QLzoN> zv*YJdRZ>)9@cO3Bn_)$Fc6CY0%F2p}XgN88q#{SLTwqk)z)=26&FVod(uO3ld((!iINiin`qph~JGMr2Sr~tP`SRwSK~(O(#kIRJF)AAJfSs`;EL$ z!*~7sT=wwMqdV_@pq?Ip7K=Wc`E0N`dep`1=+UQu{RVP&4Aj(!+0oL{^3*-9HC9lY zM0J7!4wHKGhGR-fn=7T5iO+u`nLXE5q=|@XF4=5~<5VtZUe7=GvECz0v4f?lr3JWL zoB*qKfAS+%*cKh^pOO-ZmjY^MWMqVds6kirPR*4>juWa)12xt`4FNX2y?_KDH6 z7GBDgEpJ2I_X`<$0h}HoD5H!d)%YxdJQWqH54U5U`B-m*V{Xwz zO;|1dJd&A960UD(r(c?NQGOT3n5Rhk7&nv&b-vxxoO^3;j&SY;GL3w_+`z^zdRkVO zd@idN`{t#I2=NUuOT-UOl;=Hs2!BLvF-+~`$;|c~uH#f6hVf0K2*)r+iLI@zc^E2d zU$nF&NvtHWbT2jaK)wSVk6ErnCe^UoB_2M$s6Qh|mcCuzuUF7i&BCJroqZL3i^Rxa z+7zJj1t;&%#|C z_ub;b=`w!Tb$^i{nWY~JHht^L`)yN>G5@O>Z*gg>t1}iht^;;=g~Qh>PzYaNIf4pY z2i41>{HQ>*gPAKu=u0svzsM?tC2&`_?-4)od!0qQ3+@9#l{HR7CrjoQRBs@)8WbG7 z6@nddERoBi%^`>mEARAEPL4@VPQG`~3wAer7l2){Lf)}qD1_h~SpF~3OdWcp&adn6 zTQ&rodrc6-+aQ5FM#>ifBnz8%#Jdm)9#n{gJlC}8Vel#w&DdM7mkswQ)7ZBDzp?Cp z)1v^w??ODW5=WRC!EC#}I-~iINJqU*k^8b(fYamf8ouD&Wv}Y}2Rf@U3|$~GU?Ln~ z!G+p=UM(L!AVw5ZgQ(6PV0@?-{;Bq15q2gG1mUyrK@W2Os{vMNr$Hbi0CS!e20}^u$dMyBNUT!`M%Xa659Tbpl4V@Sf@rue)Oy`b zO7auflBCftfDiJ|;{@~Yd-uR&XgJM7y zg34HdJ{Bv{=JFNS24NH|_`A&t2)(~VDF$oytg7)^ek!1?bJvbNxt2vkKAHe4ZkKyqO zD+rw$N1?5j9iyS^ zeSkqo_fEhq0_dx%y7y`z83F|lj|D1EdeJUyiBg~hC=g(jhY?Jg+|1oc7R(}wQe|&f z>HEix{Q5H!5#`W57tPJ*zPk67T~XQ-N{`eA1B0Z?$a@gLGMA($S+0nTB&DPjJbXC* z{ky37ODe3pEt7~;oGrYNpOf>-tOyjQzrX)p_8SNXsQLH^g!40zw*es8y<0Jb<#Q8! z9VFvWB>+6S7Vpv698gMm!zmzOjnxIJG$>^y=|0+?_5S^PK>H?y*)mllRYV&QmKZWp z2*FysP~$;HC@Cpn&CV?>+;vx?R82@%Qb(W+X|;R4`-OxivCqER_;p{qwgK1_I2C>^ z94LJkS9yi4itTUx!{-(!4QAuX0D;=1X(MqzarduOk`&06teR{r0=x!|HY45TjdT~kC3Y4y*jdvJ{a}^G(A&meA8v>B| zqYvRlSnDqZyn#aOuY8h>hv3ch+_5p62YTE_s5Xi>sm_<#e26pl6PVK1PlNVVP#`?D zk2Q~;D;@k2EB;X`i( zdX{!=-yRB)3wTt0->H*GOzGcYym}N7>Z?Kq*_ zPwp4tgQK&nVSfxMoT-Z5}$Z2 zEPe zp!)iCOdkyy(b@C@*<)S-@LWeH3ITNFmvUX#M2M;F%Z3SW1JrsslvKrka2E`t^;Up}?oewj$IlWhfR$snx9{QDc9qJ#Z&PCyo;#Q&9vSUT z0pz%!mGxo5pnhdG1al)W<`5hJu!B1Lq>|s$`3>QFU)j7;Q);<=08__d-vWA#Ik=E?G^^u%?MiHB%zYK+q+V(?v(pS z+NkpD=Q3N{b!Y%-Kouv4c6@^?519?)PgzJFKYC>M?Am6q*1hNtKJWT>?cObS_^@&~ zTQV|CMn;GL%SX@ju%(xQYQL|mX= zqV;QQM=s4`u>+(6e%!cq3sAK+;ox2Y0adidNjYwwi+~A4L}VoA_gy9o3~><=)HA&Q zl3$T<=o$I`-SjU+w0~^hfdh`P7u5MWkXQQRSdSHJ*O`BmLqtpr65ej(C-4NItixB0 zNa-pxp2AKa8IgiT4T&jI;=h|7yY@kc5Rs5@D5VQd4^-exeK!Sh6e~t)8#2YxU<28G z0ZTvZ=et3requJptcV;jue^vC-ve*nL{CD_8&Q{^y|rJSKUV-_d-{|EgJ>>_86F4O z*;8q_m4nKcQrA~*HCteF46ohNqE(8l-%9d*<#FA_`1yk}v6xa35(duF*JnUQ#oz%I z0Tm><`2n+}1JB;Qw$|2@m{~(>!RgQ{A&G>&N}`ZhHNCyP8eQ0BSTFxTOmFbd*hkfs zm1Iv($**GMD?2NTj+t5ZN`C|BHqZ^)qeNnITpThgMaU^Za_>r|AwULfd}x`Z zz4ip5qCg7yg!p*q?bT@Sxw%&GsSpH%04|rT`D<>@00|wWl1`L=DR_4+!Uf{Y#_P`r zqS^V-lP6CgnvbuJW6;8GK5pgTB`}1T?!(@zx^#e#FME{#W)k&xr^=7wD zS!H;v<7Z-iwuPjsaRrQj);?;DKxJG+ImDj$hC@Vu!6qmhpEl~Rn zvdT(#e~ot?;N-k2D37U)5`&eohlP;W_UaqebVF9GTk797n-;G=41Ab4dG%bKk2K-o z;Zf=mv5m9R+11s4{Hsd{z0fX9Lv?jI&I>OaY$tHna69ng<>j@LNNl!<8iM$y@yDX1 zo6tgD?#OiulHLVy8n?U9UD~GXkk9};M zx@954i0G5YEuOI*f9ZHa1pmQ=H)zbLzq8x=cJW19+u8LjZfD%H=d7OI+_I0@Nz_H# z&oBR}YW2Iju1~+%3Hq4cSMYB$9gk7bkjB8Uj{VBGJ&=u^ozL2er&HrSN}v%9V6IqU zBlNJuStm zlvuVx)(Q;{{#@z27dGPDGTM5gg#Gh}{E%T56q!f&)*ExctWWoExG9pkNR;kEEt1C)e6_7eg(HB1aqI)4QjhBvoX6v=pB> zhIXltb{T=&4Oj1vPDx0c1Mw;@P9cAJAguxw*}k_%T29UvRV%9E541u862nd`M@)5W z-MaPpix(IIL1c|IQ#vtmhhaGFXMlsf{dNM-qW7yvm34KaS%ff$#W9ta zn+wD57tRO2Kk;;LGDs)loH#u2^8I;QN&hj50&u`PFM+uSplVzX?b3&z1k<#ZmS)Te zFbpm=5i2dpvVRC&mo2m}NU>=8_|()q9MRcu6+Y)T$d^$)6C^W>__r)pBx&O6ZS|e1 z3z!0kcu_kTKK5TpEPHLNwZHbPL-(q`u8C&$Kq?A>Od-8C?`jEj1Rgjfc` zgh+3AYE}e_N0@-l4|a#=e!a9Q0_-obg>M`8Fsd#hn#}7c8b9I|Jw}ALA zv`Y59ADzc^u_k&WMnyZT0Md}fS68QsZoYH-HYfL<&aW^=)e|K&IH(^Xsh8!fO6e-O zF6(T1@gg1OSWHC9@ja@y2vbNkzpeb@dpv^FjO@e<$6KeY6W-S8JvxBhW-y#C&bEJMeWV{v0TO`@d zt*t%3Ki>@04v<0mX3h(p11nPrA44(D3NIVj3HlXbQqm237D2$`iVBR#?bQ|M7zOxv z*WA2}>@+DhjJ!WVgeoVBU3?Ap20e7hh*e?oD4#Q82==08lx*P)tgK+Xqky9>=dV!y z_w-hE*&(yzNaQ150ZZX7;`@e%>e=-Z!%IF#!e5z-Fv?vVQ$=C5ww6W`4Ms*)b@hNL zL#Oj?uI&6Dd>9eL%lo5Z3=rqbaQ3O;VYh*o+ex{w1H7YQm|Gd+`5zx$@NXK~Kc8~Y z7|vLu!h$uu62y5bOA)ggpr!~KKo9z>ZiZSWdBAEzhzZ{E(CIzMFa1k8Ym>Mq+c*X% z6ciLN_9&FoPNHc-W{3k)5U7j!d3gw~L!Bk<({t5s`9Av;bMFf+*$hnaz z^8YfQ6;5&N-}6~dgUE`mQZ3Vv#!5oWl=fczr zMo@0ux|Nvt1pyAsUXCL`^7E(gKZxZ~yTNOJvDQfTr$3<;pw;gQz4`aQaAyO_!hulE zfRco!tVh~0%mQ`|2v4D99`;_OB9P01GA44dYG-gdwBjKnr76s?HJBAu`Bfty#$$|e z8w*Frodjt8^O#8P;B*KB_>K0C4ov@FsPkzaavCx^?bu)frDbX#6j}(b6&whyuz0YaJu6aqd@ZPe4d?ahV4-z%|}eo0XrB z?Dn9}nW^J!Gs1O&${7F(LdYCpiN1cV!)70pV!b`a3?l}`<>ll72$wil8Wu;i3}I%8 zg}_lDk3MK%dH`8b@%# z+1!frED=k1_2r9!ips5LCg;wdzY!QX?Qs~X{pGnIA(Fed-T-Pslq34JGQ8d<;eCXM zrzbBT9}+?r_Q`Pz;1GTzjw;2nV_E(Xwxn|Xq2#mx8g5QwN`dSkjuA!aiSX$E)>BRV1B;a%-ron@{`tu0lk@1>Z=3`XSPF_hbb|#}EqR%>O^;xOT5= z@WF12jMP4NE`I4b?(+D^2w1?)bbbT|5S#?k0L(y<@2PeVFGZGdD<$Rojt+CNglImE zeL_OKqzP*De~>y1cc6A)7K}gG=Knx|cKCC0wY9YYpb^xJjOQ?cyu3rZ%L6tQgso;_ zq2*s4stC5(zhO|=M~cZ6Lvex)YHk)+uJ@eF>_V$;wNg5Gc5ce4qkbJRtK5N|!yxjN%<_`rb!gowB} z30v;<)=dhs)~lmVKE*+O4wFXGjTNU=6aPFvKtYKISwJi4Vd7!6+oS1Ief^*knWlBA zPZ#e-7z=QgCB?-j`s(YWqL6j{IOh+3i3g6v+LV-(9F&ka0*sn5)LE~mfR9YZQ(z$c z1LH#NVqIF|Lc9U066z$3^-*>C6F;#TcQY_x$g&Q?J%k>$G?h`R$5n@;Oy)y z+ywMbjBUOfnBfn0a&ue!^{X&97m*qSmN_|(bzX3JoM5p#^<57C7-on;v0!rxVw?=W z@%puXmCJ(>!#_AGEO%f|2|VUt(cg1@?)QRi)D$9L$)gmm?1QRoNV~B9OuNJ$5{a-I zs~XcxP#V7t&Wzw#Q(HsMJo?~CX#CK0t;?g4E`V-16qH;@NC*-ez-h>5NoK5lQbr7Q85a@T1OE>q#*-feosS?X z0iTziC6-}aa5ntG!Q}f6S$TQE%@!Mu-g+mz@GU6Ptd9EY^k?Ilrja!}J3E4k5-l-ZXGpv>l)M#d4$`+6H$_LSijo)fAcyfn+eaIvY*pucYU~vFqeO zeWjm)s7%2^?SEHAA|%|{+Ny!*9adv=^XS-zhphY$&H#4-0>1z7;f%I+QF-}}?c04p zXW%L!CdScwC!HS?0H{nAGbIp#czAf4(oMD?7Hef=qpz*q)_lEAj?c^@?!fVilL;^s zk??OSA}~uw2jiBMz(XSev%%0HEi<#)YM;Rzsxe^#amy*MNJH4DYH)H=?&9kh;Cehh z1}hFj49QYg6sip1G|nR^jz^u~(JScjxQ=*E0ZJ}|kUpt)&QvD>QNk%=qNe6ZtH3P@ z!?Q<16SMhGa!{Xmn9zhOO!f_3+TJ*8Ip57+M}Dn6$^o|ZPmjZFTlUQEe2I}T#CX!j z=P^}%wEx(#zh$}Es%~ah{@~Ae`UIk7=LKW0UVVnKM*jbNCdhw}rloKAuc&l(p_148 z$vr~8^ypYHZ=9C=;ZdeY;XUJId`xQ#4P|HklMb2R4P^jTlg=COvF<( zdH_X?Cj3UYD}oN@t>5Z`9+EeZw9r#f%D`nSE`~tBfVqQu&`%N%VeO7#(h%fr2>axUn2Z8U$$eGYwf8V)s&3Ja&ExYHBS z=mAAAS{5an2M#|zFraude^Ghu5iZAzc!fummCN1;_MfnF`u2-PPFH zMe32$H*Md$a$SEGFXOt8Nqidtdh5b`gkAfWB?ceAU6vv#pSWKsDQv!qp8l9FZ5}Bx zh5pAjE^xEa3^~!b6{jngFH=8%6aRe0h))^H8ghB;G&Csf{=`!XcAv+PkZ^UdccKIw zn`UCfq|@FPxl|eY{01`DVjZd zyl^J~UVx*qDo`25F|RP_LQVwUxIsrx549a&Qj2zIc-RtA&r6pW@YEUddyroD^6*Sc z2gk&8VkKRk{)U_V9;gUP0sJ_)CNPF0$&oRRjf$GZEHn!3%Pn;$^}+6E(_Y{N_hY1C~5pF zCB*@z8=lqnmfqmpxd=TxCF5g(kpWn2n+p5($&DL`09eWShLt)-Msi|eQDKj(Iem}g zt6N)Ia1FlI^HD69M9I%gFSuu4qS`e=cQMU~fq|QpL0Uh7?$%^@zLr(aiE$dIQZ>w z9-jGegNEvQ=56EPH049M=uFax#$z@$cjK`PJOSdK;YsG@)8EY!%yP9~lRjm$9Pb&} z7rExgGOovn_%F8@EBD@glFew-aGrdwgCJ&_7?$5AM#nAe z#8o$GyRk}^ygJnTr{!gW|=sqWy0H-bk49(b>m^)`H zq9V+4k6j{t5d6KYjUvoe^=jzAauy zPY(fZ<#4CL5{`E#L~_@YgU|F}pGPFHL&?;9w-PYGd?UPNCf-^f&Ym70 zTwV8GPZf@Jw>HRdO@f9`L}X;{t(#=gM3wHlnOjic=IZJ@JGdo*J^C=LS-$nO@e`M! z9g#E~NV1qg1x}(7ZoPg}1A@M>u|F6p{($3|e>8QCJ3)ZF>LL^Ibmdw^?g_hKvH)ZT zFfmVl{p#{&PVLA++Kr@Vo=n$A%X0??sy^4HI!1q=aV2SiGObNaScfWMgWusA-N2W7 zX5!gcIC-)~8aVIq~Y25b}O0BKE%qw1@cy%n`uRAf|zT|DMc-H1LCI(m0>v$&+>yEkuGzV6(fw$>CR6Hp`!QH+=O zBIbSZz&Q*#lA8PJ)0+ZNUl1lWICF-MfV~6w1vHE2to%QXoq0S}Yv0BfN(v>ZG|3!I zqDd*kMkpz1JQbxnISofihfrJ5U^UZz`4it#uy)F1e2HYYp&HoPjYlnxBef#z#_J)810Q?0C_{x&1 zU)iaBJ8vyAq&o*DL7o3jT1l{DSkV`!3b@j4ZgrV8S3%E^nDrU5#ysa0;(C4p!?u*4b16vw{I#&^JSfqpitvqYKNJJbii*h!2)NswygU z2I#q};xa}*KfTZv`971gwko2O;-#^F2DMiHVj#%aqr6yR72T=AP3L!(+>5rAUr;K0 zMA$zbBQG$Xm9wz%n!bRq&%7*8Av_seiwgor7#SNw9K#fb`wtm9wDio9Nz&Itz!v_U z_!S2)6s+gY%_QGky}I8r1}Kmew+^(t?AbFXtffp|DDwvW7Hz+H68-) zJ)T^nNaIL_$oz~qIB)31`bf13jpGRky+U$OTwx25*wFWPgv$W9lsg^_?t;_s@H*Xw zI|5NalX&^^C4DIh>y4L}Em;DqP(|RIiqHP^AiflN+vb9U*Ez>u!?7x9%4%)SV)Lqn7=2ewWYpO34G75UYA7{;GkJNEvCNk6VK;%{6(Ar&>9}*17SH@TL(u(C?{r< zHnIDB2QnN#r$JL?0v=s>fU*PGKqy_US{tV{J)%$+5lhnk-Mh@?)+zh}XQpSLKFjf7 zL4{^vZm#0*8#-a@%U`v6CecGGWCNq*yVbh%>D}8XoN0=pfa*M*(LlpS0s)M1g8>7S zTMLxJLKn|8MLj@o4-a={=LHWvpC=DPd$?ulK`nI#d9$;Hs9!Ke-&(yv?OaBOr~%f+7*&Wz+ia7r`% zysKBq@6O^jK07)71@4#=C|ob&L%? z8V_d83n41Jf6oTBZ2mah)giQ?LATsk@#o;h!X(X5yM-zz6rEhB*EH8V$f#BI^z=wH z&Rs@o+0(Q`&DZ?)d)FN*x|6^w(94S6!4RlGgm`L4wrWK5W8uL(2G^jcyOf@O7s5V& zF0#=XVYp3OCX#@uwJ2*TmUAZ&uNSxcW?D=0gmAEWu15FnsPHckVRG)vMaCRbUltC} z01{Lg_IBy6n`NG&2m?|iqywakGS9H8ec#wW0Cel<&`C=G{ya3v1ru!f`nNW0rJV7) zZtJ)+bkxgQUI)C?iUSA~9i5$5czgFOF5Fy2RF^hCFU#{bu(y{%v(kzl@cw|Bx~k6M zcxlTAkBVh~rleHS&~08bwU803$ee2|$t_=nL~79cZEEUr3lHHCch7OsB!yt2mw)pS zNC(^V{m@+O*}dDYUuVfR!_R8~H%-A>Uw-jt3f;M5$F7xWHx19!I?b8$EZIInU0vPI zY>KKRS@)?%-N$Fc@jhhb!^{h~QD?q0F|nqy64?Ts{dW-@9osiF)FIe-%k4M6U|?EN zfid=jRJ-W8knjNh=M5bVOk3agwUX07Id^?aYCs&P80$^hH`d_N!EMU)>v+)ZN-3{K)R#R8pcqpDyMworht84n}lT%2wT{?GuTNWJ^ zrMlku{XW0a^1Aa_Ts;n~xq?sCai}dYvoU@?p4|b0bX9frNq%-b2^d2VydFQE>E~Ck zr99nDV+pK>k5AJqEwBp+wqjDHzu$VA%ABf4sP;lz_?Jb)LjJx@@nGE@R+JrtjC zI!kkN2S7&%b*RxnvWU47EZDpG`S6;yg@rK$Xu2=`d6r&<2I9<_k*h%xi2$+74v!wS z=L8ncFuF*1g;8orX^v_aRY>N_0yD|RbNDTmo?qT`o%nzt^<+{>@7aSRT7U!8bQ+{- z8t0eX?g8e}BLezy&AWF`uJj)omwNCZUSZYMeaN*?FH4JyCys4}C_^YD^725mEQ1`2 zi||uwY{Z_Fh3X#=Fmw9!&mE7XrjlGQ=DM~CrwO_+AQ1YGxUyRGgJwzAl{(b|(!GAD zsFSZ9qhb5@)yb5U@`pzp!V@g~eqXa@xV(0%aWem~->g(W%$yxIf z>!Tnd3#&dn9`c}(;=$=1`I_Xf{|&WH;`MSs4@@7WwfO^Bok5!#d2SDzjm|+&d|(P| zZF2mua-LLBDV*w5xt9=igNn8Fd$p^zO+h&!Y#9-;WWj<1@Hhl9xnEltWAV7CNXW*B zC&Rnw!2|hV5Z~Ib;HHNAM6#&6yXDA{->7FGHgr^02C<8cjYTPD4U?E6Mw)}nx8AbT zN=B}9AgHa31-l6o@OisjUm6(XX{h{ihtnFh9V-?s>0}h}?6-d>b(?B9YC`b6&h4Cr zBFxaAl6h2-kc|Km*g`SHbm_gm;Qsu=mus<^(}nlLH6L`}cQ$~*h*(y1>Cz#Xl1@~w zc#ih#FOk>fNxzRPZ1Kp*GWkULj--48)+N<_Oy*~hBH(4rtA(PyZ5)_3<|A|G2C{KL zRv2y#`RN9qYtP;4no4r_gGY~ANa+D9j;5XfQlP|VRFB~aRFa=Hhttx!3h~Z{t-mTc z2^$Y-jvqf>pz`P?vup#dY-&F7kpMDEs;c8dXHVNE2tEE1&j^5&3*rY5OA170wic== zf&GCYZUm=K#~{uyUlp8e1O`W0Nw5-YuXNsX8wQZ^e_{ZJ^_LmzBDt@Vn$Uv_!@%E@ zq$)~by@&!tX$5O$Ax7VOAve>~y0_R27&BT_e4K(m-m~XXWMYR8uO)$!O^FDFs`B#k zh?ppT7!3v?Y%*(ghd2Y*d(YjOV9e*v;cWG$e=t;J5F&(LOezoow4ryqHg9gfZU*fP zNC)2#Pvowx8~n$W@~(vJ8#fjo>n|^P<)HR1hOu%d0St0eWzaD`j)9zAKUr%%E+9hu zsFk~EiXAoEO_RaD5JcahRi{0?VKONQKjZeQ?a-8WGG)36uFNcpFwxVl^;HCvd@HGz zfMJ$lTLiS3f6nmwABe$>4*cw3LZr;!VUYait1RrarcIrC;MA$;HS-RvmP|D^)Yir+ zYRK^6u|I}d3kA=frE{)Z0VN zlH<|^;D#UlVD~{Y=V4ZA?a;L+7tkfV`Qi@<<$tngRDb!t)(EG&b?*+;r%sDJaQEs# zR#s&YaBsiafUGCpqu`P*F3ix~a8sd26g@%^-wi2P6g7ttIE66dW@tOF*QAXdvA<)G zW(Ap!_6+CjK1daTalicGj+^4+!oswFD6)Kx|E``<7T40Rn_vs%94#&kz~}P5)6dat z(PZUq{fNK<6M?qOt8-X0Jo#Up_EjG$2w1yR&=QM`VYnIxAqQBj2DRW7h?KT?L9d*X zzm+J&-Nr7f0yCW{zxsQo&4#4Fl@tbmUVIBl#Nr|V)Hm=FHG$oaeh z4DXnh%Jn;zo}O^~4Ix^odPOP$gbEkbhA;(C4=FFWb7+iz*CpXyd(%e&Y>mODn%vWU z?O>%SlSNA~PK~j-yT@K)05W2zMs70^*!^6rra>Ovs}_@2QxQk zur7va)L;(#-&a+wm9B;EM8sdYe0eu}FYdV`!IRQ`Evb@~G!r?U7;;-45WwjM&w&#F z@)ow=R^YFbV0^QhzYh46?+~mbNHbMWWW=0G{I=Nuf z+1cufI^{b)rw1~mWCX4^WXRn&K5}f26PGS&0wYND@@J?BgimO@%ro&T6`o#Nt@pO4 z2u7r8Hk^$~GU_DWYRW%q7Rv5zMhwVdH--~5|>=?xmop^17{&BbQ?A_4(9jEw(4h|ij9fL^> zhmo3)lDu%s)`HWjqh!>}*t&gzdw_S6NexT+%^MVJRx67~$T^r_<%5Yg;M}8eYo%lx zr-h9+PLQjZGx_Uw3^Q1!2F>wQazUXRbWelM0fDY-m!vsZL~s|#sqastpj$49ts4Jjy4iSZn@vbdeVpcaIx z+r)9ly09&Q4?1w*MGEt2@qej(o@9#SlqlShQTZjc4{cf_4!_~8xHvkhvD#HXSaNwqD|O=Y4`Fi&-wawDf9LKm06M z2;K`9GLy3W#fF`J{qf^JK7Q4!)SO`8g7jMOM~kJ@Y~y%3;6*q*Vif_q;Fgk9sCc-L zii%G?JvVoE7w^#{N4ES|S(+!!#NH0hNT3ykrWyw-T8G-dXr1 z#Zqj@#F4((M1$T&$V4y5y1EaAQ}8>;%*-TQ^4g%VKYj7SIk)aV3TVpUkEJzf_pg8J z)hAIC*{fJWW!&dO=*QF*OOE7LgI~b%IPBMmHwH{Iih-sdwrDf8+J>KH9-WfX4lE7V zvHA#H(DXb9jDf+lhW*{WW9sk^`uYbt1PaU8Q&W9?&#}^$FCUcnspYUHh@^?hDPkhY zXnf!VMfaZ{JX+xe9X5JTF@u47QXhr`B-*e)H&$=WeGS&asQ_8)n=c$Wa+8kY?(UJk zdx?VvUqH6bHP71pxU9S>@Uv5qi;`Gj_LYE>WcHHqYf zImKe_VPcZFd-pAApf?2qv^ep|2PFS;3)n|=3W@@gSlp*Y(1z*<8S^WT-Ap-vs4FNS zU_gUOh^CPMkDUFoZX`alH(pm)yZjxmm07>;(ofG1_xU(>uHCXI@+?0K)<1P!=JF-3 zm*YMsSd%ND(;*;jUhaJ43DcPJvH_ChN5f??GV98)CjsVx-{HWOvn%DYSq$J(5QvU= z?1Kv1A_n&4?C-zKZC%wOySbGPo|U?8oI8Fhd@~HLf-|8s=$M(YTZS7Na-vLhP|^Bj z-rifSTHTeR=8Sh!Y0OHypMEucUNyxsId;zA9uYDs3He}lae*o;R>b`@(^sbrg z;Bb_T&mL&L`OnahNf}i*DoNr(!CD8Y+d2?UHd0|-Cyp4&yLF5F^4;%6PT!OFpEe+8 zCd@-J<5i$SyPTNlkvJr91?@voK>^l-;oG*obi0;DsXR82G&DL_K@Z|e&+pA45l(ohfx?H5ZY1GK+}OSfdn;pPESX)8!w zVST(}yLMn5fQj4-d*Rft9ryjbP;YE$2~TGOv>ebo#Q!wbkjnoXVJtEK--+Pf>V1r8 z!H`H{6mgtQ1A$Qbvo0~@hh0P8lYT3LJhd6P(L1uTOMV)TslL*T!V4ZLfO|u$k)Bkq zZ^g!&8CplB`6WZSx$Ssw?%Eq|Y{RExR`Z7X5z44gf{IZjLQoO1*-4>2G$q#y&W6u9 zySef97ff1-TK#%mt z7l-ZbM%<&jM;3)B=;4o}dvs-Q|DKV$>eIjxH@}&BI1`tmqoZLmy1Q$+IG8DN*2b+H zH}HI-oPAy8&VTyiaTwY-7b`0(Gc-2-5nK?A>vkzMxTmbs9TTsQ9|EgOrLE0n{A5^M zifmeG?xI_8vgjQtUpSBm-=G0v!nH25YG`eGlGW7EfJ@P8^S)+>geaiE_7y*O!w9)! z;yCzgW}XurILZS69UK~Y)E(B9^;X{t7kuf`cesGUD4n0~(|*cV-LwL4#z(A3IG{6T z&C0xV=|*mDY+8FqeU>P*3(o7BL|F-u>vPunu1RSjWq-MXMWf}SlPt?vi_uj0otc|M zkti{o*-{b57-ZoF8_&hT=dVKjlKyO5N<&M5&F3>sJdu&{i}`jP0e4g45*5!n>}f7u z^aCfTU-&^OY-7#~`4=3s1D%GJNR$oztcaabU6y5%7x-tc1@ig5dqsN&9}o4|e4^&g zV<8eR^M-v9RVbh=NXq-QZ?d!h1FS56byTmYun@zR76wC*6L_NgrboacW<-p`E{#yv zwZTfNxoXo?zCiCI!lNB|xW-)Dh8D9J6MNtV1{7kgaD8-zhIoVn*r-)d!)Ia^;KrhH zB^7VpT)}68;Jqll2Whpipn&1IXbi^W7S8@LJ&Biw%5d4XxM-YHSO+kPp|gtRR+Ndq ze0v>z>v&G+lMglKM85z0ElmJ8RaSF#CJ(pNgefkMLYgfrRg)Z)n7J`O_2yg?0OmZm zGrc>mrd)vLvVG*5u98iL3H37U>P2Ei!ky$~T_}HM=WlUv8pRoM7@`AZG$opSKSRlm zDQ2l66%a7yR7y(N(8U5y#+*KMIVB~Zv;OLoCD(KkW~lt|*0G&=_T-5ZGU|Vw*gFFi zn+7gE4FcYve<6J1@0(S|luXiE&@m)tn3GSqoWPJEU{jykui#9&ksXr0Oz@N%b;Yk; zUJ#dS`}R%75=Srn%WYSRJw{^aEYpG$J~?7@5&L7HqJSw;FO>;E2lV+~FSg&&5Iw)B zZ5tXIa64e4jA5rBv{fs3$jv{qIE-wO@S?wt{?r}2Jn=`dl}Kooir#5D?*9Al_v~4w zs0Z;yKKE3u_g4J@GLiSlD~CP#+sc&~oRe+pU^)5tK!kO5b5jVWI~8sBGyPD?mD7__ z%g>p!j@}aWjP{c~yoD+HsiUJZkU)|Y6@-wS*=e5kP+?oY^94z}1Fq|lHP|Gf-3CZr zN9j*Dr5S=~9Z>g{gTeAy4(4>THr4o>t>-8jWS5A%5dVVkY`hs(V6Ok&7|;7Vj~{<0 zKh#{QcVDsMI8y1DKTe%E@$LI}OsxKd?oEgIxkyEFaMIRW9snXsFz+1k-3tSPQ|8-=NY z5E&J<*Txf9b_B~^2X}SMUm<^^aKoIaRDt>c!FJ(}Z;0%-S z{NBAUDmz3KH0W_D-v88{a0@GcaBjwTD$y<}-NKU*`%Fx15tZS8{l#G*-8$z@@H)3` zdAO5{i=qJSGGG$u$LiHzrZyuaz<2df;szv#zVDQhws(7?QHP6;d~j;&peqKJmK*%% zuPxi|>p0dyDQfSfBk{DO^1)$Y9j{=_8OXm)F=7Y*>&k~$h(2J#3@g5_6OU>TX{Wv* zJ`$6j&p6ftJm175y8flkh=DiGhgVIWxGcVA$x{p6P(}TdWkU^PI|{TXUw1KM?Q$x$ z+T!t}Mr1kcIRQw$M_8oyr*vFe}(B14B*UQwmO}r zKyewwE60z?i{xF;hBZlt$#9D{*mxCf^HF)52QvjfgKzP7Hs-!=`Q$C_bEi)k%r!{p ze)_Rvz#S=fx4kOS)=yxSP1QIr0&r-hd%xc~9doU!(yM>}y^OKE@EQ0+>7Uj3ZJvrq zD??%|iXq`eaf6bj3m9WWM?_>of`o#Lor7RalA`1*zqXk($hIRUp8JQdFOxJFWy}|c zB1NRk()Ayp@!V8tXS05eb8dV|FgV{e-Wjl_*m!dQPtVl aBt3QLg>UD9!HCra!O7mm?xbYFrvCvfl{Ewa literal 32787 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 W-uJ`8cc1Wk2(~}jP0O@i8ued5La&wp diff --git a/android/service/engine/AndroidManifest.xml b/android/service/engine/AndroidManifest.xml index f29c72f531..b1d6f691c3 100644 --- a/android/service/engine/AndroidManifest.xml +++ b/android/service/engine/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="20" + android:versionName="2.0" > diff --git a/android/service/engine/jni/include/EngineCommon.h b/android/service/engine/jni/include/EngineCommon.h index 99b5af30d3..67a94e270f 100644 --- a/android/service/engine/jni/include/EngineCommon.h +++ b/android/service/engine/jni/include/EngineCommon.h @@ -6,7 +6,7 @@ #define LOG_TAG "OpenCVEngine" #ifndef OPEN_CV_ENGINE_VERSION - #define OPEN_CV_ENGINE_VERSION 1 + #define OPEN_CV_ENGINE_VERSION 2 #endif #define LIB_OPENCV_INFO_NAME "libopencv_info.so" diff --git a/modules/java/generator/src/java/android+AsyncServiceHelper.java b/modules/java/generator/src/java/android+AsyncServiceHelper.java index 6e86f7541c..adf0e41a1b 100644 --- a/modules/java/generator/src/java/android+AsyncServiceHelper.java +++ b/modules/java/generator/src/java/android+AsyncServiceHelper.java @@ -41,7 +41,7 @@ class AsyncServiceHelper } protected static final String TAG = "OpenCVManager/Helper"; - protected static final int MINIMUM_ENGINE_VERSION = 1; + protected static final int MINIMUM_ENGINE_VERSION = 2; protected OpenCVEngineInterface mEngineService; protected LoaderCallbackInterface mUserAppCallback; protected String mOpenCVersion; diff --git a/modules/java/generator/src/java/android+BaseLoaderCallback.java b/modules/java/generator/src/java/android+BaseLoaderCallback.java index edc94875ba..6d6a9b8dad 100644 --- a/modules/java/generator/src/java/android+BaseLoaderCallback.java +++ b/modules/java/generator/src/java/android+BaseLoaderCallback.java @@ -52,7 +52,7 @@ public abstract class BaseLoaderCallback implements LoaderCallbackInterface { Log.d(TAG, "OpenCV Manager Service is uncompatible with this app!"); AlertDialog IncomatibilityMessage = new AlertDialog.Builder(mAppContext).create(); IncomatibilityMessage.setTitle("OpenCV Manager"); - IncomatibilityMessage.setMessage("OpenCV Manager service is incompatible with this app. Update it!"); + IncomatibilityMessage.setMessage("OpenCV Manager service is incompatible with this app. Try to update it via Google Play."); IncomatibilityMessage.setCancelable(false); // This blocks the 'BACK' button IncomatibilityMessage.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { @@ -60,7 +60,7 @@ public abstract class BaseLoaderCallback implements LoaderCallbackInterface { } }); IncomatibilityMessage.show(); - } + } break; /** Other status, i.e. INIT_FAILED. **/ default: { @@ -113,7 +113,7 @@ public abstract class BaseLoaderCallback implements LoaderCallbackInterface { { AlertDialog WaitMessage = new AlertDialog.Builder(mAppContext).create(); WaitMessage.setTitle("OpenCV is not ready"); - WaitMessage.setMessage("Installation is in progeress. Wait or exit?"); + WaitMessage.setMessage("Installation is in progress. Wait or exit?"); WaitMessage.setCancelable(false); // This blocks the 'BACK' button WaitMessage.setButton(AlertDialog.BUTTON_POSITIVE, "Wait", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { diff --git a/modules/java/generator/src/java/android+JavaCameraView.java b/modules/java/generator/src/java/android+JavaCameraView.java index 6e2b6cadef..0d67c9dda5 100644 --- a/modules/java/generator/src/java/android+JavaCameraView.java +++ b/modules/java/generator/src/java/android+JavaCameraView.java @@ -1,6 +1,5 @@ package org.opencv.android; -import java.io.IOException; import java.util.List; import android.annotation.TargetApi; @@ -36,7 +35,8 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb private Mat mBaseMat; private byte mBuffer[]; - + private Mat[] mFrameChain; + private int mChainIdx = 0; private Thread mThread; private boolean mStopThread; @@ -65,6 +65,7 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb @TargetApi(11) protected boolean initializeCamera(int width, int height) { Log.d(TAG, "Initialize java camera"); + boolean result = true; synchronized (this) { mCamera = null; @@ -99,59 +100,76 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb Log.d(TAG, "getSupportedPreviewSizes()"); List sizes = params.getSupportedPreviewSizes(); - /* Select the size that fits surface considering maximum size allowed */ - Size frameSize = calculateCameraFrameSize(sizes, new JavaCameraSizeAccessor(), width, height); + if (sizes != null) { + /* Select the size that fits surface considering maximum size allowed */ + Size frameSize = calculateCameraFrameSize(sizes, new JavaCameraSizeAccessor(), width, height); - params.setPreviewFormat(ImageFormat.NV21); - Log.d(TAG, "Set preview size to " + Integer.valueOf((int)frameSize.width) + "x" + Integer.valueOf((int)frameSize.height)); - params.setPreviewSize((int)frameSize.width, (int)frameSize.height); + params.setPreviewFormat(ImageFormat.NV21); + Log.d(TAG, "Set preview size to " + Integer.valueOf((int)frameSize.width) + "x" + Integer.valueOf((int)frameSize.height)); + params.setPreviewSize((int)frameSize.width, (int)frameSize.height); - List FocusModes = params.getSupportedFocusModes(); - if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) - { - params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); + List FocusModes = params.getSupportedFocusModes(); + if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) + { + params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); + } + + mCamera.setParameters(params); + params = mCamera.getParameters(); + + mFrameWidth = params.getPreviewSize().width; + mFrameHeight = params.getPreviewSize().height; + + int size = mFrameWidth * mFrameHeight; + size = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8; + mBuffer = new byte[size]; + + mCamera.addCallbackBuffer(mBuffer); + mCamera.setPreviewCallbackWithBuffer(this); + + mBaseMat = new Mat(mFrameHeight + (mFrameHeight/2), mFrameWidth, CvType.CV_8UC1); + + mFrameChain = new Mat[2]; + mFrameChain[0] = new Mat(); + mFrameChain[1] = new Mat(); + + AllocateCache(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + mSurfaceTexture = new SurfaceTexture(MAGIC_TEXTURE_ID); + getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); + mCamera.setPreviewTexture(mSurfaceTexture); + } else + mCamera.setPreviewDisplay(null); + + /* Finally we are ready to start the preview */ + Log.d(TAG, "startPreview"); + mCamera.startPreview(); } - - mCamera.setParameters(params); - params = mCamera.getParameters(); - - mFrameWidth = params.getPreviewSize().width; - mFrameHeight = params.getPreviewSize().height; - - int size = mFrameWidth * mFrameHeight; - size = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8; - mBuffer = new byte[size]; - - mCamera.addCallbackBuffer(mBuffer); - mCamera.setPreviewCallbackWithBuffer(this); - - mBaseMat = new Mat(mFrameHeight + (mFrameHeight/2), mFrameWidth, CvType.CV_8UC1); - - AllocateCache(); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - mSurfaceTexture = new SurfaceTexture(MAGIC_TEXTURE_ID); - getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); - mCamera.setPreviewTexture(mSurfaceTexture); - } else - mCamera.setPreviewDisplay(null); - } catch (IOException e) { + else + result = false; + } catch (Exception e) { + result = false; e.printStackTrace(); } - - /* Finally we are ready to start the preview */ - Log.d(TAG, "startPreview"); - mCamera.startPreview(); } - return true; + return result; } protected void releaseCamera() { synchronized (this) { - mCamera.stopPreview(); - mCamera.release(); + if (mCamera != null) { + mCamera.stopPreview(); + mCamera.release(); + } mCamera = null; + if (mBaseMat != null) + mBaseMat.release(); + if (mFrameChain != null) { + mFrameChain[0].release(); + mFrameChain[1].release(); + } } } @@ -187,7 +205,8 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb this.notify(); } Log.d(TAG, "Wating for thread"); - mThread.join(); + if (mThread != null) + mThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } finally { @@ -224,19 +243,19 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb } if (!mStopThread) { - Mat frameMat = new Mat(); switch (mPreviewFormat) { case Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA: - Imgproc.cvtColor(mBaseMat, frameMat, Imgproc.COLOR_YUV2RGBA_NV21, 4); + Imgproc.cvtColor(mBaseMat, mFrameChain[mChainIdx], Imgproc.COLOR_YUV2RGBA_NV21, 4); break; case Highgui.CV_CAP_ANDROID_GREY_FRAME: - frameMat = mBaseMat.submat(0, mFrameHeight, 0, mFrameWidth); + mFrameChain[mChainIdx] = mBaseMat.submat(0, mFrameHeight, 0, mFrameWidth); break; default: Log.e(TAG, "Invalid frame format! Only RGBA and Gray Scale are supported!"); }; - deliverAndDrawFrame(frameMat); - frameMat.release(); + if (!mFrameChain[mChainIdx].empty()) + deliverAndDrawFrame(mFrameChain[mChainIdx]); + mChainIdx = 1 - mChainIdx; } } while (!mStopThread); Log.d(TAG, "Finish processing thread"); diff --git a/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/Puzzle15Activity.java b/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/Puzzle15Activity.java index c6cb1a1b2f..a74b0b4d73 100644 --- a/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/Puzzle15Activity.java +++ b/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/Puzzle15Activity.java @@ -63,7 +63,8 @@ public class Puzzle15Activity extends Activity implements CvCameraViewListener, @Override public void onPause() { - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); super.onPause(); } @@ -76,7 +77,8 @@ public class Puzzle15Activity extends Activity implements CvCameraViewListener, public void onDestroy() { super.onDestroy(); - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); } @Override diff --git a/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionActivity.java b/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionActivity.java index be736b9380..13ffc685d7 100644 --- a/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionActivity.java +++ b/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionActivity.java @@ -78,7 +78,8 @@ public class ColorBlobDetectionActivity extends Activity implements OnTouchListe @Override public void onPause() { - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); super.onPause(); } @@ -91,7 +92,8 @@ public class ColorBlobDetectionActivity extends Activity implements OnTouchListe public void onDestroy() { super.onDestroy(); - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); } public void onCameraViewStarted(int width, int height) { @@ -100,7 +102,7 @@ public class ColorBlobDetectionActivity extends Activity implements OnTouchListe mSpectrum = new Mat(); mBlobColorRgba = new Scalar(255); mBlobColorHsv = new Scalar(255); - SPECTRUM_SIZE = new Size(200, 32); + SPECTRUM_SIZE = new Size(200, 64); CONTOUR_COLOR = new Scalar(255,0,0,255); } @@ -152,6 +154,9 @@ public class ColorBlobDetectionActivity extends Activity implements OnTouchListe mIsColorSelected = true; + touchedRegionRgba.release(); + touchedRegionHsv.release(); + return false; // don't need subsequent touch events } @@ -164,10 +169,10 @@ public class ColorBlobDetectionActivity extends Activity implements OnTouchListe Log.e(TAG, "Contours count: " + contours.size()); Imgproc.drawContours(mRgba, contours, -1, CONTOUR_COLOR); - Mat colorLabel = mRgba.submat(2, 34, 2, 34); + Mat colorLabel = mRgba.submat(4, 68, 4, 68); colorLabel.setTo(mBlobColorRgba); - Mat spectrumLabel = mRgba.submat(2, 2 + mSpectrum.rows(), 38, 38 + mSpectrum.cols()); + Mat spectrumLabel = mRgba.submat(4, 4 + mSpectrum.rows(), 70, 70 + mSpectrum.cols()); mSpectrum.copyTo(spectrumLabel); } diff --git a/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetector.java b/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetector.java index 08c499a581..21988a81a1 100644 --- a/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetector.java +++ b/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetector.java @@ -22,6 +22,13 @@ public class ColorBlobDetector { private Mat mSpectrum = new Mat(); private List mContours = new ArrayList(); + // Cache + Mat mPyrDownMat = new Mat(); + Mat mHsvMat = new Mat(); + Mat mMask = new Mat(); + Mat mDilatedMask = new Mat(); + Mat mHierarchy = new Mat(); + public void setColorRadius(Scalar radius) { mColorRadius = radius; } @@ -61,23 +68,17 @@ public class ColorBlobDetector { } public void process(Mat rgbaImage) { - Mat pyrDownMat = new Mat(); + Imgproc.pyrDown(rgbaImage, mPyrDownMat); + Imgproc.pyrDown(mPyrDownMat, mPyrDownMat); - Imgproc.pyrDown(rgbaImage, pyrDownMat); - Imgproc.pyrDown(pyrDownMat, pyrDownMat); + Imgproc.cvtColor(mPyrDownMat, mHsvMat, Imgproc.COLOR_RGB2HSV_FULL); - Mat hsvMat = new Mat(); - Imgproc.cvtColor(pyrDownMat, hsvMat, Imgproc.COLOR_RGB2HSV_FULL); - - Mat Mask = new Mat(); - Core.inRange(hsvMat, mLowerBound, mUpperBound, Mask); - Mat dilatedMask = new Mat(); - Imgproc.dilate(Mask, dilatedMask, new Mat()); + Core.inRange(mHsvMat, mLowerBound, mUpperBound, mMask); + Imgproc.dilate(mMask, mDilatedMask, new Mat()); List contours = new ArrayList(); - Mat hierarchy = new Mat(); - Imgproc.findContours(dilatedMask, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); + Imgproc.findContours(mDilatedMask, contours, mHierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); // Find max contour area double maxArea = 0; diff --git a/samples/android/face-detection/src/org/opencv/samples/fd/FdActivity.java b/samples/android/face-detection/src/org/opencv/samples/fd/FdActivity.java index 0bb4978a09..9470a8fd1f 100644 --- a/samples/android/face-detection/src/org/opencv/samples/fd/FdActivity.java +++ b/samples/android/face-detection/src/org/opencv/samples/fd/FdActivity.java @@ -50,7 +50,7 @@ public class FdActivity extends Activity implements CvCameraViewListener { private int mDetectorType = JAVA_DETECTOR; private String[] mDetectorName; - private float mRelativeFaceSize = 0; + private float mRelativeFaceSize = 0.2f; private int mAbsoluteFaceSize = 0; private CameraBridgeViewBase mOpenCvCameraView; @@ -132,7 +132,8 @@ public class FdActivity extends Activity implements CvCameraViewListener { @Override public void onPause() { - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); super.onPause(); } diff --git a/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsActivity.java b/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsActivity.java index 569de5dc70..26f7e8317d 100644 --- a/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsActivity.java +++ b/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsActivity.java @@ -113,7 +113,8 @@ public class ImageManipulationsActivity extends Activity implements CvCameraView @Override public void onPause() { - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); super.onPause(); } @@ -126,7 +127,8 @@ public class ImageManipulationsActivity extends Activity implements CvCameraView public void onDestroy() { super.onDestroy(); - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); } @Override diff --git a/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1Java.java b/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1Java.java index beb368f963..6478f3bb05 100644 --- a/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1Java.java +++ b/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1Java.java @@ -68,7 +68,8 @@ public class Sample1Java extends Activity implements CvCameraViewListener { @Override public void onPause() { - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); super.onPause(); } @@ -81,7 +82,8 @@ public class Sample1Java extends Activity implements CvCameraViewListener { public void onDestroy() { super.onDestroy(); - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); } @Override diff --git a/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2NativeCamera.java b/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2NativeCamera.java index 8fbdeef8e3..dcdffe325d 100644 --- a/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2NativeCamera.java +++ b/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2NativeCamera.java @@ -75,7 +75,8 @@ public class Sample2NativeCamera extends Activity implements CvCameraViewListene @Override public void onPause() { - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); super.onPause(); } @@ -88,7 +89,8 @@ public class Sample2NativeCamera extends Activity implements CvCameraViewListene public void onDestroy() { super.onDestroy(); - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); } public void onCameraViewStarted(int width, int height) { diff --git a/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3Native.java b/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3Native.java index c216bea9a1..5f0e6c8801 100644 --- a/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3Native.java +++ b/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3Native.java @@ -64,7 +64,8 @@ public class Sample3Native extends Activity implements CvCameraViewListener { @Override public void onPause() { - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); super.onPause(); } @@ -77,7 +78,8 @@ public class Sample3Native extends Activity implements CvCameraViewListener { public void onDestroy() { super.onDestroy(); - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); } public void onCameraViewStarted(int width, int height) { diff --git a/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4Mixed.java b/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4Mixed.java index c9e745b65c..e70f9d68c7 100644 --- a/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4Mixed.java +++ b/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4Mixed.java @@ -90,7 +90,8 @@ public class Sample4Mixed extends Activity implements CvCameraViewListener { @Override public void onPause() { - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); super.onPause(); } @@ -103,7 +104,8 @@ public class Sample4Mixed extends Activity implements CvCameraViewListener { public void onDestroy() { super.onDestroy(); - mOpenCvCameraView.disableView(); + if (mOpenCvCameraView != null) + mOpenCvCameraView.disableView(); } public void onCameraViewStarted(int width, int height) {