Reconnaître le contour et la direction d'un objet façonné avec OpenCV3 et Python3 (analyse des composants principaux: PCA, vecteur propre)

Qu'est-ce que l'analyse en composantes principales (ACP)?

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.

pca_output.png ** 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)

algorithme

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. GaussianScatterPCA.svg.png 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.

  1. Convertit les informations de couleur qui semblent inutiles pour reconnaître la direction d'un objet en informations en noir et blanc.
  2. Reconnaissez le contour de l'objet comme un point bidimensionnel (coordonnée x, coordonnée y).
  3. Effectuer une analyse en composantes principales (ACP) sur une collection de points de contour (x, y).
  4. Trouvez le vecteur (vecteur unique) en direction du composant principal et dessinez-le sur l'image.
  5. Répétez les étapes 1 à 4 pour chaque objet.

Ainsi, si vous utilisez OpenCV, vous pouvez reconnaître le contour et la direction d'un objet en appelant simplement quelques méthodes.

programme

--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.

prime

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. hanger_out.png

Recommended Posts

Reconnaître le contour et la direction d'un objet façonné avec OpenCV3 et Python3 (analyse des composants principaux: PCA, vecteur propre)
[Python] Comparaison de la théorie de l'analyse des composants principaux et de l'implémentation par Python (PCA, Kernel PCA, 2DPCA)
Défiez l'analyse des composants principaux des données textuelles avec Python
Analyse en composants principaux (PCA) et analyse en composants indépendants (ICA) avec python
[GWAS] Tracez les résultats de l'analyse en composantes principales (ACP) par PLINK
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Créez DNN-CRF avec Chainer et reconnaissez la progression des accords de la musique
Obtenez et estimez la forme de la tête en utilisant Dlib et OpenCV avec python
Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV
Compression dimensionnelle par auto-encodeur et analyse des composants principaux
Prise en compte des forces et faiblesses de Python
Obtenez le cours de l'action d'une entreprise japonaise avec Python et faites un graphique
Obtenez une grande quantité de données Twitter de Starba avec python et essayez l'analyse de données Partie 1
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
Visualisez la gamme d'insertions internes et externes avec python
Compréhension mathématique de l'analyse en composantes principales depuis le début
Calculer le coefficient de régression d'une analyse de régression simple avec python
Remplissez l'arrière-plan d'une seule couleur avec OpenCV2 + Python
Analyse des composants principaux à l'aide de python de nim avec nimpy
Analyse en composantes principales (Analyse en composantes principales: ACP)
Un serveur qui renvoie le nombre de personnes devant la caméra avec bottle.py et OpenCV
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
Effectuer une analyse isocurrent des canaux en eau libre avec Python et matplotlib
Détecter les objets d'une couleur et d'une taille spécifiques avec Python
Créez un outil d'analyse vidéo simple avec python wxpython + openCV
Visualisez la matrice de corrélation par l'analyse des composants principaux avec Python
Estimer la posture du marqueur AR avec Python + OpenCV + drone
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python
Un débutant en Python a d'abord essayé une analyse rapide et facile des données météorologiques des 10 dernières années.
L'extraction de couleur avec Python + OpenCV a résolu le mystère du fond vert
[python, ruby] sélénium-Obtenez le contenu d'une page Web avec le pilote Web
Introduction aux bases de Python de l'apprentissage automatique (apprentissage non supervisé / analyse principale)
Créez une illusion rayée avec correction gamma pour Python3 et openCV3
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Créez un simple OMR (lecteur de feuille de marque) avec Python et OpenCV
L'histoire de la création d'un pilote standard pour db avec python.
Dessinez une illusion d'aquarelle avec détection des contours en Python3 et openCV3
Résolvez le problème du sac à dos Python avec la méthode de branche et liée
L'idée d'alimenter le fichier de configuration avec un fichier python au lieu de yaml
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
L'histoire de la création d'un module qui ignore le courrier avec python
[Python] Essayez de reconnaître les caractères des images avec OpenCV et pyocr
Créez un programme de jugement de compatibilité avec le module aléatoire de python.
Briller la vie avec Python et OpenCV
L'histoire de Python et l'histoire de NaN
Réseau neuronal avec OpenCV 3 et Python 3
Analyse des composants principaux avec Spark ML
Python: apprentissage non supervisé: analyse principale
Coexistence de Python2 et 3 avec CircleCI (1.0)
Etude de base d'OpenCV avec Python
J'ai remplacé le calcul numérique de Python par Rust et comparé la vitesse
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
[Explication AtCoder] Contrôlez les problèmes A, B, C d'ABC182 avec Python!
Comment couper la partie inférieure droite de l'image avec Python OpenCV