Erkennen Sie die Kontur und Richtung eines geformten Objekts mit OpenCV3 und Python3 (Hauptkomponentenanalyse: PCA, Eigenvektor)

Was ist Hauptkomponentenanalyse (PCA)?

Es gibt verschiedene Merkmalsmengen in einem Objekt, und es kann möglich sein, den Objekttyp anhand der Merkmalsmenge zu identifizieren. Zum Beispiel hat Kaffee Eigenschaften wie Säure, Bitterkeit, Röstung, Reichtum, Farbe und Aroma, und die Kombination kann die Kaffeesorte (Mokka, Kirimanjaro, Mandelin usw.) identifizieren. .. Es gibt jedoch verschiedene Arten von Merkmalen, und bei der Identifizierung des Typs sind einige als Merkmale wirksam, und einige sind nicht sehr wirksam. Zum Beispiel können Gewicht und Härte als charakteristische Mengen Kaffee angesehen werden, aber es ist unwahrscheinlich, dass dies zur Identifizierung des Typs sehr nützlich ist. Der Preis kann als Feature-Menge ein wenig nützlich sein.

Die Hauptkomponentenanalyse (PCA) ist eine Analysemethode, die Standardabweichungen, Kovarianzmatrizen, Eigenvektoren usw. verwendet, um Komponenten zu identifizieren, die bei der Identifizierung eines Objekts stark Merkmale darstellen. Durch Berücksichtigung der eng miteinander verbundenen Merkmalsgrößen ist es außerdem möglich, eine Dimensionskomprimierung der Daten durchzuführen, wodurch der Rechenaufwand und der Daten- / Speicheraufwand wirksam reduziert werden.

OpenCV unterstützt auch die Hauptkomponentenanalyse (PCA) im Kernmodul. Dieses Mal werde ich ein Programm erstellen, das die Richtung eines geformten Objekts mithilfe einer Methode berechnet, die die OpenCV-Hauptkomponentenanalyse (PCA) verarbeitet und die Kontur und die Richtung der Hauptkomponente mit Pfeilen anzeigt. Das Endergebnis sollte wie in der folgenden Abbildung aussehen.

pca_output.png ** Zeigen Sie den Umriss (rot) und den Hauptkomponentenvektor (hellblau) des Objekts an **

OpenCV OpenCV (Open Source Computer Vision Library) ist eine Sammlung von BSD-lizenzierten Video- / Bildverarbeitungsbibliotheken. Es gibt viele Algorithmen wie Bildfilterung, Vorlagenabgleich, Objekterkennung, Videoanalyse und maschinelles Lernen.

■ Beispiel für Bewegungsverfolgung mit OpenCV (OpenCV Google Summer of Code 2015) https://www.youtube.com/watch?v=OUbUFn71S4s

■ Klicken Sie hier für die Installation und einfache Verwendung Installieren Sie OpenCV 3 (Core + Contrib) in der Python 3-Umgebung und unterscheiden Sie zwischen OpenCV 2 und OpenCV 3 und überprüfen Sie die einfache Bedienung

■ Klicken Sie hier für die Standbildverarbeitung Versuchen Sie die Kantenerkennung mit OpenCV Führen Sie verschiedene Filter mit OpenCV durch (Gradient, Highpass, Laplacian, Gaussian) Extrahieren Sie Feature-Punkte mit OpenCV (AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob) Gesichtserkennung mit OpenCV (Haar-like Feature Classifier) Schätzen Sie mit OpenCV (Eigenface, Fisherface, LBPH), wer das Gesicht hat

■ Klicken Sie hier für die Videoverarbeitung Versuchen Sie, Videos in Echtzeit mit OpenCV zu konvertieren Versuchen Sie, Webkamera- / Videokamera-Videos in Echtzeit mit OpenCV zu konvertieren Zeichnen Sie den optischen Fluss in Echtzeit mit OpenCV (Shi-Tomasi-Methode, Lucas-Kanade-Methode) Objektverfolgung mit OpenCV (Verfolgen von Funktionspunkten, die von der Maus mit der Lucas-Kanade-Methode festgelegt wurden Bewegungsvorlagenanalyse mit OpenCV (Erkennen von Objekten und deren Bewegungsrichtungen in Echtzeit)

Algorithmus

Wenn Sie sich mit der Hauptkomponentenanalyse befassen, sehen Sie normalerweise die folgenden Punkte im zu analysierenden Streudiagramm. Die Darstellung ist eine zweidimensionale Komprimierung der ursprünglich mehrdimensionalen Merkmale. Zusätzlich repräsentieren die Pfeile die Vektoren der ersten und zweiten Hauptkomponente für das Diagramm. GaussianScatterPCA.svg.png Quelle: Wikipedia - Primärkomponentenanalyse

Mit dieser Anwendung kann auch eine Hauptkomponentenanalyse von Zahlen durchgeführt werden. Das Verfahren ist wie folgt.

  1. Konvertiert Farbinformationen, die zum Erkennen der Richtung eines Objekts unnötig erscheinen, in Schwarzweißinformationen.
  2. Erkennen Sie den Umriss des Objekts als zweidimensionalen Punkt (x-Koordinate, y-Koordinate).
  3. Führen Sie eine Hauptkomponentenanalyse (PCA) für eine Sammlung von Konturpunkten (x, y) durch.
  4. Suchen Sie den Vektor (eindeutigen Vektor) in Richtung der Hauptkomponente und zeichnen Sie ihn auf das Bild.
  5. Wiederholen Sie die Schritte 1 bis 4 für jedes Objekt.

Mit OpenCV können Sie also den Umriss und die Richtung eines Objekts erkennen, indem Sie einige Methoden aufrufen.

Programm

pca.py


# -*- coding: utf-8 -*-
import cv2
import math
import numpy as np


#Zeichne einen Vektor
def drawAxis(img, start_pt, vec, colour, length):
    #Kantenglättung
    CV_AA = 16

    #Endpunkt
    end_pt = (int(start_pt[0] + length * vec[0]), int(start_pt[1] + length * vec[1]))

    #Zeichnen Sie die Mitte
    cv2.circle(img, (int(start_pt[0]), int(start_pt[1])), 5, colour, 1)

    #Achse zeichnen
    cv2.line(img, (int(start_pt[0]), int(start_pt[1])), end_pt, colour, 1, CV_AA);

    #Zeichnen Sie einen Pfeil an der Spitze
    angle = math.atan2(vec[1], vec[0])
    print(angle)

    qx0 = int(end_pt[0] - 9 * math.cos(angle + math.pi / 4));
    qy0 = int(end_pt[1] - 9 * math.sin(angle + math.pi / 4));
    cv2.line(img, end_pt, (qx0, qy0), colour, 1, CV_AA);

    qx1 = int(end_pt[0] - 9 * math.cos(angle - math.pi / 4));
    qy1 = int(end_pt[1] - 9 * math.sin(angle - math.pi / 4));
    cv2.line(img, end_pt, (qx1, qy1), colour, 1, CV_AA);


if __name__ == '__main__':
    #Bild laden
    src = cv2.imread("pca_test1.jpg ")
    
    #In Graustufen konvertieren
    gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

    #Binarisierung
    retval, bw = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

    #Kontur extrahieren
    #   contours : [Region][Point No][0][x=0, y=1]
    #   cv2.CHAIN_APPROX_NONE:Halten Sie den Mittelpunkt
    #   cv2.CHAIN_APPROX_SIMPLE:Halten Sie den Mittelpunkt nicht
    img, contours, hierarchy = cv2.findContours(bw, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
    
    #Verarbeitung für jede Kontur
    for i in range(0, len(contours)):

        #Berechnen Sie die Konturfläche
        area = cv2.contourArea(contours[i])

        #Rauschen (zu kleine Fläche) und Gesamtkontur (zu große Fläche) ausschließen
        if area < 1e2 or 1e5 < area:
            continue
        
        #Kontur zeichnen
        cv2.drawContours(src, contours, i, (0, 0, 255), 2, 8, hierarchy, 0)
        
        #Speichern Sie Konturdaten in einem Gleitkomma-Array
        X = np.array(contours[i], dtype=np.float).reshape((contours[i].shape[0], contours[i].shape[2]))
        
        #PCA (1 Dimension)
        mean, eigenvectors = cv2.PCACompute(X, mean=np.array([], dtype=np.float), maxComponents=1)
        
        #Zeichnen Sie einen Vektor in Richtung der Hauptkomponente
        pt = (mean[0][0], mean[0][1])
        vec = (eigenvectors[0][0], eigenvectors[0][1])
        drawAxis(src, pt, vec, (255, 255, 0), 150)


    #Anzeige
    cv2.imshow('output', src)
    cv2.waitKey(0)
    
    #Verarbeitung beenden
    cv2.destroyAllWindows()

Das Ausführungsergebnis sieht wie am Anfang gezeigt aus.

Bonus

Lassen Sie uns die Kontur und Richtung nicht nur für das Beispielbild, sondern auch für andere Bilder erkennen. Lassen Sie uns zum Beispiel analysieren, indem Sie einen Kleiderbügel mit einem charakteristischen Loch auf einem Muster wie einer Tatami-Matte platzieren. Als Ergebnis konnten wir den Vektor in Richtung der Hauptkomponente für die drei Konturen anzeigen, die das kleine Loch, die Außenkontur und die Innenkontur umgeben. hanger_out.png

Recommended Posts

Erkennen Sie die Kontur und Richtung eines geformten Objekts mit OpenCV3 und Python3 (Hauptkomponentenanalyse: PCA, Eigenvektor)
[Python] Vergleich der Theorie und Implementierung der Hauptkomponentenanalyse durch Python (PCA, Kernel PCA, 2DPCA)
Fordern Sie die Hauptkomponentenanalyse von Textdaten mit Python heraus
Hauptkomponentenanalyse (PCA) und unabhängige Komponentenanalyse (ICA) mit Python
[GWAS] Zeichnen Sie die Ergebnisse der Hauptkomponentenanalyse (PCA) von PLINK auf
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python
Erstellen Sie DNN-CRF mit Chainer und erkennen Sie den Akkordfortschritt der Musik
Erhalten und schätzen Sie die Form des Kopfes mit Dlib und OpenCV mit Python
Versuchen Sie, den Hintergrund und das sich bewegende Objekt des Videos mit OpenCV zu trennen
Dimensionskomprimierung durch Selbstcodierer- und Hauptkomponentenanalyse
Berücksichtigung der Stärken und Schwächen von Python
Holen Sie sich mit Python den Aktienkurs eines japanischen Unternehmens und erstellen Sie eine Grafik
Holen Sie sich mit Python eine große Menge von Starbas Twitter-Daten und probieren Sie die Datenanalyse Teil 1 aus
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Visualisieren Sie den Bereich der internen und externen Einfügungen mit Python
Mathematisches Verständnis der Hauptkomponentenanalyse von Anfang an
Berechnen Sie den Regressionskoeffizienten der einfachen Regressionsanalyse mit Python
Füllen Sie den Hintergrund mit einer einzigen Farbe mit OpenCV2 + Python
Hauptkomponentenanalyse mit Python von nim mit nimpy
Hauptkomponentenanalyse (Hauptkomponentenanalyse: PCA)
Ein Server, der mit Flasche.py und OpenCV die Anzahl der Personen vor der Kamera zurückgibt
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Führen Sie mit Python und Matplotlib eine Isostromanalyse offener Wasserkanäle durch
Erkennen Sie mit Python Objekte einer bestimmten Farbe und Größe
Erstellen Sie mit python wxpython + openCV ein einfaches Videoanalysetool
Visualisieren Sie die Korrelationsmatrix durch Hauptkomponentenanalyse mit Python
Schätzen Sie die Haltung des AR-Markers mit Python + OpenCV + Drohne
Spielen Sie mit dem Passwortmechanismus von GitHub Webhook und Python
Ein Python-Anfänger hat in den letzten 10 Jahren zunächst versucht, die Wetterdaten schnell und einfach zu analysieren.
Die Farbextraktion mit Python + OpenCV löste das Rätsel des grünen Hintergrunds
[Python, Ruby] Selen-Holen Sie sich Webseiteninhalte mit Webdriver
Einführung in die Python-Grundlagen des maschinellen Lernens (unbeaufsichtigtes Lernen / Hauptanalyse)
Erstellen Sie eine gestreifte Illusion mit Gammakorrektur für Python3 und openCV3
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
Erstellen Sie mit Python und OpenCV ein einfaches OMR (Mark Sheet Reader)
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
Zeichnen Sie eine Aquarellillusion mit Kantenerkennung in Python3 und openCV3
Lösen Sie das Python-Rucksackproblem mit der Branch-and-Bound-Methode
Die Idee, die Konfigurationsdatei mit einer Python-Datei anstelle von yaml zu füttern
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
[Python] Versuchen Sie, Zeichen aus Bildern mit OpenCV und pyocr zu erkennen
Erstellen Sie ein Kompatibilitätsbewertungsprogramm mit dem Zufallsmodul von Python.
Leuchtendes Leben mit Python und OpenCV
Die Geschichte von Python und die Geschichte von NaN
Neuronales Netzwerk mit OpenCV 3 und Python 3
Hauptkomponentenanalyse mit Spark ML
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Grundlegendes Studium von OpenCV mit Python
Ich habe die numerische Berechnung von Python durch Rust ersetzt und die Geschwindigkeit verglichen
Die Geschichte, wie man mit Python einen 100-Yen-Frühstücks-Bot für die Universität macht
[Erklärung zum AtCoder] Kontrollieren Sie die A-, B- und C-Probleme von ABC182 mit Python!
So schneiden Sie den unteren rechten Teil des Bildes mit Python OpenCV