Frage zu opencv

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
roman_emperor
User
Beiträge: 10
Registriert: Montag 4. Oktober 2021, 10:58

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
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
roman_emperor
User
Beiträge: 10
Registriert: Montag 4. Oktober 2021, 10:58

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
The world survived the fall of the Roman empire
and will no doubt outlast our own so much more splendid civilisation.
roman_emperor
User
Beiträge: 10
Registriert: Montag 4. Oktober 2021, 10:58

__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.
The world survived the fall of the Roman empire
and will no doubt outlast our own so much more splendid civilisation.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
__blackjack__
User
Beiträge: 13109
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei das mit dem `sum()` ja eigentlich auch unnötig ist wenn man eigentlich ja nur wissen will ob *irgendein* Wert nicht 0 ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten