From 90c8cbb33bf304cafc192c6287ae0283189a2eac Mon Sep 17 00:00:00 2001 From: davpapp Date: Mon, 12 Feb 2018 19:40:09 -0500 Subject: [PATCH] Refactoring cursor code --- ClassifierTraining/testClassifier.py | 9 +-- bin/Cursor.class | Bin 6604 -> 7025 bytes bin/CursorPath.class | Bin 5347 -> 5642 bytes bin/CursorPathTest.class | Bin 4116 -> 3602 bytes bin/CursorPoint.class | Bin 1932 -> 1908 bytes bin/CursorPointTest.class | Bin 1891 -> 2209 bytes bin/CursorTest.class | Bin 2798 -> 3116 bytes bin/ImageCollector$1.class | Bin 0 -> 843 bytes bin/ImageCollector.class | Bin 0 -> 3599 bytes bin/ScreenshotAutomator.class | Bin 2640 -> 0 bytes bin/cascadeTrainingImageCollector.class | Bin 3231 -> 4133 bytes src/Cursor.java | 28 ++++---- src/CursorPath.java | 23 ++++--- src/CursorPathTest.java | 32 ++++++--- src/CursorPoint.java | 8 +-- src/CursorPointTest.java | 31 ++++++--- src/CursorTest.java | 9 +++ src/ImageCollector.java | 85 ++++++++++++++++++++++++ src/ScreenshotAutomator.java | 56 ---------------- src/cascadeTrainingImageCollector.java | 33 +++++++-- 20 files changed, 204 insertions(+), 110 deletions(-) create mode 100644 bin/ImageCollector$1.class create mode 100644 bin/ImageCollector.class delete mode 100644 bin/ScreenshotAutomator.class create mode 100644 src/ImageCollector.java delete mode 100644 src/ScreenshotAutomator.java diff --git a/ClassifierTraining/testClassifier.py b/ClassifierTraining/testClassifier.py index 8a74374..99603fd 100644 --- a/ClassifierTraining/testClassifier.py +++ b/ClassifierTraining/testClassifier.py @@ -1,17 +1,18 @@ import numpy as np import cv2 -willowCascade = cv2.CascadeClassifier('/home/dpapp/open/opencv-haar-classifier-training/classifier/stage9.xml') -img = cv2.imread('/home/dpapp/Desktop/RunescapeAIPics/CascadeTraining/Testing/screenshot0.png') -gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) +willowCascade = cv2.CascadeClassifier('/home/dpapp/open/opencv-haar-classifier-training/classifier/stage8.xml') +img = cv2.imread('/home/dpapp/Desktop/RunescapeAIPics/CascadeTraining/Testing/screenshot1.jpg') +#gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) -willows = willowCascade.detectMultiScale(gray, 1.3, 5) +willows = willowCascade.detectMultiScale(img, 1.3, 5) for (x,y,w,h) in willows: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] print("Found willow!") + cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows() diff --git a/bin/Cursor.class b/bin/Cursor.class index be322cf26ba0864ca461310988fcb51d4d54fbdc..b72457658e1ff804222e7828215b400b993b882e 100644 GIT binary patch literal 7025 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 literal 5347 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 diff --git a/bin/CursorPathTest.class b/bin/CursorPathTest.class index bb9a407adfcdb644f967616f09685b4cd0db035f..ff407ad82629069a8c7e424863476c2ad5521223 100644 GIT binary patch literal 3602 zcmc&$S#um$75-Y9(MY4VY)i5%87*xKq8Tlo#0wD1QLK3EWNgVY(pbbM0a`PyQCl4`wxVt=J{U3~HXGVSGQC^9v2Q**R)-oVOi2nA6anO0Q~&U3809 z674vkqYFt52N!I|x>l>KSzg{;E7NZ8f?F`ltEOkmd$bq}Hf-`b)MQ?~AwYk?djoW7 zeciX{&(Lzs3G9lsYWp_L%sY-7n1Ss&v@*QldZo2~226HVBFbX&sZ8qN}aZSqV%p@aKai&o0>x zqn~OD=xlmbRA+RY6xA6~z2p>arxe+CZ70Y%4WK7X|CZ&sS*vXBh~|Sj9um!gR?sYK z$8-uzyN1&`&WK1~t4Mys3e1iRUB~~K&&~{r;OBKbjC1$dT8^^FQfQ%`O|N!5`j2(> zC+c%L9u@T?tvD;JEc%ng1DMzGnB=&xX!}(<(Bz{p8OiFngv%Nd8>W9v1)mjsi-9iG z8%2ZO96k*P7~jI?qFGf{D=1fWEMSptl&nAnzcreYf%KjY3GZwdmhgoHuCpVX80lEX ziUw_)znqBN(6Opk82Be~D}kFDjQy*6-uEp}Rlbfd;VF7xs+GJ~W4Fapx1=xom?8?b zq?-P;P!oT?s>2k2`svSowIRd`I*LLpUJR?^Nv!KAVS}*>VJ|&XGs|qkcq*3@h00*&^qh4iAE`u~T)~H1Sk6o6fQmnQ2vs zR4@wxY3$h(#AkJEV~0K1f~X2p!DR*RYdXHJOq(=xN<#ll@$Op@2;GSXQp!vd0lPyK zWg~&_G1(2Cmpsq)I`MrCzrW#lmhYCgtfEnHD^nFss$FU67G$ zth=6)G`&)-VmX0tq#_&1B%a5MGP+-4Zc^biQ?qC#@K`+@A)WYvhTr|KK1pN#pIl1d zhpgu?AX(=1vR$^Wn;x5{6R&BwoY`+Im_Jit;cqjrN+2Bvo$z6*&Eh&mFEDf$hEL)*(8Bm=GMi@ z9Z3&=!pQs@%eEF+t7ch7N%xlA^RBqex6q=hWp;Vp)}9jQ(28603RdW9U!x*b$fQ$X zaFVz4ETi$q{g(FxpW4ugZr*u*;EFtDcvmu$_n`kliS+O)3ZTkCUiDA_hj5s0KrfZs z(8ni{>gQbyeT0|-ygIpyBa`oAa2LlG-^1DIKf%!OS3IyVIdu;yxlGF?BbQT?Q~fx* zi_gh@b{CIK?cxG8E^4^@@!y0_JA}?j1<^x@Ll`2BQIZ%Zg%sguFu)VrQ9Ob{%=7yd z98)p5S|eI~F(JHre(0D!zEUOYnwC=gQ*r`?z)& zJ-p@bA`yEJvGxz}#Rj<^B|E|}kMdMArofF*zaF#U2s}=rPvgr(6B>-;zi>2xr3)HY zcyx&H^L!Kh9^!vR@YjfFHL?>To*?2l4)ByCSqc$*>WDpc#4gwhu}zK`5yEd7$_{Fs zCcy%C+zzUrdEeS_EWyTfF81)mV@oSvldEki%zd*uL!Q-U4l?%Bla(5J4 zGJNjgcxsRYztM=(0F3|-^7;_-dJ4lhjT1B~P-DV8i~IRY+m~Bz(~NLFNLuvybAY0-03t8LN9fhMzHt0y2iX ze3BX;!#gUn(hp4eu?zC~=XDN2#9?G2O$x$bB26;?oxxMg*wal6M(PYk@NUFl1iy$F TjNq5e3`Dq4Zr>mT(CPD literal 4116 zcma)9`Bxj)75)Y!2IK+TEVg8W!Eu5mz*gPXaSUF-VApEFxIk&`q{|=%G)8EYnUQ1M zHr>)V>Aoj*PTC}0oTh2oq_%M4Hcj_)`eXl;{@R|p-<=taBuvgJ2WENm?!Djr-gobN z{NulGy$#?n{-&ZqLECuAb}ak6?&jtU$5jzguQ0d(;Nj| zlirMyYv$8qwym#CnvOf7pk>xvF6eH_HWcjJY|gRCYPgXTv}ihJ7EJeqg2rTOUO{Bs zS~Oy4M5~4t#1w3uGz-SL(&~a?&*=+!`fZ=IvU+}Aw@rBu1|x3HB(7~W?j;)r=yZ9n z2Ay77at!8^m?;%pbJdtP9g}Xx3I)s6UDGPiOZTK@FQ+e+2#nXF=^A!gFPdr3V+;y* zXxJ&>It9C_=gq4|H9`v~Bs4_P6vJ-xsOVPEu?bxo_Mlfmv$)q?%ck38s)n;nFg~&c zd$CW&eN4UTrt($8{dj=96^tv)s{k%00+b9=8U`@PRO{K9b#>cy#@uP! zTs8}2KUqWQNNQe84`?_jrU%6IbYamfEC;?Vv*2b5)j(%;=b~X-6GmQNYZ^UB(eX!I zyjR2f@O~y-AAKfR0G|A_phKD7ePUdsZ!V0jDYxsl!i!REN z3b;>c(6KY`qPC8z{YmO^RYL(5sc~4eUf0RU@S_@RFnA*!Q&`DN z;GwpTVq~DC;W8d$zMMCgGhF?QZLQYo)m!J(L<`pNX%$!Ndg<(%;~E6;8GM$Jtdd0X z3*NNS=WV7x>)M9C%8LCQd8jsF4s-QRmCXF2VaMs@;@G(3SXQ`MLCe94$z zl0+(0c!~IaMq+pz*QCEbB{O^kwck_o&G?FfhM_*0`85q+$2Zui^{vFA z&6`EXIPjQduQ)|LYoxiO8+2YY#xiNy8J1}6q=S_TjyDJ0D{c(8a7`|EH2hBb&|c;m zQWwIdg(H~@2%_@+)T3hS51MHGxEwn+=xas}7wr39Y0g=5#K$+|N|C24@7%$Ym}}*E z6d>WjM?1la7Ht?vRZXyuv>oLU>pC)PQCdJmgTtku7{m z^X|HhNF#t`r@~Zh0unpV!2DH<-0UdmjS)II#qgN5}0*(!o(KT=r@iKNz z-N4|`o9I*U4*Dkt2G^04%h14JC(>mclKbH@jtrJD%z4KZT)+EI0nrEn(eGhxqvLHz zF!&yZ-p7E0=;Fy?2aa%j6mbva4nhLP0+0#L9m6TY8|UbDG~DH+MwRa>_kHZ=WFCC@ zD#&f#g{p4Cn3x*6iL=+y#@o5;P$M@GX}paOS3$LTb9a-}ZaLU_!TWsskfH7%c$5dk zkK$vDCNRj_f3Q;m>v*#L=`y|=kCpMwGQLyB4+i4R$!t8+vWPvRr9r6Fl8SyxYPa{BVY&R9=QYTgG+=!^U_Do5{g>~~ zdZVy@xSsXbHnRTO(U{P>vKg&^uhKfeM1TjG#1T^P5NSP10)~lugh?M`y2o*m@5?;@ zRw>Pel;%Q8b9gyL;?(MfT3r9iV*%!1e0t;Q#A;BLIgb_f}RjT5B^+>AWj4d L{z4QD`0M`wP3*?0 diff --git a/bin/CursorPoint.class b/bin/CursorPoint.class index 76c36ccedce9a6dacce4ffdc8ab0a9e0e6477c43..8607e7a4f20ab8c50c44ec30e0f770012e976853 100644 GIT binary patch delta 588 zcmXYt%}*0y5XPVB%WiSI=?WINBq*zb-L8ew3R$zX2FS@XqKZyR%lU z&p)cx1A=hVzJWdrnm8&8R3cA4r)LN9CXQp2%MUg-2_3HA>N;WKBu1qjSvhzX=c1S- z>|F_-2HCY>y_TKZ+N@Wfn3%$O`8wjz1^GSF*E>V#EN?tsuNNKHfR9Ti_Mk-Qk!6vH zEhy`XiCJ8g3E^2~0%eqULwR#@R^*d62}U~OJglw-TSZ3|Z<$!cl6)lw^kv+Q;*R_w zlHwjpA9h8GW{!Xm<9iF}UNa#@P?fTdid4DY6AONo2^dRNODF1-^{O`H=6S8_m{5#rtxG)8DIgm zV%bYiE!)hrnrjM+gejGhk5?N6)vV3`u^$Kt!kq(|EyYHv07coFm&ac)rOr2 z>k3l1rs5D57y^3k|2N6#vPfK4k;4rhlw#T<1B(mqmhf)#MQNgci9w0R!z)(Z+(?8) zb6Le5+~x12p}~82;Kh9gzcahqH1Y&v7wnd067WMTeEK0pSn((ry6HD%;DL*(PaFP> zBbzl*w9VQcPHmIxLV!*WWr1D<=?r$#=tDo<=p6=05hTta!gKC%rt_C>y*qZ`4kONY z+@s|FbnCB1FzRFt#Hot??`gW5YBnbJM)ok~h+3KC6iGs=Y|T32z#%%(6gg^^w`Syh zuu>=>li}Zm{*k72xO*Ux4kJX2Nt{G*imoxpV%^^l$l|O66~YM45sXAp4d+S8gqT2* zZ+lJ<{&&w9yYSZAYh2t%s^q(}i>tIyYa{Es*+yQ_2wmuCKj}7#ZIpP*8}mMLm>&ND D;?jhj diff --git a/bin/CursorPointTest.class b/bin/CursorPointTest.class index 5f85cbbdf67cb46d005ff1a3b198a26e0af4d102..dc274bfa31fbf537a187eb24d52e5448d474b52c 100644 GIT binary patch delta 1105 zcmZ{jT}V@59LAq_=j@z0XYSZY=SP|)eW=wcO)T8h)w0y)N0c9ZES)CF6rH3Aje-cG zi(nU#5G=Y7Zv;_HijuC9uDgz+%OHxNt5`knao8$4ocBG?{?Ge9@6P|Xecbfeu)j$@ zdkLTl7Z&Wzme`k9?KPF-VQuyOy2yZmdIuWNC?F;|nq=je1INwE6f0ql0ggd|td3}? z?`lhEv@>*hnDs5u@OZRwVr+b5EI2Y0iFWjbhKC}9n)mBNdCl0Fb=rX-j&SW@INIp> zb8Wc4VM_CU9xyM>`)%HJ{X<}$+qbT?eY#!DL$Ab()E;47oKmlen79QiYDd3#0Di zAeF+vJ2*t8GWG@nR91#hFx&%;^DvsIbev>T1#Caj3!4t1!}#|Ge8TOEiF}{Dx#1Ke zEXbzPc)XKO9T2lTB7=JEZ#?~Jc=`>jnSA6TBROg$-^!1*DtR?8qqWvbI&D&D%Ebg7NhRGenM@~;N7SW2L({`w(rEPGEvg$*0 z$Ig{&)D$9#58!LKcW+G4GecAiBs2GZ_k7>^d+)p8x1PY)gU?@p>(qAwDNpmqz|Y0W zM5L1-w+zO)tx#{}pLQ&F3?^O6RwsA4uX9h)yJl{hLlv`H9Lj9Hwykx8X=W5!tzj!p zr(C*J8(P>XRqc$uVVUbAIw?i?h@&lJaiUSGGz->7fH@X)=KqiFN(>(GP@!*{m4-FH zD)D2}gNG>&D{xgK0cKe=@bSn|9Onm@{5)28;!#JLHF(OhqQk7$n^v`;NSx$zER0jH zl&{dw zRkT5@_x)|Z&Z`-G7O(wb77xgR@1ay`ce+;4Y)XcImC@N zH|OFZMr9xNCO$E?O^<97+vwi+c(pw)eqd^!+3XpwuzRF;$(&kh^Tat%w0YL%MVtJN z6D2WhSf@`%@zsFD&i z#wf1@c`1puAI~p_@#!d?;NK6%m9SCCArlf*ZpHmc6>F{d!|^rBVs(5gf;1Pc3-Y-U NHB?0Cs+c|0ego1@uVDZH diff --git a/bin/CursorTest.class b/bin/CursorTest.class index be5dfe2682b91920964ae6f868ee3cc82483be86..c5850dcb35e6b3f6cbc1583f708c80ae223cc1ca 100644 GIT binary patch delta 1561 zcmaJ>O>Y}j6g~6du`?Z94<)Ic#`$U-nz7w9X-yj^p=s+h4NXjGLO)19Fm#%<2`Q}| zf`pJ)6%rDwK?sQzRV7#;p^7S0AoT~ZWy23ZmDunDSRl@QV>^+GDr@}Cd-LA8_nvp| z{N4UT(*Et=U!DReVB?YfOsi<n>sz6R|kpJiD;<6xHSb-mv@>tGJ^!FPJr zdegx6`O76Zc=u`W2c$h}1)YrW%Oi5pgpuFgEJI=F`GWc--Vtgu!byodLL zZw)V&hwtDft_QyxQ?a91b+CpHf)nOLZP!oFOiQchU_(bg1+;i_KgV5s9>7F|9pfjyiTO^$UYn=GI%hKDIzoYE7D)znVpNTT>R5a z(A73wJZ+{ZGyM{0MN=|%jVG?YB-4nRnwpFIGPTrH?{W3hGL3pt&IvDXrglDyqh4V_Rc2JerkPS+!$Zk}~$N(*3M;07+yp$X|igmgtiO4DtRvtRRbZ zB4Ytl!Ar5dLt!ml+#VXhJBJeICsY+A(yWpfI?gFnAJCTvG0X z^fCP?w`bC!y{cV;Yq7*=Gl$DB&fzR`m}9JYB!fOXU4Kz5_B&%pL#{FdgJZ_aKE{>L za`MMG=`Fk~D>r22MssDm?6^8~9xwB@2e7Eh?G1?<<)+AqW!9z%J3S}e2HfKJiQTq?N%Jakk delta 1348 zcmbVMOHUI~6#nMXX(yR5DgklOpH5!h6|Ve02jvZ-l4^~aN*+Kd(NFR=ljlg&djU8kImk%zdn2d z(1Ob=-tS6-8+8gwW-`l}`pnhE`ho29+@cpT)SDGo%}qEvx0#dU$}q6j%);vhq+we3cSi9_hL`?aXiW#TZ+n_9#;V&W*0_DikN=rPgD z*l$`i-fv<6oeIjXWS6HBOY;la`QdCLo1LGWp35vwEfkT@aT7xrCeSsmqyQT+aT23; zQnx%YoH8+nVf(t?VVuXf8yP#NMzje`+F$giiucVWm!a5}JDiK9HSHaC^?pPw?Z*Q@ ze$wlco^sWXPxMlGPaUP#rb}0Q?^nl!>yoan_;E|PhIG}iU+osI+lt0k(P+i$#9kNF z#SzqlE_u3wIYSyo&@E5*TG-mH^J-K)ipq!;c1lGF_Y^j9FNYUf5WrScA;cbTLl?pn zrUK)r#3gLU9Cly{J8=UM++x%{RO3Dy_XxFk0?UIJh~hP3cE6{ry_qQ#rhAAzv{Z)Q z!CqP#*LCdUt`p!gT4}ima|Ug+41%SwA1(GX&rS;Jr*Kj#N7TGhj;MK|98n88=~Ab- z)G6-h6sJxsJ-%LZ6-N-LXZ;PVxDghbNM$$L(aecz;r#4DVu*}4FszvjfnoUI=UIYo z-iYe9vJR&@iwT_SS}CGa9pu2?Evn45TW=9$0}|p~MR&@oqjzkbO{oNEgNLR25T|Sh zsDHZzwu~cXTwS{%;F_4VTZ>D5=LCW#XWlE~?JM4pHN{9p zMB)N1!8VMGv|OBda97Ja#AES4cwQVG`#T4Ya}0+5P$^Vk7(zaGsE|8^=|6J^m|MXN I^Q)Ns4LTdiod5s; diff --git a/bin/ImageCollector$1.class b/bin/ImageCollector$1.class new file mode 100644 index 0000000000000000000000000000000000000000..e3fbe9facb4ad281593bcc829a5a6fc2f9fcf404 GIT binary patch literal 843 zcmZuvO>fgc5Pchm7`vu1DJ|bLP!|$65PCoe6}UtMRZ7bts7U3sahAl@+D7)azlsYI zZ6yx;0Dcr=c4LHGuw>89?97`tZ~XJu_a6YB;jxVxgTI^bnHXeJib!R7ux+DG(IbAs z`;w=#{=3N$-PmX_teI$>^@p((DNh7hC31#_n#V=(l3PHK??5)HP5CtI)qnE^$=okq;y<3Q?dR83k*^CW9oKP#EW=IQDxuz%P);xW2LBAVzfeLA8l+*0UKoJ3>F1OH hAXfMBz}!37FzqY^rg9Sx$=2}*UG(VWQkHH`&u>+ey>I{k literal 0 HcmV?d00001 diff --git a/bin/ImageCollector.class b/bin/ImageCollector.class new file mode 100644 index 0000000000000000000000000000000000000000..9847b8f3913e80399d95758c42e4801cd6145cbb GIT binary patch literal 3599 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 I%BS@8zfrnkhyVZp diff --git a/bin/cascadeTrainingImageCollector.class b/bin/cascadeTrainingImageCollector.class index 798265a10464c37d0f63deb624846251d177e4e9..1e937c43521d3533289fcc73ac56dee3e69f1419 100644 GIT binary patch literal 4133 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 cursorPathsByDistance; @@ -37,6 +38,7 @@ public class Cursor { robot = new Robot(); randomizer = new Randomizer(); + random = new Random(); } private void initializeCursorPathsByDistanceFromFile(String path) { @@ -115,22 +117,25 @@ public class Cursor { public void moveCursorToCoordinates(Point goalPoint) throws InterruptedException { Point startingPoint = getCurrentCursorPoint(); - int distanceToMoveCursor = (int) startingPoint.distance(goalPoint); + int distanceToMoveCursor = getDistanceBetweenPoints(startingPoint, goalPoint); if (distanceToMoveCursor == 0) { return; } double angleToMoveCursor = getThetaBetweenPoints(startingPoint, goalPoint); - // TODO: check if exists CursorPath cursorPathToFollow = chooseCursorPathToFollowBasedOnDistance(distanceToMoveCursor); + double angleToTranslatePathBy = angleToMoveCursor - cursorPathToFollow.getCursorPathTheta(); + followCursorPath(startingCursorPoint, angleToTranslatePathBy, cursorPathToFollow); } + public int getDistanceBetweenPoints(Point startingPoint, Point goalPoint) { + return (int) (Math.hypot(goalPoint.x - startingPoint.x, goalPoint.y - startingPoint.y)); + } - //TODO: fix - private double getThetaBetweenPoints(Point startingPoint, Point goalPoint) { - return Math.atan2(startingPoint.x * goalPoint.y, 1.0 * goalPoint.x); + public double getThetaBetweenPoints(Point startingPoint, Point goalPoint) { + return Math.atan2(goalPoint.x - startingPoint.x, goalPoint.y - startingPoint.y); } private void followCursorPath(Point startingCursorPoint, double angleToTranslatePathBy, CursorPath cursorPathToFollow) throws InterruptedException { @@ -145,16 +150,13 @@ public class Cursor { robot.mouseMove(pointToMoveCursorTo.x, pointToMoveCursorTo.y); } - private CursorPath chooseCursorPathToFollowBasedOnDistance(int distanceToMoveCursor) { - if (distanceToMoveCursor == 0) { - return new CursorPath(new ArrayList()); - } - + private CursorPath chooseCursorPathToFollowBasedOnDistance(int distanceToMoveCursor) { int newDistanceToMoveCursor = findNearestPathLengthThatExists(distanceToMoveCursor); - double scaleFactor = getScaleFactor(newDistanceToMoveCursor, distanceToMoveCursor); + double scaleToFactorBy = getScaleToFactorBy(newDistanceToMoveCursor, distanceToMoveCursor); ArrayList cursorPathsWithSameDistance = cursorPathsByDistance.get(newDistanceToMoveCursor); - CursorPath scaledCursorPath = cursorPathsWithSameDistance.get(new Random().nextInt(cursorPathsWithSameDistance.size())).getScaledCopyOfCursorPath(1.0); + int indexOfRandomPathToFollow = random.nextInt(cursorPathsWithSameDistance.size()); + ArrayList scaledCursorPath = cursorPathsWithSameDistance.get(indexOfRandomPathToFollow).getScaledCopyOfCursorPath(scaleToFactorBy); return scaledCursorPath; } @@ -171,7 +173,7 @@ public class Cursor { return distanceToMoveCursor + offset; } - private double getScaleFactor(int newDistanceToMoveCursor, int distanceToMoveCursor) { + private double getScaleToFactorBy(int newDistanceToMoveCursor, int distanceToMoveCursor) { return (1.0 * newDistanceToMoveCursor / distanceToMoveCursor); } diff --git a/src/CursorPath.java b/src/CursorPath.java index b27573a..3c02b2f 100644 --- a/src/CursorPath.java +++ b/src/CursorPath.java @@ -26,15 +26,15 @@ public class CursorPath { return normalizedDelayCursorPoints; } - private ArrayList getTranslatedCopyOfCursorPath(ArrayList cursorPoints, CursorPoint cursorPointToTranslateBy) { + private CursorPath getTranslatedCopyOfCursorPath(ArrayList cursorPoints, CursorPoint cursorPointToTranslateBy) { ArrayList offsetCursorPath = new ArrayList(); for (CursorPoint cursorPoint : cursorPoints) { offsetCursorPath.add(cursorPoint.getCursorPointTranslatedBy(cursorPointToTranslateBy)); } - return offsetCursorPath; + return new CursorPath(offsetCursorPath); } - private ArrayList getNormalizedDelayCopyOfCursorPath(ArrayList cursorPoints) { + private CursorPath getNormalizedDelayCopyOfCursorPath(ArrayList cursorPoints) { ArrayList normalizedDelayCursorPoints = new ArrayList(); for (int i = 0; i < cursorPoints.size() - 1; i++) { CursorPoint cursorPoint = cursorPoints.get(i); @@ -42,24 +42,24 @@ public class CursorPath { normalizedDelayCursorPoints.add(cursorPoint.getCursorPointWithNewDelay(nextCursorPoint.delay - cursorPoint.delay)); } normalizedDelayCursorPoints.add(cursorPoints.get(cursorPoints.size() - 1).getCursorPointWithNewDelay(0)); - return normalizedDelayCursorPoints; + return new CursorPath(normalizedDelayCursorPoints); } - public ArrayList getScaledCopyOfCursorPath(double factorToScaleBy) { + public CursorPath getScaledCopyOfCursorPath(ArrayList cursorPoints, double factorToScaleBy) { ArrayList scaledCursorPath = new ArrayList(); - for (CursorPoint cursorPoint : this.cursorPoints) { + for (CursorPoint cursorPoint : cursorPoints) { scaledCursorPath.add(cursorPoint.getCursorPointScaledBy(factorToScaleBy)); } - return scaledCursorPath; + return new CursorPath(scaledCursorPath); } - public ArrayList getRotatedCopyOfCursorPath(double angleToRotateBy) { + public CursorPath getRotatedCopyOfCursorPath(ArrayList cursorPoints, double angleToRotateBy) { ArrayList rotatedCursorPath = new ArrayList(); - for (CursorPoint cursorPoint : this.cursorPoints) { + for (CursorPoint cursorPoint : cursorPoints) { rotatedCursorPath.add(cursorPoint.getCursorPointRotatedBy(angleToRotateBy)); } - return rotatedCursorPath; + return new CursorPath(rotatedCursorPath); } private int calculateCursorPathTimespan() { @@ -75,7 +75,8 @@ public class CursorPath { } private double calculateCursorPathTheta() { - return getStartingCursorPoint().getThetaFrom(getEndingCursorPoint()); + CursorPoint endingCursorPoint = getEndingCursorPoint(); + return Math.atan2(endingCursorPoint.y, endingCursorPoint.x); } public CursorPoint getStartingCursorPoint() { diff --git a/src/CursorPathTest.java b/src/CursorPathTest.java index aebfc08..36138b6 100644 --- a/src/CursorPathTest.java +++ b/src/CursorPathTest.java @@ -16,8 +16,10 @@ class CursorPathTest { for (CursorPath cursorPath : cursorPaths) { testCursorPathStartsAtOrigin(cursorPath); testEndingCursorPointInCursorPathHasZeroDelay(cursorPath); + testCursorPathDistance(cursorPath); + testCursorPathTheta(cursorPath); //testCursorPathLocations(cursorPath); - testCursorPathRotation(cursorPath, 15); + testCursorPathRotation(cursorPath, Math.PI); testCursorPathScaling(cursorPath, 1.15); cursorPath.displayCursorPoints(); } @@ -33,6 +35,21 @@ class CursorPathTest { assertEquals(endingCursorPoint.delay, 0); } + private void testCursorPathDistance(CursorPath cursorPath) { + int distance = cursorPath.getCursorPathDistance(); + CursorPoint startingCursorPoint = cursorPath.getStartingCursorPoint(); + CursorPoint endingCursorPoint = cursorPath.getEndingCursorPoint(); + + int actualDistance = (int) Math.hypot(startingCursorPoint.x - endingCursorPoint.x, startingCursorPoint.y - endingCursorPoint.y); + assertEquals(distance, actualDistance); + } + + private void testCursorPathTheta(CursorPath cursorPath) { + double theta = cursorPath.getCursorPathTheta(); + CursorPoint endingCursorPoint = cursorPath.getEndingCursorPoint(); + double actualTheta = Math.atan2(endingCursorPoint.y, endingCursorPoint.x); + assertEquals(theta, actualTheta); + } /*private void testCursorPathLocations(CursorPath cursorPath) { }*/ @@ -41,12 +58,11 @@ class CursorPathTest { ArrayList cursorPoints = cursorPath.getCursorPathPoints(); ArrayList rotatedCursorPoints = cursorPath.getRotatedCopyOfCursorPath(angleToRotateBy); assertEquals(cursorPoints.size(), rotatedCursorPoints.size()); - CursorPoint startingPoint = cursorPoints.get(0); for (int i = 1; i < cursorPoints.size(); i++) { - double originalThetaOfCursorPoint = cursorPoints.get(i).getThetaFrom(startingPoint); - double rotatedThetaOfCursorPoint = rotatedCursorPoints.get(i).getThetaFrom(startingPoint); - System.out.println(originalThetaOfCursorPoint + ", " + rotatedThetaOfCursorPoint); - assertInRangeByAbsoluteValue(originalThetaOfCursorPoint + angleToRotateBy, rotatedThetaOfCursorPoint, 3); + double originalThetaOfCursorPoint = cursorPoints.get(i).getTheta(); + double rotatedThetaOfCursorPoint = rotatedCursorPoints.get(i).getTheta(); + System.out.println((originalThetaOfCursorPoint + angleToRotateBy) % (Math.PI) + "," + rotatedThetaOfCursorPoint); + //assertInRangeByAbsoluteValue(originalThetaOfCursorPoint + angleToRotateBy, rotatedThetaOfCursorPoint, 3); } } @@ -68,8 +84,8 @@ class CursorPathTest { } - void assertInRangeByRatio(double valueToTest, double expectation, double toleranceRatio) { - assertTrue((valueToTest <= (expectation * (1 + toleranceRatio))) && (valueToTest >= (expectation * (1 - toleranceRatio)))); + void assertInRangeByRatio(double expected, double actual, double toleranceRatio) { + assertTrue((actual <= (expected * (1.0 + toleranceRatio))) && (actual >= (expected * (1.0 - toleranceRatio)))); } void assertInRangeByAbsoluteValue(double valueToTest, double expectation, double toleranceAbsolute) { diff --git a/src/CursorPoint.java b/src/CursorPoint.java index 9d89f21..b6cc908 100644 --- a/src/CursorPoint.java +++ b/src/CursorPoint.java @@ -16,8 +16,8 @@ public class CursorPoint { return Math.hypot(this.x - b.x, this.y - b.y); } - public double getThetaFrom(CursorPoint b) { - return Math.atan2(1.0 * b.y, 1.0 * b.x); + public double getTheta() { + return Math.atan2(this.y, this.x); } public CursorPoint getCursorPointTranslatedBy(CursorPoint startingCursorPoint) { @@ -29,8 +29,8 @@ public class CursorPoint { } public CursorPoint getCursorPointRotatedBy(double angleOfRotation) { - int rotatedX = (int) (this.x + Math.cos(angleOfRotation) * this.x - Math.sin(angleOfRotation) * this.y); - int rotatedY = (int) (this.y + Math.sin(angleOfRotation) * this.x + Math.cos(angleOfRotation) * this.y); + int rotatedX = (int) (Math.cos(angleOfRotation) * this.x - Math.sin(angleOfRotation) * this.y); + int rotatedY = (int) (Math.sin(angleOfRotation) * this.x + Math.cos(angleOfRotation) * this.y); return (new CursorPoint(rotatedX, rotatedY, this.delay)); } diff --git a/src/CursorPointTest.java b/src/CursorPointTest.java index a7c5ba0..45d19e4 100644 --- a/src/CursorPointTest.java +++ b/src/CursorPointTest.java @@ -22,18 +22,33 @@ class CursorPointTest { void testCursorPointRotation() { CursorPoint a = new CursorPoint(0, 0, 0); CursorPoint b = new CursorPoint(10, 0, 0); - //CursorPoint c = new CursorPoint(10, 20, 0); + CursorPoint c = new CursorPoint(10, 20, 0); CursorPoint d = a.getCursorPointRotatedBy(Math.PI / 4); - CursorPoint e = b.getCursorPointRotatedBy(Math.PI / 2); - //CursorPoint f = c.getCursorPointRotatedBy(90); + CursorPoint e = b.getCursorPointRotatedBy(Math.PI / 3); + CursorPoint f = c.getCursorPointRotatedBy(-Math.PI / 6); + CursorPoint g = b.getCursorPointRotatedBy(-Math.PI / 6); - //System.out.println(a.getThetaFrom(a)); - //System.out.println(b.getThetaFrom(a)); assertTrue(d.x == 0 && d.y == 0); - System.out.println(e.x + ", " + e.y); - //assertTrue(e.x == 5); + assertTrue(e.x == 5 && e.y == 8); + assertTrue(f.x == 18 && f.y == 12); + assertTrue(g.x == 8 && g.y == -4); + } + + @Test + void testCursorPointScaling() { + CursorPoint a = new CursorPoint(0, 0, 0); + CursorPoint b = new CursorPoint(100, 0, 0); + CursorPoint c = new CursorPoint(100, 200, 0); + CursorPoint d = new CursorPoint(-400, -300, 0); + CursorPoint e = a.getCursorPointScaledBy(1.1); + CursorPoint f = b.getCursorPointScaledBy(0.95); + CursorPoint g = c.getCursorPointScaledBy(1.23); + CursorPoint h = d.getCursorPointScaledBy(1.07); - //assertTrue(withinRangeByRatio()) + assertTrue(e.x == 0 && e.y == 0); + assertTrue(f.x == 95 && f.y == 0); + assertTrue(g.x == 123 && g.y == 246); + assertTrue(h.x == -428 && h.y == -321); } boolean withinRangeByRatio(double actual, double expectation, double toleranceRatio) { diff --git a/src/CursorTest.java b/src/CursorTest.java index 6833c99..185c0ce 100644 --- a/src/CursorTest.java +++ b/src/CursorTest.java @@ -22,6 +22,15 @@ class CursorTest { testRightClickCursor(); } + @Test + void testThetaBetweenPoints() { + Point a = new Point(0, 0); + Point b = new Point(10, 0); + Point c = new Point(10, 10); + Point d = new Point(20, 10); + assertEquals(cursor.getThetaBetweenPoints(a, b), 0); + } + void testMoveCursorToCoordinates() throws InterruptedException { Point a = new Point(0, 0); Point b = new Point(150, 250); diff --git a/src/ImageCollector.java b/src/ImageCollector.java new file mode 100644 index 0000000..4053142 --- /dev/null +++ b/src/ImageCollector.java @@ -0,0 +1,85 @@ +import java.awt.AWTException; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; + +import javax.imageio.ImageIO; + +public class ImageCollector { + + public String screenshotOutputDirectory; + public Rectangle gameWindowRectangle; + + /* + * Methods needed: + * + * - Capture screen window every N seconds + * + * initialize with: output directory, file name + * + * detect last file name + */ + + public ImageCollector(String screenshotOutputDirectory) { + initializeGameWindowRectangle(); + this.screenshotOutputDirectory = screenshotOutputDirectory; + } + + private void initializeGameWindowRectangle() { + this.gameWindowRectangle = new Rectangle(103, 85, 510, 330); + } + + public void collectImages(String itemName) throws IOException, InterruptedException, AWTException { + int itemCounter = getItemCounter(itemName); + int numImagesToCapture = 50; + for (int counter = itemCounter + 1; counter < itemCounter + numImagesToCapture + 1; counter++) { + captureAndSaveGameWindow(itemName, counter); + Thread.sleep(2000); + } + } + + private int getItemCounter(String itemName) { + File[] listOfFiles = getFilesFromFolderThatStartWith(itemName); + int counter = 0; + for (File file : listOfFiles) { + counter = Math.max(counter, getItemNumberFromFile(file.getName())); + } + return counter; + } + + private File[] getFilesFromFolderThatStartWith(String itemName) { + File folder = new File(screenshotOutputDirectory); + File[] listOfFiles = folder.listFiles(new FilenameFilter() { + public boolean accept(File file, String name) { + return name.startsWith(itemName); + } + }); + return listOfFiles; + } + + private int getItemNumberFromFile(String fileName) { + String itemNumber = fileName.substring(fileName.indexOf("_") + 1, fileName.indexOf(".")); + return Integer.parseInt(itemNumber); + } + + private void captureAndSaveGameWindow(String itemName, int fileCounter) throws IOException, InterruptedException, AWTException { + Robot robot = new Robot(); + BufferedImage imageCaptured = robot.createScreenCapture(gameWindowRectangle); + String fileName = getFileName(itemName, fileCounter); + ImageIO.write(imageCaptured, "jpg", new File(fileName)); + System.out.println("Wrote file: " + fileName); + } + + private String getFileName(String itemName, int counter) { + return screenshotOutputDirectory + itemName + "_" + counter + ".jpg"; + } + + public static void main(String[] args) throws Exception + { + ImageCollector imageCollector = new ImageCollector("/home/dpapp/Desktop/RunescapeAI/TensorFlow/IronOre/"); + imageCollector.collectImages("ironOre"); + } +} diff --git a/src/ScreenshotAutomator.java b/src/ScreenshotAutomator.java deleted file mode 100644 index 0b57af4..0000000 --- a/src/ScreenshotAutomator.java +++ /dev/null @@ -1,56 +0,0 @@ -import java.awt.AWTException; -import java.awt.Rectangle; -import java.awt.Robot; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.util.Scanner; - -import javax.imageio.ImageIO; - -public class ScreenshotAutomator { - - public String screenshotOutputDirectory; - public Robot robot; - public Rectangle screenAreaToCapture; - - public ScreenshotAutomator(String screenshotOutputDirectory) throws AWTException { - this.screenshotOutputDirectory = screenshotOutputDirectory; - this.screenAreaToCapture = new Rectangle(0, 0, 1920 / 2, 1080); - this.robot = new Robot(); - } - - public void captureEveryNSeconds(int n) throws IOException, InterruptedException { - for (int i = 0; i < 20; i++) { - captureScreenshot(i); - System.out.println("Created image: " + getImageName(i)); - Thread.sleep(n * 1000); - } - } - - public void captureOnKeyboardInput() throws IOException, InterruptedException { - int counter = 0; - Scanner scanner = new Scanner(System.in); - while (true) { - captureScreenshot(counter); - scanner.nextLine(); - System.out.println("Created image: " + getImageName(counter)); - counter++; - } - } - - private void captureScreenshot(int counter) throws IOException { - BufferedImage image = robot.createScreenCapture(this.screenAreaToCapture); - ImageIO.write(image, "png", new File(getImageName(counter))); - } - - private String getImageName(int counter) { - return screenshotOutputDirectory + "screenshot" + counter + ".png"; - } - - public static void main(String[] args) throws Exception - { - ScreenshotAutomator screenshotAutomator = new ScreenshotAutomator("/home/dpapp/Desktop/RunescapeAIPics/"); - screenshotAutomator.captureOnKeyboardInput(); - } -} diff --git a/src/cascadeTrainingImageCollector.java b/src/cascadeTrainingImageCollector.java index c314368..11507cb 100644 --- a/src/cascadeTrainingImageCollector.java +++ b/src/cascadeTrainingImageCollector.java @@ -12,13 +12,14 @@ import javax.imageio.ImageIO; public class cascadeTrainingImageCollector { public String imageOutputDirectory; + public String imageInputDirectory; public Robot robot; public int imageDimension; public cascadeTrainingImageCollector(String imageOutputDirectory) throws AWTException { this.imageOutputDirectory = imageOutputDirectory; this.robot = new Robot(); - this.imageDimension = 75; + this.imageDimension = 40; } public void captureEveryNSeconds(int n) throws IOException, InterruptedException { @@ -34,7 +35,7 @@ public class cascadeTrainingImageCollector { captureScreenshotGameWindow(i); System.out.println(i); //System.out.println("Created image: " + getImageName(i)); - Thread.sleep(n * 5000); + Thread.sleep(n * 1000); } } @@ -62,12 +63,32 @@ public class cascadeTrainingImageCollector { return imageOutputDirectory + "screenshot" + counter + ".jpg"; } + private void resizeImagesInDirectory() throws IOException { + File folder = new File("/home/dpapp/Desktop/RunescapeAIPics/CascadeTraining/Testing/"); + File[] listOfFiles = folder.listFiles(); + + for (int i = 0; i < listOfFiles.length; i++) { + if (listOfFiles[i].isFile()) { + resizeImage(listOfFiles[i], i); + System.out.println("Cropped " + listOfFiles[i].getName()); + } + } + } + + private void resizeImage(File imageFile, int counter) throws IOException { + BufferedImage screenshot = ImageIO.read(imageFile); + //Rectangle resizeRectangle = new Rectangle(103, 85, 510, 330); + BufferedImage resizedImage = screenshot.getSubimage(103, 85, 510, 330); + ImageIO.write(resizedImage, "jpg", new File(getImageName(counter))); + } + public static void main(String[] args) throws Exception { System.out.println("Starting image collection..."); - //cascadeTrainingImageCollector imageCollector = new cascadeTrainingImageCollector("/home/dpapp/Desktop/RunescapeAIPics/CascadeTraining/PositiveSamples/"); - //imageCollector.captureEveryNSeconds(30); - cascadeTrainingImageCollector imageCollector = new cascadeTrainingImageCollector("/home/dpapp/Desktop/RunescapeAIPics/CascadeTraining/Testing/"); - imageCollector.captureWindowEveryNMilliseconds(1); + cascadeTrainingImageCollector imageCollector = new cascadeTrainingImageCollector("/home/dpapp/Desktop/RunescapeAIPics/CascadeTraining/CoalNegative/"); + //imageCollector.resizeImagesInDirectory(); + imageCollector.captureWindowEveryNMilliseconds(5);; + //cascadeTrainingImageCollector imageCollector = new cascadeTrainingImageCollector("/home/dpapp/Desktop/RunescapeAIPics/CascadeTraining/Testing/"); + //imageCollector.captureWindowEveryNMilliseconds(1); } }