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:
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)