amine52002
Messages postés23Date d'inscriptionmercredi 5 décembre 2007StatutMembreDerniè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
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 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.
amine52002
Messages postés23Date d'inscriptionmercredi 5 décembre 2007StatutMembreDerniè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
Oniria
Messages postés292Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention18 décembre 20143 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 ...
amine52002
Messages postés23Date d'inscriptionmercredi 5 décembre 2007StatutMembreDerniè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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 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;
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 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;
cs_Loda
Messages postés814Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention30 juillet 20093 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.
amine52002
Messages postés23Date d'inscriptionmercredi 5 décembre 2007StatutMembreDerniè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
Nicolas___
Messages postés992Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention24 avril 20131 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
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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;
{ 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;
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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 ...
amine52002
Messages postés23Date d'inscriptionmercredi 5 décembre 2007StatutMembreDerniè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
amine52002
Messages postés23Date d'inscriptionmercredi 5 décembre 2007StatutMembreDerniè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
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 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) ?
amine52002
Messages postés23Date d'inscriptionmercredi 5 décembre 2007StatutMembreDerniè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)
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?)