From 4d6ddea2cfe3d5ec580d0037c5022e9b6a17e7a4 Mon Sep 17 00:00:00 2001 From: davpapp Date: Fri, 2 Feb 2018 00:03:14 -0500 Subject: [PATCH] Writing test bench for item recognition --- bin/Item.class | Bin 2590 -> 2605 bytes bin/Items.class | Bin 2324 -> 2788 bytes bin/ItemsTest.class | Bin 0 -> 2670 bytes bin/main.class | Bin 676 -> 731 bytes src/Item.java | 13 +++++----- src/Items.java | 25 +++++++++++++------ src/ItemsTest.java | 57 ++++++++++++++++++++++++++++++++++++++++++++ src/main.java | 2 +- 8 files changed, 82 insertions(+), 15 deletions(-) create mode 100644 bin/ItemsTest.class create mode 100644 src/ItemsTest.java diff --git a/bin/Item.class b/bin/Item.class index 7432017200ced071822d3baaed8bfc1c7b274de6..92f038208287de707d3f36c61bcff571878af647 100644 GIT binary patch literal 2605 zcma)8TT@e47+pI#Ngy5|5ChsEBHnTVQmRlZ7Ats53q*xtk=pi<9KyjQ2Ty`pANu5< z@J(krZ)*<8ay8B=z_48xCzj#hLE_!G&6FzBvhFTw&H64)|I z)_qeEZl$eTM+hynOn3gt=g(I$`FB5 z|F2X#fy3y-QCW^-0o|iC*;8YE-K#BBq$vl5MG;bIkcwbB@C? z$7z-hmvvG&Ks1>)=K?VwNtC>f z0+=V}5?GK!RK4ifW%XjI{K+NqDZ&bYa@w~Cloejpv4&gBW-Rkj&=RCBZ%T1_#Qow# zhX`alRUY`3X!N!;2qv@%pop^qt{>mJIeWv&o9-QH&2n6ZB_j} z-z~JXBFytW+-cnDXy< zS7}hO?`cvOZ2(0ZKv54!U=mYa`UM3i%b2d?{6mCO>6SV!J@r3ja=$90t0vA)^s<0` z3Z$FBvRvCG{DfT-m{w7ugJxc65920x(!D?R1BNy+ljh$eMBUvScXN*r(3&A#Jp)Zp z{SByoyaCn6)O;E|s6V{v$@wSzW7-pp`o{uKa5yEgVp=S)iG{THUB``w2tM$O2LTZa zNEVN`et)2em?rr>-um?bgJR#l#cV(g<#B>0xJt4`DX!A|N%E;qP;*AHo=`)aYp~9F ztbrW9V5F?b48G*bPs$VciYtvHJ_v)WfGT7Z!N2*hxA+SI(d&DOJuf-ZKKXEXYJX&~ zyelKAcpb~Lsa}4b)|BM^L$Sc{ekvX=JjY54W%!>ep~1&ne`?#!?c;wCfD=q}lDA}( z13QKzRC0{#3{E#`8EI%4L5UpYeHlTSD<7lNsK6$jHb$>=rSY~M#O;O_4$&(_LvZ*j zx}zmx77LT;tcb9>9B;qZD@yI@RIWxFD{_?7VMI6Fe bMcBRInFiqus*3Os{c0rVBk%?ze7N%uOfL^_ literal 2590 zcma)7-%}G;7(I8hVIeLUh!HWAf?6dBA;k(>v8W(wT7IY?7Ok~QvLuU1Hg1AiANu4! z;hW5K#up#jnU>hv>2s&Aed|Ba|Dn@L&)r=@lsfGIyZ7$*-S3?9-E%L$zWVWJ0HdgB zPz2OW%`9n91;T5_eIs2o%K7yC%9@$23A9-ZW=clh6zH3AiP^W(d}#Fqp@(+{&|rDoaXs)juR5f{R;)0z23gcPUj zoEbs@9Xd4Z6$lK*mqHNe)X{}jfxQygGK$tC(!lUbSu|FPq~A4TXN}^L z;aGC+e^hG)t4iiGvI&&XDfM2k9E!J{FRvK2f?T-M7hjA(t4y3TN~VUGfWA%pqE#eO zfp>KD;a!1!YqnLEWo}rtf(*(f0;m38gLVUla1aBs35Nut|58M@yc#m;O>Y=w+ zvZHd(GV?l)VUR6#Od}^S?AKsivKx@iaFB>;e8y}F!Gw`yx!{g04D^r`$loyoL?0<+AP!aJT#cM8n4dy>9p4!b8UlW+^dm)^1oi>2n^cj9g5MT#=zRhAx{{zQB9n z(0_=^NL3ju=vc&c_MS_xU78dK4rVg4s=y5$pJG`cRWTSbRT#+S6*s&k*nYD`&;0qlFR%m+ZJeo`g`jhEm3cCAPoj?YL~^K( z@VA^Qi169rg_y20y&e1bt>6C^#eUAX5ZySya&pwek-{I|n7e@TB%(5_`y~!8yFk5l z^v@+yFL3yK#NPxB6TFiUT`p+CTZ(Pa?gnVL586RpNeq#kBJV{KYE~C{iPUoP1=4kl z4sBv=6Q{o+7f)r2%RbtqF46#sG=L&LkiZ1a`sJ^)g2FoCM6!-^PtYdcQ_lm>`7O}Y z!5;SGAO-ch82i074U8}@a*G5mxvNA6!#ub?#BCp>5 zoTCI=ndEGU&je2L+Z1nmY0e4P>(dR2(>_Iz;!WIgdpU*AI0}&H1a5Pr(zrwToTH$- z1z`mL=6`(g7lNW!`IAva-YdSqAGlJUr;$XgjyrP+n)uFX)m7P(iUx;!C~`RW0@>ED z5ez(cwY6+){m~?*j|UMr!7`&fQ)BeWN&ZJYg`*s&G2SF(q#QvBRv!Db_ETs%5bMO&SM$qiEZq9Y z8wO+Hus>{xg%5bc*`b|76Jj~gIw_oU347NAS^b8L{Ibv9ed z#^ykB^vh#;}eLkmP8BE^i-k9K&(ZuJ(sNW^kk}Bd;Tc zQ!=1W*8GHH1ZPA}J>^PsoWpssrsnqz;8TuE7-!JT!j!Q*HciQqbTq9~1D|nR!BvrR z^tXD<#dJQKGcM22g|J20k#v2*@g=?zuN|@WZ#c5J&afkASkixTC6mn?3>{)s4S1x5 z_@*$$VPINxIj6!5L5h`8W7E<7*B^dg}ptDOHQvBsk%yHyVU~t_uR>lpB!5fKI zby%{@xj31Io3VhRhFetK7HG@Cu?R|Vo0d_`TJuG!_@7*=YTF5*gk=riGWZ$*(mNs3 zI9Bi-sZubO3C+I+VUK6*`mAw7GAQ8(jvo;v9cQwO847iy%-}Tg3)TvQZWb1nEW14o zzc7Tw5oeg@)`{C3cW_ty;hZwuG$ooQ6g1QRIOxUELbnmJDDjt)Xo?4`@N4zP+Sx%yZ@Jag?iEi<}olw>_4SwacP6ud85qihA2@xq*3x%u{ssZj`aa@CE~;bq{;vG!1oM~H~;bdBpa(T z3fgiVqz2;n5Qm7@LG;nA8>33pnI*7lGwUFkq-<4Yekhx?AP##Ueujq9q+Ak3{u9)= grsyTNfJ?5V$**sa`oFeA@6lEkV)VI3`3in}2l*`A-v9sr delta 950 zcmZuvOHUI~7(I7p=(NMNEfg3YA`moSi%fW9D*~mWRbGOMh_BiXr9dCrYFw!+H*T!g zjfoo*ce2oE+Qfx%?ZWsY+_>-uxKY0u3M9tOmwUfC-#O z$CBJ#d_5Y{oTz2+8|&G$X(V#7T+WD?`OQK$XDr^$nE7}tXHG^JQt`YIEtu)Np@E@} zqaF>#pB=@gjl#`_-=~?6iD}j)9!R}oqYU1S*u9vs70V=zrNW(5CaEIG;8~rq`>Cuk zo!T-(8jj!uhYJnX=_JQECd3b^|KJpZVyS5eYsy0zj8Xea; zZs4YPrucogIO0eUQ_?J0`V7s*Vx4!!I+NQl);N+_7r&H*rlAE}9BE|48%Khv!mH|$ zF-T+-sP>oP@z>Ur;d@6{2|86bWU3kzR8!?>q#NIXqY2G6j$#!BwTqR-OSO;b;;Y&g zv2gA7Y_Ng@g6PKp&9=jfL3&XM!-Ucy{~=or6-=e=8P(%JodikrIa|got=fkjys};I60$DGhTc#5~jyymI+$ z|2vWEyPOnm3LCbjZhPH{Tn4KrUixkJOjF!M#Vr+L-u#U4zovWtXSxyrBOWzN1QK$8 E0X5B#WdHyG diff --git a/bin/ItemsTest.class b/bin/ItemsTest.class new file mode 100644 index 0000000000000000000000000000000000000000..f85b003fca98ea2de9ee569f3cb8679496ddfa04 GIT binary patch literal 2670 zcmb7FYf}?f7=8{3*$`KyQBf2TZwNuN-l#1o3L=^og#yK*wsuKQ!eX);cQ*?5-r670 zkNr}=b=r;wrq1{S`cL{BI#c?b%>q$Sr<2LG!X3<*yB^&vI}ZGY`K(j+{JOzpA$%q zt{a&2T?$b?cHXire?TD8)jcf`z3k*<0ugN0(S(G+_EF20H!7uB=}wumMXAgYW+WaT&ubVwOWrARRjAdEltK z=GT1a*Yu2`NXXDryMSJQw zj?5%Gm(cYLsZ{d#Go;t8Cn*hT#<7dP7VP7lweG2H&C^MGiqv^JMJ*NCX}(qPf76b} zw@g)WCiRq#o+4dE?@V9x#X#i36J%PWZKp?js(Ak=^z|&`Vqas5t1C;$^u=0ZN~N{2 zitEexh=D)H&6(uP5^gJzD(+PAIWu|OAlml-yt1sqj|AX!5l_1`GHH zLk(QrdoviKEd;}P9T<~!U<_{rBU$_fu_pnB1f?}rg}n^-ZLs{h4oivw0^JOwhoBrM z04MmBW`YJT;v}v!19)m;SjR#Fm;|7@}&0@5z+vm>&Z9 G$NvF=TYC)v literal 0 HcmV?d00001 diff --git a/bin/main.class b/bin/main.class index 2ecbb460b49de23e54545e975bc32786d55e2bc6..b021deaa939449f0a221cd9bca5160172bc036b6 100644 GIT binary patch delta 303 zcmYk1O-chn5QSe)7$#|h=!_2jYy3^(PrGp;x)Iz20tN$u?wYYlMw6Mw?h#yhh+IIy zr5jx+D0l#`;9bNT-AF;fdsW{n>cRbT`RDiB2Y?-H-*a|b#3Vyqbkn{P=UQql4wbpI zsTRjsqD&;UI%u@w$cTnjeIqzROqbzehGD$gypY#Y^kmWzZF?0boxR#g33FKRFwZdZ zZ+c@0FQbA*hC-TIqH}n#&w|}$hGIL5B4td4V--~oYYf3J9jBs2!It8cq<~s}*weYy zO9prB@$3i%IP_5Pj_}lYa)CZn1GOhL2x&NSmbsF37<_2l0x#^7!)@G1(_JQfFvIS qGnnLH5M&Tw5Mkg3^28vT7}OawfIJQcP6kZ|Ee1v))CTgI7<2${wkK-< diff --git a/src/Item.java b/src/Item.java index b8b9533..2fa529c 100644 --- a/src/Item.java +++ b/src/Item.java @@ -7,9 +7,11 @@ import javax.imageio.ImageIO; public class Item { private BufferedImage itemImage; + private int minimumNumberOfMatchingPixels; public Item(String itemDirectoryPath, String itemName) throws IOException { initializeImage(itemDirectoryPath, itemName); + this.minimumNumberOfMatchingPixels = 100; } private void initializeImage(String itemDirectoryPath, String itemName) throws IOException { @@ -23,7 +25,7 @@ public class Item { public boolean itemMatchesImage(BufferedImage itemImageToCompare) { if (imagesAreTheSameSize(itemImageToCompare)) { - return imagesMatch(itemImageToCompare); + return imagesMatch(itemImageToCompare, 5); } return false; } @@ -32,20 +34,17 @@ public class Item { return (itemImage.getWidth() == itemImageToCompare.getWidth()) && (itemImage.getHeight() == itemImageToCompare.getHeight()); } - private boolean imagesMatch(BufferedImage itemImageToCompare) { - return false; - } private boolean imagesMatch(BufferedImage itemImageToCompare, int pixelTolerance) { - int matchingPixel = 0; + int numberOfMatchingPixels = 0; for (int row = 0; row < itemImageToCompare.getWidth(); row++) { for (int col = 0; col < itemImageToCompare.getHeight(); col++) { if (pixelsAreWithinRGBTolerance(itemImage.getRGB(row, col), itemImageToCompare.getRGB(row, col))) { - matchingPixel++; + numberOfMatchingPixels++; } } } - return true; + return (numberOfMatchingPixels > this.minimumNumberOfMatchingPixels); } private boolean pixelsAreWithinRGBTolerance(int rgb1, int rgb2) { diff --git a/src/Items.java b/src/Items.java index 7ac0f99..0810c75 100644 --- a/src/Items.java +++ b/src/Items.java @@ -7,8 +7,8 @@ public class Items { // TODO: write tests HashMap items; - public Items() throws IOException { - initializeItemsFromDirectory("/home/dpapp/Desktop/RunescapeAIPics/Items/"); + public Items(String itemDirectoryPath) throws IOException { + initializeItemsFromDirectory(itemDirectoryPath); } private void initializeItemsFromDirectory(String itemDirectoryPath) throws IOException { @@ -20,7 +20,7 @@ public class Items { } } - private File[] getListOfFilesFromItemDirectory(String itemDirectoryPath) { + public File[] getListOfFilesFromItemDirectory(String itemDirectoryPath) { File itemDirectory = new File(itemDirectoryPath); return itemDirectory.listFiles(); } @@ -31,21 +31,32 @@ public class Items { this.items.put(itemName, item); } - private String getItemNameFromFile(String fileName) { + public String getItemNameFromFile(String fileName) { return fileName.substring(0, fileName.indexOf('.')); } - public boolean isInstanceOf(BufferedImage itemImage, String itemName) { + public boolean isImageThisItem(BufferedImage itemImage, String itemName) { if (items.containsKey(itemName)) { - return getItem(itemName).itemMatchesImage(itemImage); + return getItemByName(itemName).itemMatchesImage(itemImage); } return false; } - private Item getItem(String itemName) { + public String getNameOfItemFromImage(BufferedImage inputImage) { + for (String itemName : items.keySet()) { + if (getItemByName(itemName).itemMatchesImage(inputImage)) { + return itemName; + } + } + return "empty"; + } + + private Item getItemByName(String itemName) { return items.get(itemName); } + + /*public void displayItems() { for (HashMap.Entry entry : items.entrySet()) { String itemName = entry.getKey(); diff --git a/src/ItemsTest.java b/src/ItemsTest.java new file mode 100644 index 0000000..5458a7c --- /dev/null +++ b/src/ItemsTest.java @@ -0,0 +1,57 @@ +import static org.junit.jupiter.api.Assertions.*; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +import javax.imageio.ImageIO; + +import org.junit.Before; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +class ItemsTest { + + Items items; + String testingItemDirectoryPath; + + public void initialize() throws IOException { + System.out.println("running initialize..."); + items = new Items("/home/dpapp/Desktop/RunescapeAIPics/Tests/Items/"); + this.testingItemDirectoryPath = "/home/dpapp/Desktop/RunescapeAIPics/Tests/ItemNameRecognition/"; + } + + @Test + public void testGetNameOfItemFromImage() throws IOException { + initialize(); + + for (File itemFile : items.getListOfFilesFromItemDirectory(this.testingItemDirectoryPath)) { + if (itemFile.isFile()) { + BufferedImage itemImage = ImageIO.read(itemFile); + String expectedItemName = getItemNameForTest(itemFile.getName()); + assertEquals(expectedItemName, items.getNameOfItemFromImage(itemImage)); + System.out.println("Successfully recongized " + itemFile.getName()); + } + } + } + + @Test + public void testIsImageThisItem() throws IOException { + initialize(); + + for (File itemFile : items.getListOfFilesFromItemDirectory(this.testingItemDirectoryPath)) { + if (itemFile.isFile()) { + BufferedImage itemImage = ImageIO.read(itemFile); + String expectedItemName = getItemNameForTest(itemFile.getName()); + if (expectedItemName == "empty") continue; + assertTrue(items.isImageThisItem(itemImage, expectedItemName)); + System.out.println("Successfully recongized " + itemFile.getName()); + } + } + } + + private String getItemNameForTest(String fileName) { + return fileName.substring(0, fileName.indexOf('_')); + } +} diff --git a/src/main.java b/src/main.java index 22eef7e..31beb20 100644 --- a/src/main.java +++ b/src/main.java @@ -11,7 +11,7 @@ public class main { //Cursor cursor = new Cursor(); //Inventory inventory = new Inventory(); //inventory.update(); - Items items = new Items(); + Items items = new Items("/home/dpapp/Desktop/RunescapeAIPics/Items/"); //items.displayItems(); System.out.println("Success!");