[PYTHON] Was ich getan habe, als ich den Feature-Punkt mit dem optischen Fluss von opencv nicht finden konnte und als ich ihn verloren habe

Was ich getan habe, als ich den Feature-Punkt mit dem optischen Fluss von opencv nicht finden konnte und als ich ihn verloren habe

Wir werden mit den folgenden Inhalten fortfahren

Bilder etc. sind darin enthalten

Bei Verwendung des optischen Flusses

Der optische Fluss ist eine Technologie, die charakteristische Teile eines Bildes erkennt und verfolgt. Es ist eine sehr nützliche Technologie, aber wenn Sie sie ausprobieren, treten verschiedene Probleme auf. Hier werde ich schreiben, dass es für mich etwas mühsam war, es zu benutzen. Insbesondere werden wir Ihnen vorstellen, wie Sie die Funktionspunkte finden und was zu tun ist, wenn Sie sie verlieren.

Probleme bei der Verwendung 1

Ich kann keinen Feature-Punkt bekommen, an dem ich ihn haben möchte

Wenn es einen charakteristischen Ort gibt, weil es eine Methode ist, einen charakteristischen Teil im Bild zu finden, wird der Ort, den Sie wirklich wollen, möglicherweise nicht charakterisiert. Ein Beispiel ist starke Beleuchtung.

Lösung

Lassen Sie die Person zuerst die Position des Feature-Punkts angeben und ihm folgen. Wenn Sie beispielsweise einen Teil des Bildes wie den folgenden Quellcode ausschneiden und die Funktionspunkte des Bildes erkennen, sieht es gut aus. Ein Beispielalgorithmus ist unten gezeigt.

  1. Zeigen Sie nur das erste Bild des Videos an und geben Sie den Bereich an, in dem die Feature-Punkte angezeigt werden sollen.
  2. Erkennen Sie Feature-Punkte innerhalb des angegebenen Bereichs.
  3. Berechnen Sie die Koordinaten des Schwerpunkts des erkannten Merkmalspunkts (der Rahmen ist zu diesem Zeitpunkt der n-te Rahmen).
  4. Suchen Sie den zu verfolgenden Merkmalspunkt innerhalb des Radius des in 3 berechneten Schwerpunkts im n + 1-Frame. Wenn das n + 1-Bild von 5.4 das letzte Bild des Videos ist, endet es. Wenn nicht, fahren Sie mit 3 fort

Wenn ein Feature-Punkt wie dieser erkannt wurde, wurde er auch dann verfolgt, wenn das Video stark beleuchtet war. Die Quelle wird unten gezeigt, aber da der Code nur extrahiert wird, tritt ein Fehler auf, wenn er unverändert bleibt.

def extractFeatures(self, gray, rect, features):
    featureList = cv2.goodFeaturesToTrack(gray,100,0.01,10)
    for feature in featureList:
        if rect[0] <= feature[0][0] <= rect[2] and rect[1] <= feature[0][1] <= rect[3]:
            features = self.addList(features, feature[0][0], feature[0][1])
    return features

def featureMouseClicked(self, event, x, y, flags, param):
    if event != cv2.EVENT_LBUTTONDOWN and event != cv2.EVENT_LBUTTONUP:
        return
    if event == cv2.EVENT_LBUTTONDOWN:
        self.rect[0]=x
        self.rect[1]=y
    if event == cv2.EVENT_LBUTTONUP:
        self.rect[2]=x
        self.rect[3]=y
        self.featureRectSet=True

def addList(self,lis,x,y):
    if lis == None:
        lis = np.array([[[x,y]]], np.float32)
    else:
        lis = np.append(lis, [[[x, y]]], axis = 0).astype(np.float32)
    return lis

def cut(img,x,y,width,height):
    ux=0
    uy=0
    dx=0
    dy=0
    if img is None:
        return None,dy,uy,dx,ux
    img_height, img_width = img.shape[:2]
    

    if y+height/2 > img_height:
        uy = img_height
    else:
        uy = y+height/2
    if y-height/2 < 0:
        dy = 0
    else:
        dy = y-height/2

    if x+width/2 > img_width:
        ux = img_width
    else:
        ux = x+width/2
    if x-width/2 < 0:
        dx = 0
    else:
        dx = x-width/2

    if not(dx<ux and dy<uy):
        return None,dy,uy,dx,ux
    if not(0<=ux<=img_width or 0<=dx<=img_width or 0<=uy<=img_height or 0<=dy<=img_height):
        return None,dy,uy,dx,ux
    return img[dy:uy,dx:ux],dy,uy,dx,ux

def nextFrame(self):
    end_flag, Movieframe = self.Moviecap.read()
    #Urteil beenden
    if( Movieframe is None):
        return None

    #Aktuellen Frame speichern
    self.nowMovieFrame = Movieframe

    #Optische Durchflusserkennung
    #Schneiden Sie ein Video mit einem Rechteck aus Breite und Höhe aus, das um die Position des vorherigen Feature-Punkts angegeben ist. Hier wird zuerst die Höhe des Rechtecks angegeben. Es ist das gleiche wie die Breite
    mask = np.zeros_like(Movieframe)
    cutFrame,dy,uy,dx,ux= cut(Movieframe,
        int(self.points[len(self.points)-1 - i][0]),#x
        int(self.points[len(self.points)-1 - i][1]),#y
        2*abs(self.rect[1]-self.rect[3]),2*abs(self.rect[0]-self.rect[2]))#
    mask[dy:uy,dx:ux] = cutFrame

    self.grayNext = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
    self.featureNext, status, err = cv2.calcOpticalFlowPyrLK(self.grayPrev, self.grayNext, self.featurePrev, None,
             (dict( winSize  = (15,15),
              maxLevel = 2,
              criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))))
    
    #Wählen Sie Merkmalspunkte aus, für die ein optischer Fluss erkannt wurde (0: nicht erkannt, 1: erkannt).
    if status != None:
        goodPrev = self.featurePrev[status == 1]
        goodNext = self.featureNext[status == 1]
        for i, (nextPoint, prevPoint) in enumerate(zip(goodNext, goodPrev)):
                prev_x, prev_y = prevPoint.ravel()
                next_x, next_y = nextPoint.ravel()

    if self.featureNext is None:
        return 0

    #Vorbereitung für den nächsten optischen Fluss
    self.grayPrev = self.grayNext.copy()
    self.featurePrev = goodNext.reshape(-1, 1, 2)

    #Gibt bei Erfolg 1 zurück
    return 1


Probleme bei der Verwendung 2

Wenn sich ein Objekt mit einem Feature-Punkt schnell bewegt, verlieren Sie den Feature-Punkt aus den Augen.

Wenn die Bewegung langsam ist, verfolgt der optische Fluss sie gut, aber wenn die Bewegung so schnell wie möglich ist, gehen die Merkmalspunkte verloren. Übrigens gibt es möglicherweise die Meinung, dass "Wenn Sie sich schnell bewegen, weil Sie den Bereich in Lösung 1 angegeben haben, die Stelle mit dem Feature-Punkt außerhalb des Bereichs liegt und Sie den Feature-Punkt aus den Augen verlieren", aber den Zustand, in dem Sie den Bereich nicht angeben Es wurde jedoch das Phänomen gesehen, die Merkmalspunkte aus den Augen zu verlieren.

Lösung

Als Gegenmaßnahme gibt es eine Möglichkeit, die fps beim Aufnehmen eines Videos so weit wie möglich zu erhöhen. Es gibt jedoch oft finanziell unmögliche Dinge. Wenn ich diesmal die Funktionspunkte aus den Augen verlor, musste ich das Video stoppen und von der Bereichsspezifikation neu beginnen. Es ruft die nextFrame-Funktion des obigen Quellcodes auf, unterbricht die Wiedergabe des Videos, wenn 0 zurückgegeben wird, ruft featureMouseClicked und extractFeatures auf, gibt den Bereich erneut an und spielt das Video ab. Vielleicht könnte ich mehr tun, indem ich Zwischenframes generiere und fps erhöhe, aber ich hatte nicht die Kraft, so viel zu implementieren.

Entwicklungsumgebung

opencv 2.4.13 python 2.7.11

Recommended Posts

Was ich getan habe, als ich den Feature-Punkt mit dem optischen Fluss von opencv nicht finden konnte und als ich ihn verloren habe
Was ich getan habe, als ich wütend war, es mit der Option enable-shared einzufügen
Was ich getan habe, um die Luftfeuchtigkeit und Temperatur des Archivs zu verfolgen
Ich habe den Akkord des Songs mit word2vec vektorisiert und mit t-SNE visualisiert
Lesen Sie das Diagrammbild mit OpenCV und ermitteln Sie die Koordinaten des Endpunkts des Diagramms
Als ich den BOOTH-Daumen kratzte und das Gesicht mit OpenCV erkannte, war die Genauigkeit zu gut und ich hatte Angst
Ich habe die Beleuchtungsstärke des Raumes mit Raspberry Pi, Arduino und einem optischen Sensor getwittert
Als ich versuchte, das Root-Passwort mit ansible zu ändern, konnte ich nicht darauf zugreifen.
Was ich getan habe, als ich mit Lambda Python im Zeitlimit steckte
Optischer Fluss, das von OpenCV aufgenommene dynamische Bild
Als ich die ähnlichen Wörter vorsichtig + mutig mit word2vec berechnete, fühlte es sich unerwartet vernünftig an
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Was ich getan habe, um die Python2 EOL mit Zuversicht zu begrüßen
Finden Sie den Durchschnitt / die Standardabweichung der Helligkeitswerte im Bild
Stellen Sie fest, ob die Bibliothek installiert ist.
Verwenden Sie Pillow, um das Bild transparent zu machen und nur einen Teil davon zu überlagern
POST das Bild mit json und erhalte es mit der Flasche
Geben Sie die Bilddaten mit Flask of Python zurück und zeichnen Sie sie in das Canvas-Element von HTML
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Vergleichen Sie Anmeldekennwörter durch Hashing mit der Hash-Bibliothek der Standardbibliothek
Was tun, wenn ein Teil des Hintergrundbilds transparent wird, wenn Sie transparente Bilder mit Pillow kombinieren?
Was ich getan habe, als ich den Feature-Punkt mit dem optischen Fluss von opencv nicht finden konnte und als ich ihn verloren habe
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
Ich möchte die Position meines Gesichts mit OpenCV überprüfen!
Was passiert, wenn ich die Hyperparameter von SVM (RBF-Kernel) ändere?
H29.2.27 ~ 3.5 Zusammenfassung meiner Arbeit
Ich habe die numerische Berechnung von Python durch Rust ersetzt und die Geschwindigkeit verglichen
[Docker] Was tun, wenn ein Fehler aufgetreten ist? Der Binär-Git wurde nicht gefunden
Ich habe Umgebungsvariablen in Docker festgelegt und in Python angezeigt.
Finden Sie die allgemeinen Begriffe der Tribonacci-Sequenz in linearer Algebra und Python
Eine Erinnerung an das, was ich beim Starten von Atcoder mit Python feststeckte
Erhalten und schätzen Sie die Form des Kopfes mit Dlib und OpenCV mit Python
Ich habe die Geschwindigkeit der Listeneinschlussnotation für und während mit Python2.7 gemessen.
Versuchen Sie, den Hintergrund und das sich bewegende Objekt des Videos mit OpenCV zu trennen
So speichern Sie die Feature-Point-Informationen des Bildes in einer Datei und verwenden sie zum Abgleichen
Verwenden Sie Ruby und Python, um die Wahrscheinlichkeit zu ermitteln, dass eine Karte mit einer natürlichen Zahl von 1 bis 100 ein Vielfaches von 3 und kein Vielfaches von 5 ist.