Traitements des contours

Après avoir défini le seuil et éliminé le bruit avec des opérations morphologiques, vous êtes maintenant prêt à utiliser la méthode findContours d’OpenCV. Cette méthode vous permet de générer des contours en fonction de votre image binaire.

Recherche et filtrage des contours

_, contours, _ = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

Dans les cas où il n’y a qu’une seule cible de vision, vous pouvez simplement prendre le plus grand contour et supposer que c’est la cible que vous recherchez. Lorsqu’il existe plusieurs cibles de vision, vous pouvez utiliser la taille, la forme, l’ampleur et d’autres propriétés pour filtrer les contours indésirables.

if len(contours) > 0:
   largest = contours[0]
   for contour in contours:
      if cv2.contourArea(contour) > cv2.contourArea(largest):
         largest = contour

   #
   # Contour processing code
   #

Si vous dessinez le contour que vous venez de trouver, il devrait ressembler à ceci:

Retroreflective tape outlined in red by the image processing algorithm.

Extraire des informations des contours

Maintenant que vous avez trouvé le (s) contour (s) que vous voulez, vous voulez maintenant obtenir des informations à ce sujet, telles que le centre, les coins et la rotation.

Centre

rect = cv2.minAreaRect(contour)
center, _, _ = rect
center_x, center_y = center

Coins

corners = cv2.convexHull(contour)
corners = cv2.approxPolyDP(corners, 0.1 * cv2.arcLength(contour), True)

Rotation

_, _, rotation = cv2.fitEllipse(contour)

Pour plus d’informations sur la façon dont vous pouvez utiliser ces valeurs, voir: Mesures

Publication sur NetworkTables

Vous pouvez utiliser NetworkTables pour envoyer ces propriétés au Driver Station et au RoboRIO. Un traitement supplémentaire peut être effectué sur le Raspberry Pi ou le RoboRIO lui-même.

from networktables import NetworkTables

nt = NetworkTables.getTable('vision')

#
# Initialization code here
#

while True:

   #
   # Image processing code here
   #

   nt.putNumber('center_x', center_x)
   nt.putNumber('center_y', center_y)