cs_Subzero77
Messages postés10Date d'inscriptionmercredi 31 mai 2006StatutMembreDernière intervention30 avril 2007
-
26 mars 2007 à 11:39
RemiONERA
Messages postés8Date d'inscriptionmercredi 11 janvier 2006StatutMembreDernière intervention 5 juin 2008
-
5 juin 2008 à 09:39
Bonjour a tous...
Je suis actuellement en 2eme année de BTS IRIS et mon projet de fin d'année est
le traitement d'image ( acquisition -> Niveaux de gris -> Bi-Color -> découpage)
Mon problème est le suivant :
Tout d'abord :
J'ai une image capturer à l'aide d'une webCam :
- je stock le premier en-tête dans une Structure (
BITMAPFILEHEADER)
- je stock le second en-tête dans une Structure (
BITMAPINFOHEADER)
- je stock la zone de donnée (l'image) dans un tableau
d'octet (byte)
J'arrive à faire le traitement d'image (conversion gris et bicolore) mais je pèche
un peu sur le découpage : Celui doit se faire selon les coordonnées X et Y d'un
pixel et selon une largeur et une hauteur définit dans la fonction et ceci
n'importe où dans l'image !
Si quelqu'un savait me guider ou si quelqu'un a déjà travaillé la-dessus je
suis bon pour écouter toutes vos idées !
RemiONERA
Messages postés8Date d'inscriptionmercredi 11 janvier 2006StatutMembreDernière intervention 5 juin 2008 26 mars 2007 à 14:31
Salut
Ton problème me semble simple. A partir des coordonnées X et Y tu détermine l'adresse de départ de ta découpe puis tu copie les octets de ton image originale dans un tableau que tu auras défini au préalable.
Voici un petit exemple de code
<hr size="2" width="100%" />void Decoupe(int X, int Y,int L, int H, byte *pDecoupe)
{
int l,c,m;
m=0;
ptr=Y*LargeurBitmap+X;
//puis tu fait la boucle suivante
for(l=0;l<H;l++)
{
memcpy(&pDecoupe[m],Tablo[ptr],L);
m+=L;
ptr+=LargeurBitmap;
}
}
<hr size="2" width="100%" />En espérant t'avoir aidé
Il y a des jours ou je maudis franchement micosoft
Cordialement Rémi
cs_Subzero77
Messages postés10Date d'inscriptionmercredi 31 mai 2006StatutMembreDernière intervention30 avril 2007 26 mars 2007 à 16:08
Merci pour ta rep sa m'as bcp aidé !!
mais j'ai un peu fait autrement ! Pour ceux qui, comme moi, sont dans la merde :
--------------------------------------------------------------------------
void CExtraction::ExtraireZone(int xt, int yt, int largeur_fint, int hauteur_fint)
{
int pos =0, pos2 = 0;
int i = 0, j=0;
int largeur_ini, hauteur_ini;
//alocation mémoire pour le tableau
nbrOctets = largeur_fint * hauteur_fint * 3;
tabZone = new byte[nbrOctets];
//recuper les infos de l'image
largeur_ini = bmpinfoh.biWidth;
hauteur_ini = bmpinfoh.biHeight;
//Boucle pour Recopier l'image
while(pos2<nbrOctets) //tant que on a pas copier tout les octets
{
for(i=0;i<largeur_fint*3;i=i+3) //Bcl parcour la ligne
{
tabZone[pos2+i] = tabImage[pos+i]; //Copie des Données
tabZone[pos2+i+1] = tabImage[pos+i+1]; //...
tabZone[pos2+i+2] = tabImage[pos+i+2]; //...
}
pos = pos + largeur_ini * 3; //On se positione sur la ligne suivante dans le tableau que l'on va copier
pos2 = pos2 + largeur_fint * 3; //On se positione sur la ligne suivante dans le tableau que l'on copie
}
//modification des en-tetes pour ecriture du nouveau bmp
bmpfileh.bfSize = nbrOctets + (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));
bmpinfoh.biHeight = hauteur_fint;
bmpinfoh.biWidth = largeur_fint;
bmpinfoh.biSizeImage = nbrOctets;
}
------------------------------------------------------------------------------------------------------------
Voili Voilou Merci encore et A++ les gens !
RemiONERA
Messages postés8Date d'inscriptionmercredi 11 janvier 2006StatutMembreDernière intervention 5 juin 2008 27 mars 2007 à 07:38
Oui ton algo est équivalent. Toutefois je te suggère d'utiliser memcpy plutot que de faire les attributions dans une boucle c'est beaucoup plus rapide.
for(i=0;i<largeur_fint*3;i=i+3) //Bcl parcour la ligne
{
tabZone[pos2+i] = tabImage[pos+i]; //Copie des Données
tabZone[pos2+i+1] = tabImage[pos+i+1]; //...
tabZone[pos2+i+2] = tabImage[pos+i+2]; //...
}
peut être remplacé par
cs_bossone
Messages postés1Date d'inscriptionmardi 25 mai 2004StatutMembreDernière intervention 4 juin 2008 4 juin 2008 à 17:57
Salut
Je suis une étudiante en première année d'école d'ingénieur. Nous devons programmer à l'aide du langage C++.
Notre problème se situe au niveau du passage en niveau de gris d'une image bmp. Nous n'arrivons pas à ouvrir notre image en niveau de gris
merci pour votre aide
bises
Vous n’avez pas trouvé la réponse que vous recherchez ?
RemiONERA
Messages postés8Date d'inscriptionmercredi 11 janvier 2006StatutMembreDernière intervention 5 juin 2008 5 juin 2008 à 09:39
Salut
Tout d'abord connaissez vous le format d'un fichier Bitmap? Si ce n'est pas le cas il faut allez regarder chez microsoft (MSDN) ou encore dans l'aide du compilateur C que vous utilisez.
En gros une bitmap peut avoir plusieurs formats au niveau du codage des couleurs cela va de 1bit par couleur pour les images monochromes à 24 bit par couleur pour les images dites DIB (device independant bitmap) .
La première tache est de pouvoir charger n'importe quel type de bitmap.
Ensuite une bonne méthode pour la transformer en niveau de gris consiste à calculer la valeur moyenne des trois composantes couleur de chaque pixel.
Ensuite il n'y a plus qu'à sauver le bitmap ainsi transformé.
Il y a des jours ou je maudit franchement micosoft
Cordialement Rémi