Utilisez Python, les bibliothèques OpenCV et le framework PYNQ pour implémenter la vision par ordinateur sur la plate-forme SoC Arty Z7-20 Xilinx Zynq.
 
 
Présentation
  

Choses utilisées dans ce projet

Composants matériels
 

Platine Arty Z7-20  Platine Arty Z7-20

Platine zedboard  Platine Zedboard Zynq MMP

 

Applications logicielles et services en ligne

OpenCV  OpenCV 

 

Dans cet exemple, les utilisateurs peuvent comprendre comment utiliser OpenCV pour créer un exemple de suivi simple qui suit et identifie les différences entre les trames. Nous allons devoir utiliser une platine Arty Z7-20 chargé avec l'image PYNQ. Vous pouvez apprendre à le faire via "Programmation de Python sur Zynq FPGA"
  
 
De plus, les accessoires supplémentaires suivants sont requis.

- Une caméra Web USB Logitech 720P

- Une caméra HDMI, par exemple la caméra d'action Apeman 1080P

- Des câbles associés pour les ports HDMI In et Out

 
Matériel nécessaire
  
 
Dans un premier temps, nous utiliserons la caméra Web USB comme entrée vidéo couplée à la sortie HDMI avant d'examiner les avantages d'utiliser à la fois l'entrée et la sortie HDMI.

 
Les étapes de l'algorithme sont répertoriées ci-dessous

Étape 1: créer un cadre de référence

- Capturer l'image de l'entrée
- Convertir l'image capturée en échelle de gris (cv2.cvtColor)
- Effectuer un flou gaussien sur l'échelle de gris (cv2.GaussianBlur)
 

Étape 2: capturer un cadre de comparaison

- Convertir l'image capturée en échelle de gris (cv2.cvtColor)
- Effectuer un flou gaussien sur l'échelle de gris (cv2.GaussianBlur)
  

Étape 3: Calculez la différence absolue entre le cadre de référence et le cadre de comparaison (cv2.absdiff)
 

Étape 4: créer une image binaire de la différence absolue (cv2.threshold)
  
 
Étape 5: dilatez l' image binaire (cv2.dilate)

 
Étape 6: trouver les contours dans l' image binaire (cv2.findContours)
 
 
Étape 7: Si la zone de contour est au-dessus, une limite spécifiée l'identifie comme une différence et dessine une boîte autour d'elle (cv2.contourArea, cv2.boundingRect & cv2.rectangle)
 
 
Étape 8: sortie de l' image sur HDMI
 
 
Étape 9: répétez les étapes 2 à 8
  
 
Le code de l'algorithme dans l' environnement Jupyter est le suivant.
 
 
Détail de l'algorithme

 
Résultats et conclusions
 
Ci-dessous, une capture d'écran lorsque l'algorithme est en cours d'exécution 
 

Capture d'écran 
                                             Capture d'écran lorsque l'algorithme est en cours d'exécution 
 

L'exécution de l'algorithme sur l'ArtyZ7-20 entraîne une fréquence d'images de
 
Images par seconde: 11.20220290817649
 
Cette fréquence d'images est raisonnable. Cependant, cette solution est principalement une solution logicielle et utilise uniquement le bloc matériel PYNQ pour la sortie HDMI. En théorie, nous pouvons accélérer la fréquence d'images en utilisant une superposition PYNQ qui nous permet de déplacer certains des algorithmes de traitement d'image dans la logique programmable (PL).

Nous pouvons faire cette accélération en utilisant la nouvelle superposition de vision par ordinateur. Il fournit les fonctions de traitement d'image suivantes accélérées dans la logique programmable et est livré prêt à l'emploi avec le framwork PYNQ.

- Filtre 2D 3 × 3 avec un noyau configurable permettant des flous gaussiens, Sobel (V + H) etc.
- Dilatation
- Re mapping
 
Au sein du PL, ceux-ci sont mis en œuvre comme indiqué dans le diagramme ci-dessous.
  

Block Pynq
 
Pour installer la superposition de vision par ordinateur, nous utilisons un terminal PuTTY connecté au framework PYNQ pour télécharger et installer les packages.
 
Dans le terminal PuTTY, utilisez les commandes Linux suivantes

$ sudo -H pip3.6 install–upgradegit+https://github.com/Xilinx/PYNQ-ComputerVision.git $ sudo reboot now 


Une fois le package installé, nous pouvons procéder à la mise à jour de l'algorithme.
 
La superposition de vision par ordinateur utilise idéalement l'entrée et la sortie HDMI pour les meilleures performances. Pour tester le résultat, l'approche basée sur la caméra Web est toujours appliquée. Nous mettons à jour l'algorithme et utilisons le filtre 2D pour remplacer le flou gaussien. De plus, nous utilisons la fonction de dilatation pour remplacer la fonction OpenCV.
 
 

Code
 
Le code est comme indiqué ci-dessous:
 
 
Code modifié

Code modifié via une caméra USB


Lorsque le code a été exécuté sur l'ArtyZ7-20, la fréquence d'images est légèrement inférieure à la précédente (11.20220290817649)
 
Images par seconde: 10,499496622675153
 
La raison en est que la capture d'image est encore très gourmande en ressources logiciels. Cela signifie que la conversion de l'espace colorimétrique est toujours effectuée dans le logiciel utilisant OpenCV.
  
La meilleure façon d'accélérer cela est d'utiliser l'entrée HDMI (caméra HDMI) car cela nous permet de garder les étapes initiales du traitement dans la logique programmable. Mise à jour de l'algorithme pour lire les données de l'entrée HDMI et les convertir en niveaux de gris dans le PL avant d'utiliser les mêmes filtres pour le flou gaussien et la dilatation entraîne le code ci-dessous.


Code modifié HDMI
 
Code modifié via une caméra USB

 
 
Lorsque nous exécutons ce code, nous recevons une fréquence d'images de
 
Images par seconde: 29,75061900599775
 
Dans l'ensemble, ce n'est pas une mauvaise augmentation de la fréquence d'images, et nous pouvons utiliser ces filtres dans la superposition pour mettre en œuvre d'autres applications de traitement d'image telles que la détection des bords Sobel qui est très utile dans les applications industrielles.
 
Les cahiers Jupyter sont disponibles ici. Vous pouvez donc commencer ce projet.

  

Crédits : Adam Taylor
 
@Digilent inc - 2020
 
Traduction du projet : https://projects.digilentinc.com/adam-taylor/use-python-zynq-and-opencv-to-implement-computer-vision-361e1b

Promo Digilent

Produit ajouté à ma liste