find_lines.py
# Ce travail est publié sous licence MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Tous droits réservés.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Exemple de détection de lignes
#
# Cet exemple montre comment détecter des lignes dans l'image. Pour chaque objet ligne
# trouvé dans l'image, un objet ligne est retourné, incluant la rotation de la ligne.
# Remarque : la détection de lignes est effectuée à l'aide de la transformée de Hough :
# http://en.wikipedia.org/wiki/Hough_transform
# Veuillez lire l'article ci-dessus pour en savoir plus sur ce que sont `theta` et `rho`.
# find_lines() détecte des lignes de longueur infinie. Utilisez find_line_segments() pour détecter des lignes non infinies.
import csi
import time
ENABLE_LENS_CORR = False # activez pour obtenir des lignes plus droites...
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565) # les niveaux de gris sont plus rapides
csi0.framesize(csi.QQVGA)
csi0.snapshot(time=2000)
clock = time.clock()
# Tous les objets ligne possèdent un attribut `theta` permettant d'obtenir leur angle de rotation en degrés.
# Vous pouvez filtrer les lignes en fonction de leur angle de rotation.
min_degree = 0
max_degree = 179
# Toutes les lignes possèdent également des attributs `x1`, `y1`, `x2` et `y2` permettant d'obtenir leurs points d'extrémité.
# Les objets ligne peuvent être transmis directement à `draw_line()`.
while True:
clock.tick()
img = csi0.snapshot()
if ENABLE_LENS_CORR:
img.lens_corr(1.8) # pour un objectif de 2.8mm...
# `threshold` contrôle le nombre de lignes détectées dans l'image. Seules les lignes dont
# la somme des magnitudes de différence de bord est supérieure à `threshold` sont détectées...
# Plus de détails sur `threshold` - chaque pixel de l'image contribue une valeur de magnitude
# à une ligne. La somme de toutes les contributions constitue la magnitude de cette ligne. Ensuite,
# lorsque des lignes sont fusionnées, leurs magnitudes sont additionnées. Notez que `threshold`
# filtre les lignes à faible magnitude avant la fusion. Pour voir la magnitude des
# lignes non fusionnées, définissez `theta_margin` et `rho_margin` à 0...
# `theta_margin` et `rho_margin` contrôlent la fusion des lignes similaires. Si deux lignes
# les différences de valeurs theta et rho sont inférieures aux marges, elles sont fusionnées.
for l in img.find_lines(threshold=1000, theta_margin=25, rho_margin=25):
if (min_degree <= l.theta) and (l.theta <= max_degree):
img.draw_line(l, color=(255, 0, 0))
# print(l)
print("FPS %f" % clock.fps())
# À propos des valeurs de rho négatives :
#
# Un tuple [theta+0:-rho] est identique à [theta+180:+rho].