(Python: OpenCV) Ich habe versucht, einen Wert auszugeben, der den Abstand zwischen Regionen angibt, während das Video in Echtzeit binärisiert wurde.

Einführung

Obwohl ich in der Nicht-IT-Abteilung der Fertigungsindustrie arbeite, arbeite ich mit einem Bewusstsein für KI und IoT. Ich arbeite in der Nähe des produktionstechnischen Auftrags, der sich in der Nähe des Produktionsstandorts befindet, aber eines der Probleme bei der Systematisierung ist, dass er nicht mit dem Gewinn für die Fabrik in Einklang gebracht wird. Ich möchte etwas tun, aber wenn ich es schätze, sind die Einführungskosten hoch (die Arbeitskosten sind oft hoch ...) und ich kann aufgeben. Daher denke ich, dass der folgende Inhalt gut ist, um ihn unter dem Gesichtspunkt der Verbesserung der Fähigkeiten zu erstellen.

  1. Erstellen Sie ein Programm zur Bildverarbeitung (Bildver.)
  2. ** Diesmal: Erstellen Sie ein Programm für die Bildverarbeitung (Video ver.) **
  3. Umgebungskonstruktion + Programm in Raspberry Pi gespeichert
  4. Überprüfen Sie, ob das aufgenommene Bild in Echtzeit verarbeitet werden kann
  5. Suchen Sie nach guten Verarbeitungsmethoden, die zu einer Verbesserung der Fabrik führen
  6. Verbessern Sie den KPI-Wert und erzielen Sie Ergebnisse

Wir sind bestrebt, eine Echtzeitverarbeitung (Binärisierung, Berechnung / Anzeige einer bestimmten Entfernung usw.) für das am Produktionsstandort aufgezeichnete aufgezeichnete Video durchzuführen und das Ergebnis anzuzeigen. Überraschenderweise kann es den Mitarbeitern vor Ort helfen, selbst einfach verarbeitete Videobilder problemlos zu erstellen.

Nun, es ist lange her, aber der Umriss dieser Zeit ist wie folgt.

Der vorherige Artikel ist hier.

Machen Sie das Bild binär. Weiterhin kann der kürzeste Abstand zwischen zwei Regionen berechnet werden (Ver1.1). https://qiita.com/Fumio-eisan/items/10c54af7a925b403f59f

Zeigen Sie einfach das Video an

Führen Sie zunächst den Vorgang zum Anzeigen des Videos durch. Dieses Mal werden wir das Video mit der folgenden Aufnahme etwa 7 Sekunden lang verarbeiten.

image.png

video.ipynb



#Einfach anzeigen
import cv2
import sys

file_path = 'sample_.mov'
delay = 1
window_name = 'frame'

cap = cv2.VideoCapture(file_path)
text = 'text.wmv'

if not cap.isOpened():
    sys.exit()

while True:
    ret, frame = cap.read()
   # if not ret: #Wenn Sie diese beiden Zeilen einfügen, endet sie mit einer Videowiedergabe.
   #     break
    if ret:
        frame = cv2.resize(frame, dsize=(600, 400))
        cv2.imshow(window_name, frame)
        if cv2.waitKey(delay) & 0xFF == ord('q'):
            break
    else:
        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)

cv2.destroyWindow(window_name)

Es ist in Ordnung, wenn Sie den Pfad des Videos beschreiben, das Sie in file_path anzeigen möchten. Bei diesem Programm wird das Video weiterhin in einer Endlosschleife abgespielt. Sie können die Videowiedergabe stoppen, indem Sie die Taste q drücken.

In Bezug auf die Anzeige des Videos drehen wir nach dem folgenden Verfahren.

  1. Laden Sie das Video mit der Methode cv2.VideoCapture ()
  2. Spielen Sie währenddessen mit der Syntax
  3. Zeigen Sie weiterhin jedes Bild an (30 Bilder in 1 Sekunde bei 30 Bildern pro Sekunde).
  4. (Je nach Prozess) Endlosschleife oder Ende, wenn die Wiedergabe einmal abgeschlossen ist usw.

Es ist geworden. Ich werde später eine Notiz schreiben, aber da sie für jeden Frame in 3 verarbeitet wird, müssen Sie vorsichtig sein, wenn Sie den Telop (anzuzeigender Wert usw.) ändern möchten, den Sie jede Sekunde oder alle paar Sekunden anzeigen möchten.

Ich möchte Untertitel hinzufügen

video.ipynb


cv2.putText(frame, text,(100, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 0), thickness=2)

Über diese Anzeige ist eine Untertitelausgabe möglich. Die Argumente sind wie folgt.

  1. Argument: Videorahmen, 2. Argument: anzuzeigender Text, 3. Argument: x-, y-Position, 4. Argument: Schriftart, 5. Argument: Zeichengröße, 6. Argument: BGR-Farbinformationen, 7. Argument : Buchstabendicke

Ich möchte binarisieren

Lassen Sie es uns jetzt binarisieren und in Schwarzweiß anzeigen. Die Methode ist in Ordnung, wenn Sie die oberen und unteren Grenzen der zu extrahierenden Farbe wie das Bild definieren und mit der Methode cv2.inRange () definieren.

video.ipynb


#Binarisierungsprozess
import cv2
import sys

camera_id = 0
delay = 1
window_name = 'frame'
file_path = 'sample_.mov'

cap = cv2.VideoCapture(file_path)

import numpy as np
bgrLower = np.array([0, 100, 100])    #Untere Grenze der zu extrahierenden Farbe(BGR)
bgrUpper = np.array([250,250, 250])

if not cap.isOpened():
    sys.exit()

while True:
    ret, frame = cap.read()
    if not ret:
        break
    frame = cv2.resize(frame, dsize=(600, 400))

    img_mask = cv2.inRange(frame, bgrLower, bgrUpper) 
    contours, hierarchy = cv2.findContours(img_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    contours.sort(key=lambda x: cv2.contourArea(x), reverse=True)
    #target_contour = max(contours, key=lambda x: cv2.contourArea(x))
    #img_mask = cv2.line(img_mask, (250,300), (350,300), (120,120,120), 10) #Das zweite Argument ist der Startpunkt, das dritte Argument ist der Endpunkt, das vierte Argument ist die Farbe und das fünfte Argument ist die Linienstärke.
    #img_mask=cv2.drawContours(img_mask,contours[0:2],-1,(120,120,120),5)

    cv2.imshow(window_name, img_mask)
    #cv2.imshow(window_name,img_mask, [contours[0],contours[1]])

    if cv2.waitKey(delay) & 0xFF == ord('q'):
        break

cv2.destroyWindow(window_name)

image.png

Ich konnte erfolgreich binarisieren.

Ich möchte den Abstand zwischen den umschlossenen Bereichen ausgeben

Nun, das ist das Hauptthema. Definieren Sie zwischen den umschlossenen Bereichen wie unten gezeigt und ermitteln Sie den Abstand zwischen ihnen. Und ich möchte diesen Wert entsprechend ausgeben.

image.png

Finden Sie den Abstand zwischen zwei Punkten

video.ipynb


    contours, hierarchy = cv2.findContours(img_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)#Grenzzeichnung
    contours.sort(key=lambda x: cv2.contourArea(x), reverse=True)#Grenzen sortieren

Schließen Sie den weißen Bereich mit der Methode cv2.findContours () ein. Der Rückgabewert wird in Konturen gespeichert. Sortieren Sie dann die Konturen nach Fläche.

Holen Sie sich die Koordinaten von zwei Regionen

video.ipynb


    x1=np.unravel_index(np.argmax(contours[0],axis=0), contours[0].shape)
    x2=np.unravel_index(np.argmax(contours[1],axis=0), contours[0].shape)
    
    img_mask = cv2.line(img_mask, tuple(x1[0][0]), tuple(x2[0][0]), (120,120,120), 3)

Ruft die Koordinaten ab, die den Bereich umgeben. Gibt x1 und x2 mit argmax zurück, das den Maximalwert der Koordinaten in Konturen [0], [1] annimmt (der Wert, bei dem entweder x oder y das Maximum ist). Im Fall von argmax wird es auf eine Dimension abgeflacht (unabhängig von den x- und y-Koordinaten in einer Dimension bestimmt), sodass die Methode unravel_index () den Index als Koordinaten zurückgibt.

Durch tatsächliches Einfügen der Koordinaten mit der Methode cv2.line () werden die Koordinaten dann verbunden.

(Ergänzung) Verstehen Sie die in Konturen gespeicherten Zahlenwerte

image.png

Es ist so kompliziert.

Ich möchte den Entfernungswert auf dem Bildschirm anzeigen

Lassen Sie uns nun diesen berechneten Wert auf dem Bildschirm anzeigen. Normalerweise kann es mit der Methode cv2.putText () angezeigt werden. Wenn es jedoch unverändert bleibt, wird der Wert für jeden Frame berechnet und angezeigt. Dadurch wird der Wert flackernd und schwer zu erkennen. Als Gegenmaßnahme können Sie den Wert für jede bestimmte Anzahl von Frames aktualisieren und anzeigen. Das Folgende wird ausgeführt, damit der Wert in 30 Frames (in diesem Fall ungefähr jede Sekunde) unter Verwendung der if-Syntax aktualisiert wird.

video.ipynb


    if idx % 30 == 0:
        text =str(math.floor(np.linalg.norm(x1[0][0]-x2[0][0])))
    cv2.putText(img_mask, text,(300, 100), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 255, 255), thickness=3)
    

Tatsächliche Ergebnis

Hier ist das Ergebnis der Verarbeitung und Ausgabe auf diese Weise.

image.png

Ursprünglich wünschte ich mir, ich könnte Weiß oder Schwarz für jeden der beiden Bereiche Weiß und Schwarz einen Wert geben, aber ich könnte ihn nicht gut anpassen. Zusätzlich wurde eine Linie zwischen den Bereichen des Adapters gezogen, bei der es sich um den weißen Teil handelt (diesmal ist es eine Sache, aber er ist in zwei Bereiche unterteilt), und es war auch möglich, einen numerischen Wert auszugeben, der den Abstand angibt.

Am Ende

Nun, diesmal habe ich ein Programm erstellt, das während der Verarbeitung des Videos abgespielt werden soll. Der Punkt war, dass es nicht möglich war, eine schwere Verarbeitung durchzuführen, da diese Frame für Frame verarbeitet wurde. Ursprünglich wollte ich die kürzeste Entfernung zwischen Regionen finden und diese Entfernung subtrahieren, aber ich konnte sie nicht so oft implementieren. Da es viele Artikel gab, in denen OpenCV selbst in c ++ zusammengefasst war, fiel mir die Suche schwer. ..

Das Programm ist unten gespeichert. https://github.com/Fumio-eisan/movie_20200406

Recommended Posts

(Python: OpenCV) Ich habe versucht, einen Wert auszugeben, der den Abstand zwischen Regionen angibt, während das Video in Echtzeit binärisiert wurde.
Ich habe versucht, die Videowiedergabezeit anzuzeigen (OpenCV: Python-Version)
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
Ich habe versucht, den Unterschied zwischen A + = B und A = A + B in Python herauszufinden
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ① analysiert
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
Python Open CV hat versucht, das Bild im Text anzuzeigen.
Ändern Sie das Standardausgabeziel in eine Datei in Python
Ich habe versucht, das Gesicht aus dem Video zu erkennen (OpenCV: Python-Version)
Ich habe versucht "Wie man eine Methode in Python dekoriert"
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe versucht, das Problem von F02 zu lösen, wie man mit Python offline in Echtzeit schreibt
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Ich habe versucht, eine Funktion zu erstellen, um zu beurteilen, ob die wichtigsten Aktien der Welt Sommerzeit mit Python sind
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Ich habe versucht, ein missverstandenes Gefangenendilemma in Python zu implementieren
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, ein Standbild aus dem Video auszuschneiden
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Teil 1 Ich habe die Antwort auf das Referenzproblem geschrieben, wie man in Python in Echtzeit offline schreibt
Ich habe versucht, "einen genetischen Algorithmus (GA) in Python zu implementieren, um das Problem des Handlungsreisenden (TSP) zu lösen".
Wie man offline in Echtzeit schreibt Ich habe versucht, E11 mit Python zu lösen
Ich habe versucht, Gitarrenakkorde in Echtzeit mithilfe von maschinellem Lernen zu klassifizieren
Ich habe versucht, einen Formatierer zu entwickeln, der Python-Protokolle in JSON ausgibt
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ein nützlicher Hinweis, wenn Sie Python nach langer Zeit verwenden
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich habe versucht, Trumps Kartenspiel in Python zu implementieren
Wie man offline in Echtzeit schreibt Ich habe versucht, E12 mit Python zu lösen
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Permutation in Python zu implementieren
Ich habe versucht, PLSA in Python 2 zu implementieren
Ich habe versucht, ADALINE in Python zu implementieren
Ich habe versucht, PPO in Python zu implementieren
So generieren Sie QR-Code und Barcode in Python und lesen ihn normal oder in Echtzeit mit OpenCV
Teil 1 Ich habe ein Beispiel für die Antwort auf das Referenzproblem geschrieben, wie man in Python in Echtzeit offline schreibt
Als ich in IPython versuchte, den Wert zu sehen, war es ein Generator, also kam ich auf ihn, als ich frustriert war.
Einführung in die KI-Erstellung mit Python! Teil 2 Ich habe versucht, den Hauspreis in Boston mit einem neuronalen Netz vorherzusagen
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
Verwenden Sie libsixel, um Sixel in Python auszugeben und das Matplotlib-Diagramm an das Terminal auszugeben.
[Python] Smasher hat versucht, den Video-Ladevorgang mithilfe eines Generators zu einer Funktion zu machen
Ich suchte nach den Fähigkeiten, die erforderlich sind, um Webingenieur bei Python zu werden
[Python] Ich habe versucht, den Typnamen als Zeichenfolge aus der Typfunktion abzurufen
Ich habe versucht, ein scheinbar Windows-Snipper-Tool mit Python zu implementieren
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht, beim Trocknen der Wäsche zu optimieren
Ich möchte mit Python ein Fenster erstellen
Ich habe versucht, "Birthday Paradox" mit Python zu simulieren
Ich habe die Methode der kleinsten Quadrate in Python ausprobiert