Seite 1 von 1

Frage zu opencv

Verfasst: Donnerstag 21. April 2022, 14:10
von roman_emperor
Hallo zusammen,

arbeite aktuell an einer Störungserkennung einer Anlage. Leider gibt diese Anlage die Störung nicht in einem lesbaren Format heraus, weshalb ich mittels automatisch generierten Screenshot und OpenCV Farberkennung eine Push-Benachrichtigung an mein Handy schicken lassen will.

Bisher funktioniert alles soweit eigentlich recht gut automatische Screenshots und Push benachrichtigungen klappen. Mein Problem liegt im Open CV.
Ich kann eine Maske erstellen, die eine Farbe erkennt.

Problem:

Ich benötigte eine Bestätigung, dass ich die Farbe erkannt habe und hierfür fehlt mir irgendwie der passende Befehl.

Vielleicht stehe ich auf dem Schlauch und es ist ganz einfach, aber ich komm einfach auf keine Lösung.

Habt ihr eine Idee?

Vielen Dank und Gruß
Roman

Re: Frage zu opencv

Verfasst: Donnerstag 21. April 2022, 14:26
von __deets__
Bei sowas ist es immer besser, konkrete Beispiel zu zeigen, statt Bilder mit 1000 Worten zu beschreiben.

Wenn du eine Farbe hast, die da ist oder nicht, kannst du zb die region dieser Farbe als ein schwarz (keine Farbe) weiß (da ist die Farbe) Bild extrahieren, und mittels contour Extraktion die Fläche der Kontour bestimmen. Wenn die größer als ein schwellwert ist, dann hast du dein Ergebnis.

Re: Frage zu opencv

Verfasst: Freitag 22. April 2022, 10:23
von roman_emperor
Also wie so häufig konnte sich das Problem selbst lösen wenn man nur lang genug verzweifelt sucht.

Diese Antwort wird nur erstellt um es in der Suchfunktion zu ergänzen.

Lösung: Weiße Pixel zählen.

Wenn eine Farbe in dem Bild erhalten ist, so wird eine Maske des Bildes erstellt in der die erhaltene Farbe weiß "übermalt" wird der Rest schwarz.

Nun kann ich die weißen Pixel zählen. Wenn weiße Pixel = 0 Farbe nicht vorhanden wenn weiße Pixel >0 Farbe vorhanden.

So sieht dann der Code aus.

Code: Alles auswählen

	#treshold rot
	red_thresh = cv2.inRange(img, red_lowcolor, red_highcolor)
	
	#weiße Pixel zählen
	count = np.sum(np.nonzero(red_tresh))
	if count == 0:
		#rot nicht vorhanden
		red = 0 
	else:
		#rot vorhanden
		red = 1 
Wenn gewünscht kann ich auch noch den restlichen Code veröffentlichen mit den Screenshottaker und der Pushbenachrichtigung

Grüßle

Re: Frage zu opencv

Verfasst: Freitag 22. April 2022, 10:44
von roman_emperor
__deets__ hat geschrieben: Donnerstag 21. April 2022, 14:26 Bei sowas ist es immer besser, konkrete Beispiel zu zeigen, statt Bilder mit 1000 Worten zu beschreiben.

Wenn du eine Farbe hast, die da ist oder nicht, kannst du zb. die Region dieser Farbe als ein schwarz (keine Farbe) weiß (da ist die Farbe) Bild extrahieren, und mittels contour Extraktion die Fläche der Kontur bestimmen. Wenn die größer als ein schwellwert ist, dann hast du dein Ergebnis.
Hab jetzt erst deine Antwort gesehen.

Hätte euch gerne einen Code gezeigt, hatte nur zu dem Zeitpunkt noch keinen Code.

Vielen Dank für deine Antwort. Meine Lösung ist sehr nah an deiner. da ich als img eine Statusbar habe die rot/gelb/grau/ oder grün ist brauche ich keine bestimmte menge, sondern die Anwesenheit der Farbe reicht um mir zu sagen, dass es die Farbe ist.

Re: Frage zu opencv

Verfasst: Freitag 22. April 2022, 13:09
von ThomasL
Das hier

Code: Alles auswählen

	#weiße Pixel zählen
	count = np.sum(np.nonzero(red_tresh))
	if count == 0:
		#rot nicht vorhanden
		red = 0 
	else:
		#rot vorhanden
		red = 1 
geht auch etwas einfacher

Code: Alles auswählen

	#weiße Pixel zählen
	red = int(np.sum(np.nonzero(red_tresh)) > 0)
und falls später im Code so eine Abfrage ala "if red == 1"kommt, kannst du die Umwandlung in eine Zahl
gleich ganz weglassen und aus red ein Boolean machen und "if red:" formulieren

Code: Alles auswählen

	#weiße Pixel zählen
	red = np.sum(np.nonzero(red_tresh)) > 0

Re: Frage zu opencv

Verfasst: Freitag 22. April 2022, 13:23
von __blackjack__
Wobei das mit dem `sum()` ja eigentlich auch unnötig ist wenn man eigentlich ja nur wissen will ob *irgendein* Wert nicht 0 ist.

Re: Frage zu opencv

Verfasst: Freitag 22. April 2022, 14:00
von ThomasL
Insbesondere np.sum(np.nonzero()) ist Murks, da nonzero() die Indices der nicht-null Werte zurück liefert. Die dann aufzusummieren ist unsinnig.

red_tresh enthält die Zahlenwerte 255 falls Werte aus dem Farbbereich vorhanden sind und 0 wenn nicht.

Auf die Existenz von einem Wert größer Null kann man gut (und vermutlich schneller) mit np.any() prüfen, da kommt auch direkt ein Boolean raus. Also

Code: Alles auswählen

red = np.any(red_tresh)
sollte die optimale Lösung sein.