Also ich versuche Schachfiguren zu erkennen. Die Klassifizierung stimmt auch schon... Aber, wie genau eine Figur in Prozent erkannt wird, ist falsch...
Und zwar hat zum Beispiel die Dame schwarz den float value (-4,0 / 6,0) = -0,66... Wenn das Fann -0,64 zurück gibt, dann wäre die Abweichung ja ((1/12)-abs(-0,66+0,64))*12*100=24,0 Prozent. Es kommen aber ganz komische Werte heraus. Hat jemand eine Idee?
Java:
enum FigClazz {
leer("0 leer ", '0', 0f), turm_b("r Turm schwarz ", 'r', -1f),
turm_w("R Turm weiß ", 'R', +1f), springer_b("n Springer schwarz ", 'n', -2f),
springer_w("N Springer weiß ", 'N', +2f), laeufer_b("b Läufer schwarz ", 'b', -3f),
laeufer_w("B Läufer weiß ", 'B', +3f), dame_b("q Dame schwarz ", 'q', -4f),
dame_w("Q Dame weiß ", 'Q', +4f), koenig_b("k König schwarz ", 'k', -5f),
koenig_w("K König weiß ", 'K', +5f), bauer_b("p Bauer schwarz ", 'p', -6f),
bauer_w("P Bauer weiß ", 'P', +6f);
String s;
char c;
float f;
FigClazz(String s, char c, float f) {
this.s = s;
this.c = c;
this.f = f;
}
}
Java:
class Fig {
BufferedImage b;
FigClazz fc;
float percent;
}
Java:
static float getFloatColor(int rgb) {
// int alpha = (rgb >> 24) & 0xff;
int r = (rgb >> 16) & 0xff;
int g = (rgb >> 8) & 0xff;
int b = (rgb >> 0) & 0xff;
// Normalize and gamma correct:
double rr = Math.pow(r / 255.0, 2.2);
double gg = Math.pow(g / 255.0, 2.2);
double bb = Math.pow(b / 255.0, 2.2);
// Calculate luminance:
double lum = 0.2126 * rr + 0.7152 * gg + 0.0722 * bb;
// Gamma compand and rescale to byte range:
float grayLevel = (float) Math.pow(lum, 1.0 / 2.2);
return grayLevel;
}
static Fig getFig(Fann fann, BufferedImage b) {
final int w = b.getWidth();
float[] fa = new float[w * w];
for (int i = 0; i < w; i++) {
for (int j = 0; j < w; j++) {
fa[i * w + j] = getFloatColor(b.getRGB(j, i));
}
}
float[] fb = fann.run(fa);
float f = fb[0] * 6f;
int bestIndex = 0;
float bestDerivation = 100;
FigClazz[] values = FigClazz.values();
for (int i = 0; i < values.length; i++) {
float d = Math.abs(values[i].f - f); // hier stimmt was nicht...
if (d < bestDerivation) {
bestDerivation = d;
bestIndex = i;
}
}
Fig ret = new Fig();
ret.b = b;
ret.fc = values[bestIndex];
ret.percent = (1f / 12f - bestDerivation) * 1200f;
return ret;
}
Und zwar hat zum Beispiel die Dame schwarz den float value (-4,0 / 6,0) = -0,66... Wenn das Fann -0,64 zurück gibt, dann wäre die Abweichung ja ((1/12)-abs(-0,66+0,64))*12*100=24,0 Prozent. Es kommen aber ganz komische Werte heraus. Hat jemand eine Idee?