Verbesserung der Wert/-Farb-vergleiche

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
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

Huhu und zwar probiere ich derzeit aus ein besseres bzw. gleichmäßigeres Ergebnis bei der Analyse eines Videos anhand der "Farbvergleiche" zu erhalten. (Also es funktioniert ist allerdings bei unterschiedlichem Licht/Umgebungseinfluss relativ "ungenau")
Probiert habe ich bisher GRAY und HSV sowie unten zu sehen einfach den prozentualen Anteil im RGB zu nehmen.
Vlt hat ja jmd einen Vorschlag oder weiß wie man dieses Problem beheben bzw. die Werte "zuverlässiger" machen kann.
Bei meinem Beispielvideo macht z.B.: der prozentuale Rotwert einen ordentlichen Sprung wenn die Kameraperspektive verändert wird (die Werte sind allerdings von Video zu Video verschieden "stark" so das ich nicht fest sagen kann aber Wert xyz tue das)

Bild
Bild

Code: Alles auswählen

def check_board_area(self, progress):
        """
        a method that analyse the video frame per frame and save the Clips (Board) in a list
        """
        video = cv2.VideoCapture(self.__file_path)
        maxframes = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
        try:
            times = list()
            for frame_number in count():
                if frame_number % 30 == 0:
                    progress(frame_number/maxframes*100)
                is_ok, frame = video.read()

                if not is_ok:
                    if times:
                        self.board_subvideos.append((times[0], times[-1]))
                    break

                frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                average = cv2.mean(frame)

                #summe = average[0] + average[1] + average[2]
                #percentage_red = (100 * average[0]) / summe
                #percentage_green = (100 * average[1]) / summe
                #percentage_blue = (100 * average[2]) / summe

                if average[0] > 158:
                    times.append(video.get(cv2.CAP_PROP_POS_MSEC) / 1000)
                elif times:
                    self.board_subvideos.append((times[0], times[-1]))
                    times.clear()
        finally:
            video.release()
Danke für eure Hilfe :)
MfG Felix
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mir ist nicht klar, was du erreichen willst. Was ist ein Clip, warum ist es das gleiche wie ein Board?
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

Also wie man oben sehen kann wird im Video manchmal auf die Tafel gezoomt bisher habe ich diesen Zoom anhand von Änderungen im Farbraum festgestellt was bei unterschiedlichen Einwürkungen von Aussen (Licht, etc.) allerdings ziemlich unsicher ist bei mehreren unterschiedlichen Videos ...daher meine Frage: gibt es Ideen wie ich diese Farbvergleiche "sicherer" machen kann oder eine ganz andere Idee/Lösung für solche Probleme ? :)
Clips sind Teilvideos / Board ist das Tafelvideo es gibt im Projekt mehrere Teilvideos daher die Bezeichnung ..ist für meine Frage aber nicht von Bedeutung :) es geht eigentlich nur um diesen Abschnitt:

Code: Alles auswählen

frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                average = cv2.mean(frame)

                #summe = average[0] + average[1] + average[2]
                #percentage_red = (100 * average[0]) / summe
                #percentage_green = (100 * average[1]) / summe
                #percentage_blue = (100 * average[2]) / summe

                if average[0] > 158:
MfG
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Problem ist, dass du potentiell (sieht zumindes so aus als ob das passieren koennte) die gesamte Tafel aus den Augen verlierst.

Wenn du *manchmal* eine Tafel erkennst, und dort wenig false positives hast, dann koenntest du mit Verfahren wie sie hier dargestellt werden https://www.pyimagesearch.com/2018/07/3 ... -tracking/ die Tafel im Auge behalten, auch wenn gezoomt wird.
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

Gibt es in OpenCV nicht die Möglichkeit Licht komplett auszuschließen und nur die "reinen" Farben zu betrachten ich denke das würde das ganze schon wesentlich präziser zu es muss nicht perfekt sein ich möchte die Fehleranfälligkeit nur wenn möglich etwas senken :)
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

Ich weiß das wenn er an die Tafel zoomt der rotanteil ziemlich steigt wenn ich diesen Anteil ohne Berücksichtigung der Helligkeit bzw. des Lichtes hätte würde das ausreichen dann könnte ich den Mittelwert bestimmen und sagen z.B.: percentage_red > Mittelwert rot + 20:
do
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Gibt es in OpenCV nicht die Möglichkeit Licht komplett auszuschließen und nur die "reinen" Farben zu betrachten
Das macht so physikalisch gar keinen Sinn, weil die Farben Licht mit einer bestimmten Wellenlänge sind. Oder anders: kein Licht -> keine Farbe.

Gruß, noisefloor
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

Ja war vermutlich doof beschrieben ich suche halt eine Möglichkeit Umgebungseinflüsse größtmöglich auszuschließen
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Farben die du siehst sind die Farben die du siehst. Wenn die Kamera da zb aufgrund eines anderen Bildausschnittes anders aussteuert, oder farbiges Licht in die Szene reflektiert von einer Wand - dann SIND die Farben anders, und deine Robustheit muss woanders herkommen. Und was passiert, wenn die Tafel benutzt wird? Das ändert das doch auch.

Ich habe dir andere verfahren genannt. Hast du dir das mal angeschaut?
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Felix92 hat geschrieben: Montag 17. Juni 2019, 20:09 Gibt es in OpenCV nicht die Möglichkeit Licht komplett auszuschließen und nur die "reinen" Farben zu betrachten
Wenn du die Farben unabhängig ihrer Helligkeit betrachten willst, gibt es dafür den HSV-Farbraum. Dort ist die Helligkeit einer der drei Koordinaten, aus denen sich die Farbei zusammen setzt und daher gesondert betrachtet werden kann.
Allerdings hattest du ja schon geschrieben, dass du dir den angeschaut hast...
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Felix92 hat geschrieben: Montag 17. Juni 2019, 20:46 ich suche halt eine Möglichkeit Umgebungseinflüsse größtmöglich auszuschließen
Danach suchen alle, die sich mit Bilderkennung beschäftigen. Und richtig gut funktionierende Verfahren wurden meines Wissens noch nicht gefunden. Ein falscher Schatten bringt auch heute noch jede KI in Probleme.

Vielleicht reicht bei Dir aber schon ein einfacher Weiß- bzw. Grün-Abgleich.
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

Das mit dem Grünabgleich habe ich probiert ist allerdings zu ungenau mit schwarz/weiß müsste ich mal testen
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

Vlt. kann ich mit round() auch noch ein bisschen was rausholen optimal wäre es halt nur 2 werte zu bekommen für Tafel und nicht Tafel
Antworten