0

discrets sur un plan en fonction de grille discrète (pense: pixels d'une image), I ont un contour fermé qui peut être exprimé soit par:algorithme pour calculer un ensemble de bacs délimitées par un contour

  • un ensemble de points 2D (x1,y1);(x2,y2);(x3,y3);...
  • ou un 4-connecté Freeman code, avec un point de départ: (x1,y1) + 00001112...

je sais comment passer de l'un à l'autre de ces représentations. Ce seront les données d'entrée.

Je souhaite obtenir l'ensemble des coordonnées de la grille délimitées par le contour. Considérons cet exemple, où les coordonnées rouges sont le contour et le gris le point de départ:

Sample contour

Si le gris coordonnée est, par exemple, à (0,0), alors je veux un vecteur maintien: (1,1),(2,1),(3,1),(3,2)

L'ordre n'est pas important, et le vecteur de sortie peut également contenir le contour lui-même.

Langue de choix est C++, mais je suis ouvert à tout code existant, algorithme, bibliothèque, pointeur, peu importe ...

Je pensais que CGAL aurait peut-être quelque chose comme ça, mais je ne connais pas bien et je ne pouvais pas trouver mon chemin à travers le manuel, donc je ne suis même pas sûr. J'ai également regardé vers Opencv mais je pense qu'il ne fournit pas cet algorithme (mais je peux me tromper?).

Je pensais trouver le rectangle de délimitation, puis vérifier chacun des points dans le rectangle pour voir s'ils sont inside/outside, mais cela semble sous-optimal. Une idée ?

+3

Tout ce que vous devez faire est de trouver un seul point à l'intérieur de la limite, puis remplir d'eau. C'est un algorithme récursif simple. –

+1

Vous devriez vérifier si "trouver le rectangle de délimitation" est vraiment lent. Si votre contour n'est pas très grand, il est probablement plus rapide de dessiner le countour dans un tableau 2D, puis de remplir le remplissage comme le suggère j_random_hacker. Sinon, vous aurez du mal à trouver quelle position de la grille appartient au contour. – DrV

+0

@j_random_hacker Merci, je n'ai pas pensé à celui-là en effet, mais ça me semble une bonne idée. Peut-être pas une mise en œuvre récursive, cependant, car je crains que ce ne soit pas le plus rapide. Je vais enquêter. – kebs

Répondre

1

Une façon de résoudre cela est drawContours, et vous avez des contours de points avec vous.

  1. Créer un cache et dessiner un contour avec une épaisseur = 1 (limite).
  2. Créer un autre cache et dessiner un contour d'épaisseur = CV_FILLED (toute la zone incluant la limite).
  3. Maintenant bitwise_and entre deux (vous avez une zone remplie à l'exclusion de la limite).
  4. Enfin, vérifiez les pixels non nuls.
+0

Merci d'avoir répondu. Le problème avec cette approche est le point 4: cela signifie analyser tous les pixels 1 par 1. Si j'ai une grande grille et des contours qui n'ont qu'une petite surface, c'est sous-optimal. Mais le plus gros problème est que j'ai ** plusieurs ** contours, et avec cette méthode je ne peux pas savoir quels pixels appartiennent à quel contour. – kebs

Questions connexes