Trés urgent(probléme de programmation)

amine52002 Messages postés 23 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 1 juillet 2008 - 13 févr. 2008 à 20:06
 cs_AccessToYou - 20 sept. 2008 à 21:51
bonsoir ,
je suis debutant en programmation et j'ai voulé creer un programme qui permet d'extraire un ensemble de points à partir de la silhouette d'une image et d'afficher ces points sur une autre variable image
l'idée c'est pr chaque distance D je prend un point
j'ai esseyé de faire ce code mais il na pas marché
pouriez vous m'aidez la SVP

procedure TForm1.preleverClick(sender:Tobject);
var
x,y: Tpoint;
i,j,nbCount,z,t:integer;
begin
 nbCount:=0;
for j:=0 to bmp.height-1 do
  for j:=0 to bmp.width-1 do
   begin
    x.X:=bmp.Canvas.PenPos.X;
    x.Y:= bmp.Canvas.PenPos.Y;
    tableau[nbCount]:=x;
    nbCount:= nbCount+1;
   end;
  for i:=0 to nbCount-1 do
   begin
    y.X:=tableau[nbCount].X;  z:=y.X;
    y.Y:=tableau[nbCount].Y;  t:=y.Y;
   form1.Image2.Canvas.MoveTo(z,t);
   end;
end;

pouriez vous optimisez mon code pr qu'il puisse marcher

28 réponses

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
13 févr. 2008 à 21:26
ouhaaaaa, ca c'est une procedure qui sert a ..... bah absolument a rien !!!
j'ai pas trop compris ton sujet, mais ca me semble pas des plus simple pour debuter

procedure TForm1.preleverClick(sender:Tobject);
var
x,y: Tpoint;
i,j,nbCount,z,t:integer;
begin
  nbCount:=0;
  for j:=0 to bmp.height-1 do
    for j:=0 to bmp.width-1 do //modification de la variable "j" de la premiere boucle, je croyai que c'etait pas possible. peut etre utiliser i et j
    begin //la tu parcours chaque pixel ton image
      x.X:=bmp.Canvas.PenPos.X;
      x.Y:= bmp.Canvas.PenPos.Y;
      //Le penpos dans ta boucle ne change pas, donc tableau[x]=tableau[x+1]
      tableau[nbCount]:=x;
      nbCount:= nbCount+1;
    end;

    //a ce stade, tu as un tableau de bmp.height*bmp.width elements tous identiques correspondant au penpos de ton bmp

  for i:=0 to nbCount-1 do

  begin

    y.X:=tableau[nbCount].X; 

    z:=y.X;

    y.Y:=tableau[nbCount].Y; 

    t:=y.Y;

    form1.Image2.Canvas.MoveTo(z,t);

  end;
  //la boucle precedente est equivalente a la suivante: ...
  for i:=0 to nbCount-1 do

  begin
    form1.Image2.Canvas.MoveTo(tableau[nbCount].X, tableau[nbCount].Y);

  end;
  //... qui deplace le Pen (sans dessiner, ca c'est LineTo) su chaque pixel de ton image
end;

Pour resumer, tu memorise autant de fois qu'il y a de pixels dans ton image la position du pen qui ne bouge pas, et ensuite, tu deplace le pen d'une autre image sur ce meme point le meme nombre de fois. Pas tres efficace to ca.

Sinon, tu peux faire

form1.Image2.bitmap.assign(bmp);
0
amine52002 Messages postés 23 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 1 juillet 2008
13 févr. 2008 à 21:47
enfait l'idée de penpos ne me sert à rien j'ai juste essayé avec
mon probléme c'est que au depart j'ai le contour externe d'une image avec qui je doit recuperer un ensemble de points par exemple pr chaque 3 pixel je prend un point jusqua la fin du contour (sela ce fait de maniére algorithmique) et que par la suite afficher ces points sur un autre Timage
mon grand pb c'est que je ne sais pas vraiment programmé
et que j'ai resté des jours à ecrire ce code
SVP aidez moi
0
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 3
13 févr. 2008 à 22:19
Bonjour,

si j'ai bien compris, tu as une image avec le contour et tu veux mémoriser tous les points du contour pour pouvoir les réafficher dans une autre image ?
Déja, ton algorythme c'est quoi ? Tu ne peux pas partir à l'aveuglette. Comment compte tu mémoriser les points du contour , veux tu que tes points se suivent comme une ligne que l'on suit ou veux tu juste mémoriser les points du contour comme un simple nuage de point (si les points se suivent, tu pourras faire des zooms facilement mais l'analyse est assez complexe sinon le nuage est très facile à faire mais un zoom est bien plus dur) ? Ton contour a - t-il toujours la même couleur (comment le différencier du reste de l'image ? ). Pour pouvoir faire ton programme, il faut que tu détailles un peux plus ton projet car ton code n'est pas clair et je suis désolé mais je ne peux pas t'aider sans plus de détails.

Une bonne étude du probléme et ton programme va se faire tout seul , mais j'en conviens, ce n'est pas facile ...

Oniria
0
amine52002 Messages postés 23 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 1 juillet 2008
13 févr. 2008 à 22:35
enfait mon application consiste à faire une description textuelle de mon objet grace au contour externe je pourais faire une description textuelle qui se base sur :
decouper le contour en morceau (on va avoir un ensemble de courbes concave convexe ou droite ) l'idée c'est de determiner les equations(primitive simple de degré 2) de ces courbes pour cela  je doit faire une approximation  par moindre carré  (sur cette  partie  j'ai  trouvé  un exemple)  mais tt d'abord  je doit demarrer  par un ensemble de points  que je doit l'extraire  à partir  des courbes que j'ai  ça veu dire je vais avoir  la meme  trace  dans les points  que celle  de ma courbe
mon grand probléme c'est je suis un debutant en programmation
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
13 févr. 2008 à 22:49
Si j'ai bien compris, mais 'faut s'accrocher :)

2 TImages et un TButton sur une fiche.

var
  Tableau    : array[0..1000] of Tpoint;//Contient les points cliqués.
  NbrePixels : Integer;  //Nbre Pixels cliqués.



procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
{Peut-être mieux avec MouseMove ?}
  var
  i : integer;
  begin
  if NbrePixels=0 then for i := 0 to high(Tableau) do Tableau[i] := Point(X,Y); // On initialise Tableau qd 1er pt cliqué.
  Tableau[NbrePixels] := point(X,Y);//On mémorise les TPoints cliqués dans le tableau, à chaque click.
  inc(NbrePixels);
end;



procedure TForm1.Button1Click(Sender: TObject);
  {Dessine les pts du tableau ds l'image2}
  var
  Bmp : Tbitmap;
  i   : Integer;
  begin
  Bmp :=Tbitmap.Create;
  Bmp.Height := Image1.Picture.Height;
  Bmp.Width  := Image1.Picture.Width;
  Bmp.Canvas.Brush.Color := clWhite; // Peinture blanche à la brosse.
  Bmp.Canvas.FillRect(Bmp.Canvas.ClipRect); //On peint le Bmp.
  //Bmp.Canvas.Polygon(tableau);//Joint chaque pt de Tableau par une ligne noire sur Bmp.
  for i := 0 to NbrePixels do //ou que les pts.
    Bmp.Canvas.Pixels[tableau[i].X,tableau[i].Y] := clBlack;
  Image2.Picture.Bitmap.Assign(Bmp);
end;
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
13 févr. 2008 à 23:09
Autre version qui te dessine directement une courbe. Mais je ne sais pas si c'est ce que tu cherches, en fait :

var
  Tableau : array[0..5000] of Tpoint; //Contient les points cliqués.
  NbrePixels : Integer;  //Nbre Pixels ds le tableau.



procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  var
  i : integer;
  begin
  NbrePixels := 0;
  for i := 0 to high(Tableau) do Tableau[i] := Point(X,Y);
end;



procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
  begin
  if ssLeft in Shift then begin //vérifie que le bouton gauche est enfoncé.
  {Trace une ligne de sélection en noir.}
  Image1.Picture.Bitmap.Canvas.Pixels[X,Y] := clblack;
  Tableau[NbrePixels] := point(X,Y);
  inc(NbrePixels);
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
  {Dessine les pts du tableau ds l'image2}
  var
  Bmp : Tbitmap;
  i   : Integer;
  begin
  Bmp :=Tbitmap.Create;
  Bmp.Height := Image1.Picture.Height;
  Bmp.Width  := Image1.Picture.Width;
  Bmp.Canvas.Brush.Color := clWhite; // Peinture blanche à la brosse.
  Bmp.Canvas.FillRect(Bmp.Canvas.ClipRect); //On peint le Bmp.
  Bmp.Canvas.Polygon(tableau);//Joint chaque pt de Tableau par une ligne noire sur Bmp.
  Image2.Picture.Bitmap.Assign(Bmp);
end;
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
13 févr. 2008 à 23:28
Précision pour Amine:

Dans ces 2 exemples, c'est toi qui dessine le contour à la souris.
Si tu veux le faire par logiciel, ce n'est plus un truc de débutant...
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
13 févr. 2008 à 23:41
... Et si tu pouvais nous montrer l'image sur laquelle tu travailles, ça nous éviterait peut-être de partir dans des trucs compliqués  ;)
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
14 févr. 2008 à 09:10
salut,

moi quand j'entends parler de "détecter des contours" je penses tout de suite à une différentielle par calcul matricielle. C'est quand même un des meilleurs moyens...

mais, j'ai comme l'impression que c'est un labo... donc tu devrait t'en tenir à ce que ton prof vous a suggéré...

bon code,

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
amine52002 Messages postés 23 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 1 juillet 2008
14 févr. 2008 à 10:35
la suggéstion c'est que l'extraction des points du contour et le traçage de la courbe ne ce fait pas pas la main mais plutot de maniére automatique
l'image que je travaille est de la forme quelquonque (fond noir et exterieur blanche)
je présis que le prelevement des points ne ce fait pas manuellement pas la souri mais plutot de mamiére algorithmique (par exemple on demarre par le premier point ,aprés chaque 3pixel (variable d)on prend un autre point etc )cette variable d est en entrée on peut la changé à chaque fois
c'est vrais ce n'est pas un truc de debutant mais plutot c'est moi qui est debutant.
je vous rappel chére membre que cette application c'est mon projet de fin d'etude
et j'ai besoin de votre aide vous les expert de la programmation
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
14 févr. 2008 à 19:13
je comprend pas la , c'est ton projet de fin d'année et tu prends qqch que tu maitrise pas ! ya comme 1 probleme la , et meme si qq1 te resoud ca , comment vas tu le défendre ?
Tu vas dire , allez sur delphiFr ???!

ps : suis pas méchant mais je comprend pas , c'est tt
ciao
nicolas
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
14 févr. 2008 à 23:10
Moi ce que j'aime bien c'est que t'es incapable d'expliquer correctement a quoi sert ton programme.

"je présis que le prelevement des points ne ce fait pas manuellement pas
la souri mais plutot de mamiére algorithmique (par exemple on demarre
par le premier point ,aprés chaque 3pixel (variable d)on prend un autre
point etc )cette variable d est en entrée on peut la changé à chaque
fois"

c'est un peu abstrait non ?

moi je comprend ça :

selection du point tout les D points a partir du point 0.

soit en code (meme pas besoin d'un bitmap) :

Type
  TPtsArray = array of TPoint;

procedure GetPts(const Width, Height, D: integer; var PtsArray: TPtsArray);
var nb, i, X, Y: integer;
begin
  nb := (Width * Height) div D;
  SetLength(PtsArray, nb+1);
  X := 0;
  Y := 0;
  for i := 0 to nb do
  begin
    PtsArray[i].X := X;
    PtsArray[i].Y := Y;
    X := X + D;
    if X >= Width then
    begin
      Y := Y + 1;
      X := X - Width;
    end;
    if Y > Height then
      Break;
  end;
end;

aprés y'a plus qu'a lire les coordonnées de PtsArray et de selectionner les pixels correspondant.

var PtsArray : TPtsArray;
begin
  BitmapDest.Width := BitmapSrc.Width;
  BitmapDest.Height:= BitmapSrc.Height;

  GetPts(BitmaptSrc.Width, BitmapSrc.Height, 5, PtsArray);

  { a ameliorer avec ScanLine }
  for N := 0 to High(PtsArray) do
    BitmapDest[PtsArray[N].X, PtsArray[N].Y] := BitmapSrc[PtsArray[N].X, PtsArray[N].Y];
end;

<hr size="2" width="100%" />
http://deefaze.gnomz.com
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
15 févr. 2008 à 15:54
Salut à tous,

moi j' essayerai de garder les points mais dessinant une courbe bézier entre eux afin d´ être plus précis.
Mais, lá on s' éloigne peut-être de l' objectif ...

A+
0
amine52002 Messages postés 23 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 1 juillet 2008
15 févr. 2008 à 15:56
la procedure c'est presque ça sauf que le traitement se fait sur le contour externe de l'image (j'ai une image tq le fond est noir est l'extremité exterieur blanche )
c'est vrai que c'est mon projet de fin de l'année et que je suis debutant en programmation mais je comprend ce que vous ecrivez comme code source
mon probléme c'est je ne sais pas comment tronsformmer mes idées en code
merçi comme meme
0
amine52002 Messages postés 23 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 1 juillet 2008
15 févr. 2008 à 16:00
vous avez raison mauricio parce que seul la méthodes des moindre carrée peuve traçer une courbes à partir de n points et trouver un polynome de degré deux par exemple
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
15 févr. 2008 à 16:10
@ MAURICIO
  « Mais, là on s' éloigne peut-être de l'objectif  »

  -Pourquoi? L'objectif est identifié?  

@ Amine

  L'équation d'une courbe de Bézier est loin d'être du 2ème degré.
  Es-tu sûr que tu as bien étudié ton problème?
  La forme à étudier est-elle vraiment quelconque (une patatoïde, par exemple) ?
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
15 févr. 2008 à 16:17
Je vote pour qu' il nous faxe le sujet de son examen!


@amine: fait une recherche avec le mot "bézier", j' ai moi même fait une source sur ce site: tu pourras voir si c' est cela que tu veux ...


A+
0
amine52002 Messages postés 23 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 1 juillet 2008
15 févr. 2008 à 16:20
j'ai dit à mauricio qu'on peut pas utilisée la courbe de bezier , c'est pr ça moindre carrée est la meilleure foçon de faire
je confirme que l'image est de forme quelconque et que l'objectif est de decoupé le contour en morçeau de courbe (parabole hyperbom ou arc )et de droite et aprés de pouvoir extraire à partir de chaque échantillon de courbe un ensemble de points et de pouvoir faire traçé la nouvelle courbe afin de trouver la fonction correspondante à la courbe experimentale
(la partie de moidre carrée est déja realisée comme tt le mode le sache)
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
15 févr. 2008 à 16:22
... Après recherche, une autre approche possible.

Il faudrait commencer par là, je pense : 
 Poser le problème convenablement (par exemple, pourquoi te priver de certains points de ta courbe dès le début du programme? Pourquoi?)
0
amine52002 Messages postés 23 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 1 juillet 2008
15 févr. 2008 à 16:23
ce sera agreablement gentil de votre part si vous comptez vraiment m'aider
pour celui qui veus le faire voici mon email:
amine_2003dz@hotmail.com
0
Rejoignez-nous