Bilderkennung

Jungeee

Mitglied
Wie vergleiche ich am besten zwei BufferedImages ?
Meine Aufgabe ist es, die Zahl die auf einem Wasserzähler steht, mit einer Webcam zu Fotographien,
und dieses Bild der Zahl als Zahl zu erkennen.
Da ich noch nicht weiß wie ich ein Programm schreibe, dass mir (zB. alle Stunde) ein Bild macht, hab ich bis jetzt den Teil mit dem Vergleich gemacht.
Mein Programm filtert das Bild --> nur mehr SW.
mein Programm schneidet die Bilder der einzelnen Ziffern aus. (d.h. Rand des Bildes = Rand der Zahl)
nun der Vergleich:

Java:
public static double isSame(BufferedImage BiQ, BufferedImage BiV){
		
		double same=0,all=0;
		int heightV = BiV.getHeight(),gesX = 0,gesY = 0,
			 widthV = BiV.getWidth();
		int heightQ = BiQ.getHeight(),
			 widthQ = BiQ.getWidth();
		
		if (heightV < heightQ) {
			gesY = heightV;
		}else {
			gesY = heightQ;
		}
		if (widthV < widthQ) {
			gesY = widthV;
		}else {
			gesY = widthQ;
		}
		
		for (int i = 0; i < gesX ; i++) {
			for (int j = 0; j < gesY; j++) {
				all++;
				if((isBlack(j, i, BiQ) == isBlack(j, i, BiV)) && isBlack(j, i, BiV)){
					same++;
				}
			}
		}
		 
		return (same/all)*100;
	 }


jedoch wird mir für den double-Wert immer "NaN" zurück gegeben.

hat jemand einen Vorschlag für einen Vergleich dieser Art ?
normal müsste es jedoch nach diesem Prinzip funktionieren, da später das BiQ und BiV ziemlich gleich sein werden, wenn die gleiche Zahl darauf steht, da ich die Bilder zum vergleichen nehme, die direkt auf der Ziffernscheibe stehen.
 

xehpuk

Top Contributor
Ich habe auf dem Gebiet keine Erfahrung. Ich sehe in deinem Code lediglich diesen Fehler:
[JAVA=14]if (widthV < widthQ) {
gesY = widthV; // gesX
}else {
gesY = widthQ; // gesX
}[/code]
Code:
all
und
Code:
same
werden dadurch auch nie verändert.
Daher 0 / 0 == NaN.
 

HimBromBeere

Top Contributor
Du kannst versuchen, das Bild zu klassifizieren. Alles, was (innerhalb eines Farbkanales) unterhalb eines Schwellwertes (z.B. 120) liegt, wird schwarz, alles andere weiß... wenn du ein bisschen Glück hast, bleiben so die Ziffern schon als alleinige weiße Inhalte im Bild übrig. Wenn nicht, musst du evtl. noch sog. Erosionen entwickeln, die dir das Bildrauschen entfernen...

Wie das jetzt im Detail aussieht, kann ich dir auf Anhieb nicht sagen, aber vlcht. kannst du ja mit der Idee schon was anfangen...

EDIT: Für einen JAVA-Einsteiger ist das aber nicht grade ein zu empfehlender Anfang...
 

Jungeee

Mitglied
Ich habe auf dem Gebiet keine Erfahrung. Ich sehe in deinem Code lediglich diesen Fehler:
[JAVA=14]if (widthV < widthQ) {
gesY = widthV; // gesX
}else {
gesY = widthQ; // gesX
}[/code]
Code:
all
und
Code:
same
werden dadurch auch nie verändert.
Daher 0 / 0 == NaN.

Danke für den Tipp, bin ich gestern auch noch drauf gekommen. ;-)

Du kannst versuchen, das Bild zu klassifizieren. Alles, was (innerhalb eines Farbkanales) unterhalb eines Schwellwertes (z.B. 120) liegt, wird schwarz, alles andere weiß... wenn du ein bisschen Glück hast, bleiben so die Ziffern schon als alleinige weiße Inhalte im Bild übrig. Wenn nicht, musst du evtl. noch sog. Erosionen entwickeln, die dir das Bildrauschen entfernen...

Wie das jetzt im Detail aussieht, kann ich dir auf Anhieb nicht sagen, aber vlcht. kannst du ja mit der Idee schon was anfangen...

EDIT: Für einen JAVA-Einsteiger ist das aber nicht grade ein zu empfehlender Anfang...

ich habe schon einen Filter programmiert, mit dem ich mir die Helligkeit jedes Punktes ausrechne und auf Grund dieses Wertes, entscheide ich, ob der Bildpunkt Schwarz oder Weiß ist.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben