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)

In cases where there is only one vision target, you can just take the largest contour and assume that is the target you are looking for. When there is more than one vision target, you can use size, shape, fullness, and other properties to filter unwanted contours out.

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:

Bande rétroréfléchissante délimitée en rouge par l’algorithme de traitement d’image.

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.

import ntcore

nt = ntcore.NetworkTableInstance.getDefault().getTable('vision')

#
# Initialization code here
#

while True:

   #
   # Image processing code here
   #

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