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
Frage zu opencv
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.
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.
-
- 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.
Wenn gewünscht kann ich auch noch den restlichen Code veröffentlichen mit den Screenshottaker und der Pushbenachrichtigung
Grüßle
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
Grüßle
The world survived the fall of the Roman empire
and will no doubt outlast our own so much more splendid civilisation.
and will no doubt outlast our own so much more splendid civilisation.
-
- User
- Beiträge: 10
- Registriert: Montag 4. Oktober 2021, 10:58
Hab jetzt erst deine Antwort gesehen.__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.
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.
and will no doubt outlast our own so much more splendid civilisation.
Das hier
geht auch etwas einfacher
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
count = np.sum(np.nonzero(red_tresh))
if count == 0:
#rot nicht vorhanden
red = 0
else:
#rot vorhanden
red = 1
Code: Alles auswählen
#weiße Pixel zählen
red = int(np.sum(np.nonzero(red_tresh)) > 0)
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
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
- __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
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
sollte die optimale Lösung sein.
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)
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
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png