[qt designer] Calcul du centre d'un objet

Calcul du centre d'un objet [qt designer] - C++ - Programmation

Marsh Posté le 07-04-2006 à 12:34:52    

Voila, j'ai un objet repéré dans une image,
Composition de la matrice de pixel -> 0 = l'objet n'est pas la et 1->objet repéré
donc en gros, en affichant ma matrice, j'aurai une tâche noir correspondant au 1 et le reste en blanc
 
Comment fair pour calculé le centre de cet object en C++
 
Merci pour l'aide...


Message édité par heyheyhey71 le 19-04-2006 à 10:26:24
Reply

Marsh Posté le 07-04-2006 à 12:34:52   

Reply

Marsh Posté le 18-04-2006 à 12:45:57    

:bounce:

Reply

Marsh Posté le 18-04-2006 à 17:31:37    

Bonjour,
 
Personnellement (si il s'agit d'un objet simple) j'utiliserai la formule suivante :
 
Px = Somme des absices / nb de 1 trouvés
Py = Somme des ordonnées / nb de 1 trouvés
 
Il y a d'autres algo plus compliqués pour des objets plus complexes, celui ci devrait très bien marché pour tout ce qui est forme de base (carré, rectangle, rond etc)
 
Voilou  :)

Reply

Marsh Posté le 18-04-2006 à 22:35:55    

Tu prend le point le plus en bas a gauche de ta tache (P0).
Tu peux construire n - 1 vecteur partant P0 ver Pn.
Tu fais une analyse en composante principale. Tu conserves le vecteur propre associee a ta plus grande valeur propre.
Tu fais la moyenne des distances de Mahalanobis en te basant sur la matrice de covariance croisee formee par tes vecteurs.
 
Tu en deduis le centre de ta tache.

Reply

Marsh Posté le 19-04-2006 à 10:20:55    

Pour la première réponse, j'avais déja pensé à cet solution mais je pense qu'il faudrais un résultat exacte puisque le centre me servira a guider un robot d'ou un résultat le plus précis possible...
 
Pour la 2ième réponse, je vois a peu près ce que tu veu dir, mais aurais tu un code source a ce sujet car la comme ca, je pourrais rien codé. C'est un peu compliqué...
 
Merci

Reply

Marsh Posté le 20-04-2006 à 10:44:38    

up!

Reply

Marsh Posté le 20-04-2006 à 10:47:25    

Tu peux prendre chaque pixel noir, lui associer un poids de 1, et ensuite calculer le centre de gravité de l'ensemble de tes points. En considérant que l'objet a une masse uniformément répartie, ça te donne le centre réel de ton objet.
Par contre, pour peu que ton image soit en haute résolution et donc ton objet composé de centaines de milliers de points, ça va être un peu lent...

Reply

Marsh Posté le 21-04-2006 à 10:21:25    

ok, et ya t'il des algorithmes pour le calcul du centre de gravité en sachant les corrdonnées [x,y] de mon objet ?

Reply

Marsh Posté le 21-04-2006 à 11:25:23    

Le centre de gravité d'un nuage de points uniformément pondérés, c'est logiquement la moyenne des x et y de tous les points.
Si t'as par exemple des niveaux de gris indiquant la répartition de la masse (ou à défaut, de l'épaisseur), tu peux améliorer cet algo en faisant la moyenne pondérée par le niveau de gris des coordonnées de poins.

Reply

Marsh Posté le 21-04-2006 à 11:33:32    

ok, ok pour commencer je vais fair cette moyenne, après on verra pour améliorer tout ca...

Reply

Marsh Posté le 21-04-2006 à 11:33:32   

Reply

Marsh Posté le 21-04-2006 à 12:06:10    

Voici un exemple de ce que ça donne avec ma méthode, et donc des objets dont le centre de gravité n'est pas vraiment évident si on se contente des bounds de l'objet.
 
Mes objets mesurés :
http://www.bci-logs.fr/medias/object0.PNG http://www.bci-logs.fr/medias/object1.PNG http://www.bci-logs.fr/medias/object2.PNG
 
Le résultat :
http://www.bci-logs.fr/medias/gravite.PNG
 
Le source (C#) :

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5. namespace Gravite
  6. {
  7.     public partial class Form1 : Form
  8.     {
  9.         public Form1()
  10.         {
  11.             InitializeComponent();
  12.         }
  13.         private void Form1_Load(object sender, EventArgs e)
  14.         {
  15.             Cursor.Current = Cursors.WaitCursor;
  16.             this.SuspendLayout();
  17.             // Chargement des 3 images d'exemple
  18.             // Puis recherche du centre de gravite
  19.             // Et affichage
  20.             for (int i = 0; i < 3; i++)
  21.             {
  22.                 Bitmap myBmp = new Bitmap(string.Format(@"c:\object{0}.PNG", i.ToString()));
  23.                 long cumX = 0, cumY = 0, nbPix = 0;
  24.                 int moyX = 0, moyY = 0;
  25.                 for (int x = 0; x < myBmp.Width; x++)
  26.                 {
  27.                     for (int y = 0; y < myBmp.Height; y++)
  28.                     {
  29.                         if (myBmp.GetPixel(x, y).R < 127 || myBmp.GetPixel(x, y).G < 127 || myBmp.GetPixel(x, y).B < 127)
  30.                         {
  31.                             cumX += x;
  32.                             cumY += y;
  33.                             nbPix++;
  34.                         }
  35.                     }
  36.                 }
  37.                 if (nbPix != 0)
  38.                 {
  39.                     moyX = (int)(cumX / nbPix);
  40.                     moyY = (int)(cumY / nbPix);
  41.                     Graphics g = Graphics.FromImage(myBmp);
  42.                     g.DrawLine(Pens.Red, moyX, moyY - 5, moyX, moyY + 5);
  43.                     g.DrawLine(Pens.Red, moyX - 5, moyY, moyX + 5, moyY);
  44.                 }
  45.                 PictureBox tmpPictureBox = new PictureBox();
  46.                 tmpPictureBox.Image = myBmp;
  47.                 tmpPictureBox.Size = tmpPictureBox.Image.Size;
  48.                 this.Controls.Add(tmpPictureBox);
  49.                 tmpPictureBox.Location = new Point((tmpPictureBox.Image.Size.Width + 4) * i + 4, 4);
  50.             }
  51.             this.ResumeLayout();
  52.             Cursor.Current = Cursors.Default;
  53.         }
  54.     }
  55. }

Reply

Marsh Posté le 04-05-2006 à 15:13:49    

ok, pour le calcul du centre, je me suis fait un petit programme, maintenant, il faut que je calcul la surface de l'object détecter, j'ai fait un segmentation pour enlevé le bruit contenu dans l'image donc l'extérieur de l'objet ne contient aucun bruit (tous les pixels sont blancs) et l'objet est dessiné par un nuage noir!!
 
comment fair au plus facile pour calculé sa largeur et hauteur puis ca surface?

Reply

Marsh Posté le 04-05-2006 à 15:27:50    

c'est bon j'ai fait ma fonction ... no soucy

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed