Il existe différentes quantités de caractéristiques dans un objet et il peut être possible d'identifier le type d'objet par la quantité de caractéristiques. Par exemple, le café a des caractéristiques telles que l'acidité, l'amertume, la torréfaction, la richesse, la couleur et l'arôme, et la combinaison peut identifier le type de café (moka, kirimandjaro, mandéline, etc.). .. Cependant, il existe différents types de fonctionnalités, et lors de l'identification du type, certaines sont efficaces en tant que fonctionnalités et d'autres pas très efficaces. Par exemple, le poids et la dureté peuvent être considérés comme des quantités caractéristiques de café, mais il est peu probable que cela soit très utile pour identifier le type. Le prix peut être un peu utile en tant que quantité de fonction.
L'analyse en composantes principales (ACP) est une méthode d'analyse qui utilise des écarts types, des matrices de covariance, des vecteurs propres, etc. pour identifier les composants qui représentent fortement des caractéristiques lors de l'identification d'un objet. De plus, en faisant attention aux grandeurs de caractéristiques qui sont étroitement liées, il est possible d'effectuer une compression dimensionnelle des données, ce qui est efficace pour réduire la quantité de calcul et la quantité de données / mémoire.
OpenCV prend également en charge l'analyse des composants principaux (PCA) dans le module principal. Cette fois, je vais créer un programme qui calcule la direction d'un objet façonné en utilisant une méthode qui gère l'analyse des composants principaux d'OpenCV (PCA) et affiche le contour et la direction du composant principal avec des flèches. Le résultat final devrait ressembler à la figure ci-dessous.
** Afficher le contour (rouge) et le vecteur composant principal (bleu clair) de l'objet **
OpenCV OpenCV (Open Source Computer Vision Library) est une collection de bibliothèques de traitement vidéo / image sous licence BSD. Il existe de nombreux algorithmes tels que le filtrage d'image, la correspondance de modèles, la reconnaissance d'objets, l'analyse vidéo et l'apprentissage automatique.
■ Exemple de suivi de mouvement avec OpenCV (OpenCV Google Summer of Code 2015) https://www.youtube.com/watch?v=OUbUFn71S4s
■ Cliquez ici pour une installation et une utilisation facile Installer OpenCV 3 (core + contrib) dans l'environnement Python 3 & Différence entre OpenCV 2 et OpenCV 3 & Easy operation check
■ Cliquez ici pour le traitement des images fixes Essayez la détection des bords avec OpenCV Effectuer divers filtres avec OpenCV (Gradient, Highpass, Laplacian, Gaussian) Extraire des points caractéristiques avec OpenCV (AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob) Reconnaissance faciale à l'aide d'OpenCV (classificateur de caractéristiques de type Haar) Estimer qui est le visage en utilisant OpenCV (Eigenface, Fisherface, LBPH)
■ Cliquez ici pour le traitement vidéo Essayez de convertir des vidéos en temps réel avec OpenCV Essayez de convertir des vidéos de caméra Web / caméra vidéo en temps réel avec OpenCV Dessinez un flux optique en temps réel avec OpenCV (méthode Shi-Tomasi, méthode Lucas-Kanade) Suivi d'objets à l'aide d'OpenCV (suivi des points caractéristiques spécifiés par la souris par la méthode Lucas-Kanade Analyse de modèles de mouvement à l'aide d'OpenCV (reconnaissance des objets et de leurs directions de déplacement en temps réel)
En général, en ce qui concerne l'analyse des composants principaux, vous voyez souvent les points suivants dans le diagramme de dispersion en cours d'analyse. Le tracé est une compression bidimensionnelle des entités qui étaient à l'origine multidimensionnelles. De plus, les flèches représentent les vecteurs des première et deuxième composantes principales du graphique. Source: Wikipédia - Analyse des composants primaires
L'analyse des principaux composants des figures peut également être effectuée avec cette application. La procédure est la suivante.
Ainsi, si vous utilisez OpenCV, vous pouvez reconnaître le contour et la direction d'un objet en appelant simplement quelques méthodes.
Le système de dessin est traité par int --Le système d'analyse est traité par float Si vous exécutez la méthode PCACompute () avec le contenu du tableau int, l'erreur suivante se produit.
```
error: (-210) Unsupported combination of input and output array formats in function cv::reduce
```
--Instruit pour acquérir une seule dimension du composant principal (maxComponents = 1) --Instruit pour acquérir des données au milieu pour utiliser les coordonnées de contour pour l'analyse de la composante principale (cv2.CHAIN_APPROX_NONE)
pca.py
# -*- coding: utf-8 -*-
import cv2
import math
import numpy as np
#Dessiner un vecteur
def drawAxis(img, start_pt, vec, colour, length):
#Anti crénelage
CV_AA = 16
#Point final
end_pt = (int(start_pt[0] + length * vec[0]), int(start_pt[1] + length * vec[1]))
#Dessiner le centre
cv2.circle(img, (int(start_pt[0]), int(start_pt[1])), 5, colour, 1)
#Dessiner l'axe
cv2.line(img, (int(start_pt[0]), int(start_pt[1])), end_pt, colour, 1, CV_AA);
#Dessinez une flèche à la pointe
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__':
#Charger l'image
src = cv2.imread("pca_test1.jpg ")
#Convertir en échelle de gris
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
#Binarisation
retval, bw = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
#Extraire le contour
# contours : [Région][Point No][0][x=0, y=1]
# cv2.CHAIN_APPROX_NONE:Tenez le milieu
# cv2.CHAIN_APPROX_SIMPLE:Ne tenez pas le milieu
img, contours, hierarchy = cv2.findContours(bw, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
#Traitement pour chaque contour
for i in range(0, len(contours)):
#Calculer la zone de contour
area = cv2.contourArea(contours[i])
#Exclure le bruit (zone trop petite) et le contour global (zone trop grande)
if area < 1e2 or 1e5 < area:
continue
#Dessiner un contour
cv2.drawContours(src, contours, i, (0, 0, 255), 2, 8, hierarchy, 0)
#Stocker les données de contour dans un tableau à virgule flottante
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)
#Dessinez un vecteur dans la direction du composant principal
pt = (mean[0][0], mean[0][1])
vec = (eigenvectors[0][0], eigenvectors[0][1])
drawAxis(src, pt, vec, (255, 255, 0), 150)
#afficher
cv2.imshow('output', src)
cv2.waitKey(0)
#Terminer le traitement
cv2.destroyAllWindows()
Le résultat de l'exécution ressemblera à l'image affichée au début.
Reconnaissons le contour et la direction non seulement pour l'image échantillon, mais également pour d'autres images. Par exemple, analysons en plaçant un cintre avec un trou caractéristique sur un motif comme un tatami. En conséquence, nous avons pu afficher le vecteur dans la direction de la composante principale pour les trois contours entourant le petit trou, le contour extérieur et le contour intérieur.
Recommended Posts