Détection de cercle sur une droite avec OpenCV et Python

a marqué ce sujet comme résolu.

Bonjour

Pour commencer, je suis totalement débutant dans l’utilisation d’OpenCV. J’ai une image de départ, le but c’est de détecter les différents trou et de les découper pour avoir des images séparée de chaque trou.

J’arrive déjà à bien repérer les trous comme le montre cette image, sauf que je vois pas trop comment nettoyer les autres cercles que je détecte.

J’ai essayé de tracer une droite qui passe par le centre de chaque points et si j’ai 6 points sur la droite les cercles sont bien les bon, mais je n’arrive pas vraiment au bon résultat (en fonction de comment je tourne le plateau). Je me suis dit que je pourrais détecter la ligne au milieu (je n’ai pas encore essayé) mais ca me bloquerais à ce plateau en particulier.

Peut être qu’il y a aussi une formule de math pour faire un rectangle ou faire une droite imaginaire ? Je suis un peu dépassé par mon niveau de math.

Bout de code pour l’instant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
import cv2

image = cv2.imread('image.png')

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cimg = cv2.medianBlur(gray, 5)

circles = cv2.HoughCircles(cimg, cv2.HOUGH_GRADIENT, 2, 100, param1=50,
                            param2=30, minRadius=40, maxRadius=55)

circles = np.round(circles[0, :]).astype("int")

for (x, y, r) in circles:
        cv2.circle(image, (x, y), r, (0, 255, 0), 2)
        cv2.circle(image, (x, y), 2, (0, 0, 255), 3)

cv2.imshow("output transform", image)
cv2.waitKey(0)

`

Si vous avez des idées ou un bout de code ça me va :)

Merci d’avance

Salut,

Une droite possède une équation de type $y=mx+p$, ou $m$ est la pente et $p$ l’ordonnée à l’origine. Si tu connais deux points, $(x_1, y_1)$ et $(x_2, y_2)$, les 2 paramètres sont donnés par

$$m=\frac{y_2-y_1}{x_2-x_1} \text{ et puis }p=y_1-m\,x_1=y_2-m\,x_2.$$

Ensuite, pour vérifier si un autre point $(x_3,y_3)$ appartient à la droite, il "suffit" d’utiliser l’équation de la droite à partir de $x_3$, et de vérifier que le $y=m\,x_3+p$ obtenu correspond bien à $y_3$, avec un petit threshold pour éviter les erreurs d’arrondi (et le fait que tu utilise une image), donc math.fabs(y-y3) < 1e-1, ou un truc du genre.

La stratégie, ici, ce serait donc d’essayer de créer des droites à partir de deux point parmis l’entièreté, puis de trouver parmis les autres points ceux qui correspondent. Évidement, il y a un tout petit peut d’optimisation à faire, parce que dans l’absolu, il ne faut pas tester TOUTES les droites formées par chaque paire de deux points, mais je te laisse réfléchir ;)

+0 -0

Vue l’image qu’il a donnée en exemple, je doute que ce soit suffisant : il y a plein de cercles parasites qui forment des alignements. Je ne pense pas qu’une méthode qui consiste à dire « on n’a qu’à regarder la régularité des distances » soit très robuste non plus. Est-ce que tu es sûr d’avoir les bons paramètres pour ta première détection de cercles ? Je me trompe peut-être, mais j’ai l’impression que c’est encore suffisamment approximatif pour laisser place à des améliorations.

J’ai pensé à tracer des traits à partir de tout les points que je trouve, après je regarde si ma droite coupe bien 6 points. Mais ca me semble compliqué, doit avoir plus simple je pense, j’ai regardé rapidement faire des droits mais je n’arrive pas totalement à ce que je veux.

@pierre_24 A chaque fois que je regarde sur internet, je tombe sur des sujets avec pas mal de maths, j’ai regardé tracé une droite à partir d’un nuage de points :o j’ai pris peur.

@Eusèbe Je vais regarder si je peut améliorer mes params, je m’amuse à faire un cercle avec ma main, il le détecte bien, je vais regarder plus en détail la function HoughCircles.

Quand je vois qu’il détecte le cable… il vois trois points du coup pour lui c’est un cercle…

Vue l’image qu’il a donnée en exemple, je doute que ce soit suffisant : il y a plein de cercles parasites qui forment des alignements. Je ne pense pas qu’une méthode qui consiste à dire « on n’a qu’à regarder la régularité des distances » soit très robuste non plus.

Eusèbe

Toutafé d’accord, et OpenCV n’est absolument pas mon rayon. Après, peut de chances qu’il détecte 6 cercles alignés au hasard ;) (même si ça ne tue jamais d’améliorer la fonction pour éviter les faux-positifs).

@pierre_24 A chaque fois que je regarde sur internet, je tombe sur des sujets avec pas mal de maths, j’ai regardé tracé une droite à partir d’un nuage de points :o j’ai pris peur.

… Tu peux bien ^^ … Ce qui ne me dit pas si tu as compris mon explication ou pas, note !

Oui j’ai bien compris l’explication.

"La stratégie, ici, ce serait donc d’essayer de créer des droites à partir de deux point parmis l’entièreté, puis de trouver parmis les autres points ceux qui correspondent. Évidement, il y a un tout petit peut d’optimisation à faire, parce que dans l’absolu, il ne faut pas tester TOUTES les droites formées par chaque paire de deux points, mais je te laisse réfléchir "

Apres pour la partie du dessus, faut que je relise mieux

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte