package dokumenty.test; import java.io.File; import java.util.ArrayList; import java.util.List; import dokumenty.Element; import dokumenty.SerializatorElementow; import pl.wroc.pwr.file.ImageFolderScanner; public class MiaraJakosci { private SerializatorElementow serializatorExp = new SerializatorElementow(".expected"); private SerializatorElementow serializatorRes; private ImageFolderScanner skaner = new ImageFolderScanner(); private String[] tagi = new String[]{"image", "table"}; private String folder = "bez-filtra"; //private String[] tagi = new String[]{"image"}; //private String folder = "filtr-rec"; public MiaraJakosci(String folder, String ext, String[] tagi) { this.serializatorRes = new SerializatorElementow(ext); this.folder = folder; this.tagi = tagi; System.out.println("Wyniki : " + this.folder); System.out.print("Tagi :"); for (int i = 0; i < this.tagi.length; i++) { System.out.print(this.tagi[i] + ","); } System.out.println(); } private int pole(int[] box) { return (box[2] - box[0]) * (box[3] - box[1]); } private int[] przeciecie(Element e1, Element e2) { int[] p1 = e1.pobierzPudelko(); int[] p2 = e2.pobierzPudelko(); int minX = Math.max(p1[0], p2[0]); int maxX = Math.min(p1[2], p2[2]); int minY = Math.max(p1[1], p2[1]); int maxY = Math.min(p1[3], p2[3]); if ((minX < maxX)&&(minY < maxY)) { System.out.println(e1.toString() + " <-> " + e2.toString() + " ==> " + minX + ", " + minY + ", " + maxX + ", " + maxY); return new int[]{minX, minY, maxX, maxY}; } return null; } public List parowanie(List l1, List l2) { List pary = new ArrayList(); int[] pole1 = new int[l1.size()]; int[] best1 = new int[l1.size()]; int[] pole2 = new int[l2.size()]; int[] best2 = new int[l2.size()]; for (int i = 0; i < l1.size(); i++) { best1[i] = -1; } for (int i = 0; i < l2.size(); i++) { best2[i] = -1; } for (int i1 = 0; i1 < l1.size(); i1++) { Element e1 = l1.get(i1); for (int i2 = 0; i2 < l2.size(); i2++) { Element e2 = l2.get(i2); int[] przeciecie = this.przeciecie(e1, e2); if (przeciecie == null) { continue; } int pole = this.pole(przeciecie); if (pole1[i1] < pole) { pole1[i1] = pole; best1[i1] = i2; } if (pole2[i2] < pole) { pole2[i2] = pole; best2[i2] = i1; } } } for (int i = 0; i < l1.size(); i++) { int i2 = best1[i]; if (i2 == -1) { System.out.println(" Niedopasowany: " + l1.get(i).toString()); continue; } if (best2[i2] == i) { int[] para = new int[]{i, i2}; pary.add(para); } else { System.out.println(" Czesciowo : " + l1.get(i).toString()); } } for (int i = 0; i < l2.size(); i++) { int i1 = best2[i]; if (i1 == -1) { System.out.println(" Brakujacy : " + l2.get(i).toString()); } } return pary; } public List filtruj(List elementy) { List nowe = new ArrayList(); for (Element e : elementy) { String typ = e.pobierzTyp().toLowerCase(); boolean poprawny = false; for (String elem : this.tagi) { if (elem.equals(typ)) { poprawny = true; break; } } if (poprawny) { nowe.add(e); } } return nowe; } public void uruchom(String folder) { List images = skaner.apply(new File(folder)); System.out.println("Odnalazl " + images.size() + " plikow graficznych."); float expOb = 0; float expAr = 0; float resOb = 0; float resAr = 0; float corOb = 0; float corAr = 0; //float corJn = 0; for (File image : images) { if (!serializatorExp.czyIstnieje(image)) { continue; } //File imageR = new File(new File(image.getParent(), this.folder), image.getName()); File imageR = new File(this.folder, image.getName()); if (!serializatorRes.czyIstnieje(imageR)) { System.out.println("Brak odpowiedzi dla pliku " + image.getName()); continue; } List expected = serializatorExp.wczytaj(image); List resulted = serializatorRes.wczytaj(imageR); expected = this.filtruj(expected); resulted = this.filtruj(resulted); System.out.println("Dokument: " + image.getName()); List pary = this.parowanie(resulted, expected); System.out.println(" Poprawne : " + pary.size()); for (int i = 0; i < expected.size(); i++) { expAr += pole(expected.get(i).pobierzPudelko()); expOb += 1; } for (int i = 0; i < resulted.size(); i++) { resAr += pole(resulted.get(i).pobierzPudelko()); resOb += 1; } for (int i = 0; i < pary.size(); i++) { int[] para = pary.get(i); corAr += this.pole(this.przeciecie(resulted.get(para[0]), expected.get(para[1]))); corOb += 1; } /*for (int i = 0; i < filtered.size(); i++) { Element e = filtered.get(i); for (int j = 0; j < resulted.size(); j++) { Element r = resulted.get(j); int[] inter = this.przeciecie(e, r); if (inter != null) { corJn += this.pole(inter); } } }*/ //if ((resulted.size() > 0)||(expected.size() > 0)) { // exp += filtered.size(); // res += resulted.size(); // cor += pary.size(); //} } System.out.println("Expected: " + expAr); System.out.println("Resulted: " + resAr); System.out.println("Correct : " + corAr); System.out.println("Precyzja [Area] : " + (corAr / resAr)); System.out.println("Kompletn [Area] : " + (corAr / expAr)); System.out.println("Precyzja [Object]: " + (corOb / resOb)); System.out.println("Kompletn [Object]: " + (corOb / expOb)); //System.out.println("Precyzja [Join] : " + (corJn / resAr)); //System.out.println("Kompletn [Join] : " + (corJn / expAr)); } public static void main(String[] args) { if (args.length < 4) { System.out.println("MiaraJakosci.jar folder-danych folder-wynikow .ext lista-tagow"); System.out.println(" Przyklad: MiaraJakosci.jar ./baza ./baza/wyniki .images image table"); return; } String dataFolder = args[0]; String folder = args[1]; String ext = args[2]; String[] tagi = new String[args.length - 3]; for (int i = 3; i < args.length; i++) { tagi[i - 3] = args[i]; } MiaraJakosci m = new MiaraJakosci(folder, ext, tagi); m.uruchom(dataFolder); } }