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.
** 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)
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. Quelle: Wikipedia - Primärkomponentenanalyse
Mit dieser Anwendung kann auch eine Hauptkomponentenanalyse von Zahlen durchgeführt werden. Das Verfahren ist wie folgt.
Mit OpenCV können Sie also den Umriss und die Richtung eines Objekts erkennen, indem Sie einige Methoden aufrufen.
Das Analysesystem wird von float verarbeitet Wenn Sie die PCACompute () -Methode mit dem Inhalt des Arrays int ausführen, tritt der folgende Fehler auf.
```
error: (-210) Unsupported combination of input and output array formats in function cv::reduce
```
Anweisung, nur eine Dimension der Hauptkomponente zu erfassen (maxComponents = 1)
Wird angewiesen, Daten in der Mitte zu erfassen, um Konturkoordinaten für die Hauptkomponentenanalyse zu verwenden (cv2.CHAIN_APPROX_NONE).
Bei der Analyse von Hauptkomponenten werden Daten normalerweise als Vorverarbeitung standardisiert. Bei dieser Bildverarbeitung gibt es keinen Unterschied in der Gewichtung für jede der zweidimensionalen x- und y-Koordinaten, so dass keine Vorverarbeitung für die Datenstandardisierung durchgeführt wird.
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.
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.
Recommended Posts