Writing test bench for inventory recognition

master
davpapp 2018-02-02 00:49:19 -05:00
parent 4d6ddea2cf
commit ebe9970ff7
16 changed files with 97 additions and 104 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -11,14 +11,23 @@ public class Inventory {
public static final int INVENTORY_WIDTH = 820 - 649;// 820
public static final int INVENTORY_HEIGHT = 350; // 530
Robot robot;
Rectangle inventoryAreaToCapture;
InventorySlot[][] inventorySlots;
public static final int NUM_ROWS = 4;
public static final int NUM_COLUMNS = 7;
public Inventory() throws AWTException {
Robot robot;
Rectangle inventoryRectangleToCapture;
InventorySlot[][] inventorySlots;
InventoryItems items;
public Inventory() throws AWTException, IOException {
initializeInventoryRectangle();
initializeInventorySlots();
initializeItems();
robot = new Robot();
this.inventoryAreaToCapture = new Rectangle(INVENTORY_OFFSET_WIDTH, INVENTORY_OFFSET_HEIGHT, INVENTORY_WIDTH, INVENTORY_HEIGHT);
}
private void initializeInventoryRectangle() {
inventoryRectangleToCapture = new Rectangle(INVENTORY_OFFSET_WIDTH, INVENTORY_OFFSET_HEIGHT, INVENTORY_WIDTH, INVENTORY_HEIGHT);
}
private void initializeInventorySlots() {
@ -30,11 +39,19 @@ public class Inventory {
}
}
private void initializeItems() throws IOException {
items = new InventoryItems("/home/dpapp/Desktop/RunescapeAIPics/Items/");
}
public void update() throws IOException {
BufferedImage image = robot.createScreenCapture(this.inventoryAreaToCapture);
BufferedImage image = robot.createScreenCapture(this.inventoryRectangleToCapture);
updateAllInventorySlots(image);
}
public void updateWithFakeImageForTests(BufferedImage testImage) throws IOException {
updateAllInventorySlots(testImage);
}
private void updateAllInventorySlots(BufferedImage image) throws IOException {
for (int row = 0; row < 4; row++) {
for (int column = 0; column < 7; column++) {
@ -42,5 +59,19 @@ public class Inventory {
}
}
}
public String getItemNameInInventorySlot(int row, int column) {
return inventorySlots[row][column].getItemNameInInventorySlot(items);
}
public boolean isInventoryFull() {
for (int row = 0; row < 4; row++) {
for (int column = 0; column < 7; column++) {
if (!inventorySlots[row][column].isInventorySlotEmpty(items)) {
return false;
}
}
}
return true;
}
}

View File

@ -4,12 +4,12 @@ import java.io.IOException;
import javax.imageio.ImageIO;
public class Item {
public class InventoryItem {
private BufferedImage itemImage;
private int minimumNumberOfMatchingPixels;
public Item(String itemDirectoryPath, String itemName) throws IOException {
public InventoryItem(String itemDirectoryPath, String itemName) throws IOException {
initializeImage(itemDirectoryPath, itemName);
this.minimumNumberOfMatchingPixels = 100;
}

View File

@ -3,16 +3,16 @@ import java.io.File;
import java.io.IOException;
import java.util.HashMap;
public class Items {
public class InventoryItems {
// TODO: write tests
HashMap<String, Item> items;
HashMap<String, InventoryItem> items;
public Items(String itemDirectoryPath) throws IOException {
public InventoryItems(String itemDirectoryPath) throws IOException {
initializeItemsFromDirectory(itemDirectoryPath);
}
private void initializeItemsFromDirectory(String itemDirectoryPath) throws IOException {
this.items = new HashMap<String, Item>();
this.items = new HashMap<String, InventoryItem>();
for (File itemFile : getListOfFilesFromItemDirectory(itemDirectoryPath)) {
if (itemFile.isFile()) {
putItemInMap(itemDirectoryPath, itemFile.getName());
@ -26,7 +26,7 @@ public class Items {
}
private void putItemInMap(String itemDirectoryPath, String itemFileName) throws IOException {
Item item = new Item(itemDirectoryPath, itemFileName);
InventoryItem item = new InventoryItem(itemDirectoryPath, itemFileName);
String itemName = getItemNameFromFile(itemFileName);
this.items.put(itemName, item);
}
@ -51,7 +51,7 @@ public class Items {
return "empty";
}
private Item getItemByName(String itemName) {
private InventoryItem getItemByName(String itemName) {
return items.get(itemName);
}

View File

@ -11,14 +11,14 @@ import org.junit.Before;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
class ItemsTest {
class InventoryItemsTest {
Items items;
InventoryItems items;
String testingItemDirectoryPath;
public void initialize() throws IOException {
System.out.println("running initialize...");
items = new Items("/home/dpapp/Desktop/RunescapeAIPics/Tests/Items/");
items = new InventoryItems("/home/dpapp/Desktop/RunescapeAIPics/Tests/Items/");
this.testingItemDirectoryPath = "/home/dpapp/Desktop/RunescapeAIPics/Tests/ItemNameRecognition/";
}

View File

@ -11,9 +11,8 @@ public class InventorySlot {
private static final int INVENTORY_SLOT_WIDTH = 171 / 4;
private static final int INVENTORY_SLOT_HEIGHT = 254 / 7;
String screenshotOutputDirectory;
Item itemInInventorySlot;
Rectangle rectangleToCapture;
BufferedImage inventorySlotImage;
public InventorySlot(int row, int column) {
initializeRectangleToCapture(row, column);
@ -24,62 +23,14 @@ public class InventorySlot {
}
public void updateInventorySlot(BufferedImage image) throws IOException {
BufferedImage croppedInventorySlotArea = image.getSubimage(rectangleToCapture.x, rectangleToCapture.y, rectangleToCapture.width, rectangleToCapture.height);
setItemInInventorySlotFromImage(croppedInventorySlotArea);
this.inventorySlotImage = image.getSubimage(rectangleToCapture.x, rectangleToCapture.y, rectangleToCapture.width, rectangleToCapture.height);
}
private void setItemInInventorySlotFromImage(BufferedImage croppedInventorySlotArea) throws IOException {
if (itemIsLog(croppedInventorySlotArea)) System.out.println("LOG!");
public String getItemNameInInventorySlot(InventoryItems items) {
return items.getNameOfItemFromImage(this.inventorySlotImage);
}
public boolean itemIsLog(BufferedImage croppedInventorySlotArea) throws IOException {
int matchingPixel = 0;
//int nonMatchingPixel = 0;
File image = new File("/home/dpapp/Desktop/RunescapeAIPics/Items/willowLogs.png");
BufferedImage logImage = ImageIO.read(image);
/*System.out.println(logImage.getWidth() + ", " + logImage.getHeight());
System.out.println(INVENTORY_SLOT_WIDTH + ", " + INVENTORY_SLOT_HEIGHT);
System.out.println("Dimension match?");*/
for (int row = 0; row < INVENTORY_SLOT_WIDTH; row++) {
for (int col = 0; col < INVENTORY_SLOT_HEIGHT; col++) {
if (pixelsWithinRGBTolerance(croppedInventorySlotArea.getRGB(row, col), logImage.getRGB(row, col))) {
matchingPixel++;
}
/*else {
nonMatchingPixel++;
}*/
}
}
if (matchingPixel > 300) {
//System.out.println("Found log with " + matchingPixel + " matches!" + nonMatchingPixel);
return true;
}
//System.out.println("No match!" + matchingPixel + ", nonmatching: " + nonMatchingPixel);
return false;
public boolean isInventorySlotEmpty(InventoryItems items) {
return ("empty" == items.getNameOfItemFromImage(this.inventorySlotImage));
}
private boolean pixelsWithinRGBTolerance(int rgb1, int rgb2) {
int[] colors1 = getRGBValuesFromPixel(rgb1);
int[] colors2 = getRGBValuesFromPixel(rgb2);
for (int i = 0; i < 3; i++) {
if (Math.abs(colors1[i] - colors2[i]) > 5) {
return false;
}
}
/*displayColor(colors1);
System.out.println("vs");
displayColor(colors2);
System.out.println();*/
return true;
}
private void displayColor(int[] colors) {
System.out.println(colors[0] + "," + colors[1] + "," + colors[2]);
}
private int[] getRGBValuesFromPixel(int pixel) {
int[] colors = {(pixel)&0xFF, (pixel>>8)&0xFF, (pixel>>16)&0xFF, (pixel>>24)&0xFF};
return colors;
}
}

View File

@ -1,29 +0,0 @@
import static org.junit.jupiter.api.Assertions.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.junit.Before;
import org.junit.jupiter.api.Test;
class InventorySlotTest {
InventorySlot inventorySlot;
void initialize() {
inventorySlot = new InventorySlot(0, 0);
}
@Test
void test() throws IOException {
initialize();
File image = new File("/home/dpapp/Desktop/RunescapeAIPics/Tests/screenshot0_0.png");
BufferedImage testImage = ImageIO.read(image);
assertTrue(inventorySlot.itemIsLog(testImage));
}
}

View File

@ -0,0 +1,39 @@
import static org.junit.jupiter.api.Assertions.*;
import java.awt.AWTException;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.junit.jupiter.api.Test;
class InventoryTest {
Inventory inventory;
String testingInventoryDirectoryPath;
public void initialize() throws AWTException, IOException {
inventory = new Inventory();
this.testingInventoryDirectoryPath = "/home/dpapp/Desktop/RunescapeAIPics/Tests/Inventory/";
}
@Test
public void testGetNameInItemInventorySlot() throws IOException, AWTException {
initialize();
// TODO: add image for uploading custom image to Inventory
BufferedImage testImage = loadBufferedImage("inventory_0.png");
inventory.updateWithFakeImageForTests(testImage);
assertEquals(inventory.getItemNameInInventorySlot(0, 0), "willowLogs");
assertEquals(inventory.getItemNameInInventorySlot(3, 6), "empty");
}
public BufferedImage loadBufferedImage(String fileName) throws IOException {
File itemFile = new File(this.testingInventoryDirectoryPath + fileName);
BufferedImage itemImage = ImageIO.read(itemFile);
return itemImage;
}
}

View File

@ -11,7 +11,8 @@ public class main {
//Cursor cursor = new Cursor();
//Inventory inventory = new Inventory();
//inventory.update();
Items items = new Items("/home/dpapp/Desktop/RunescapeAIPics/Items/");
Inventory inventory = new Inventory();
//Items items = new Items("/home/dpapp/Desktop/RunescapeAIPics/Items/");
//items.displayItems();
System.out.println("Success!");