Programmation Matrice 2D image [Résolu]

Signaler
Messages postés
5
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2006
-
cs_Crepuscule3
Messages postés
24
Date d'inscription
samedi 13 octobre 2007
Statut
Membre
Dernière intervention
25 novembre 2008
-
Salut
Je dispose d'une image géante que je veux la copier dans plusieur buffer de petite taille :
voila le prtion de code :
<tt><tt>Const float tableau;
BImage<float> image1(img, inputMgr);

tableau = image1.getImage();// pixels stocker en virgule dans le tableau

w1=image1.getWidth();
h1=image1.getHeight();
const float* data = (float*)malloc(sizeof(data));
data=tableau;

</tt></tt><tt><tt>glTexSubImage2D(GL_TEXTURE_RECTANGLE_NV,0,0,0,w1/2,h1/2,
GL_LUMINANCE,GL_FLOAT,data);//permet d'envoyer l'image dans le memoire vidéo
Est ce que quelqu'un sais comment afficher cette image de grande taille en plusieur morceau ?
Je dois diviser le grand buffer data en plusieur buffer de petite taille mais je n'arrive pas à le faire correctement en codant ?
Merci infiniment
</tt></tt><tt><tt>
</tt></tt>

13 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
<tt>
<tt>malloc(sizeof(data)); <= ca me parait louche, ca fait 4 octets, c'est ce que tu veux ?
La ligne suivante me parait tout aussi louche vu la ligne précédente. A mon avis, ya un gros pb la :)

Bas deja, pour ton pb faut connaitre le nombre de byte par pixel, c'est cb ?
</tt>
</tt>
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Ton image est probablement (quasi sur) stocké ligne par ligne en
partant du haut ou du bas (ca changera rien, au pire l'image sera a
l'envers, mais ca marchera). Le pb c'est que tu veux non seulement
découper ton image, mais suivant des blocs qui ne sont pas naturel pour
le buffer. Mais ca reste simple.


Une ligne de ton image représente 4096 pixel soit 4096*3*sizeof(float). (3 pour RGB).

Si tu veux une image de 1024*1024, il te faut un buffer de 1024*1024*3*sizeof(float) OCTETS donc:

(Utilise l'allocation du C++ plutot que du C).


float * sous_image = new float[1024*1024*3*sizeof(float))];


Et donc ca te donne un buffer de la taille correct, faut maitenant le remplir. On va procéder par ligne avec la commande:

memcpy(buffer cible, buffer source, nombre d'octet a copier);

ou plus précisement

memcpy(void * target, const void * src, unsigned int octet) // ou un truc du genre


Donc on copie 1024 ligne de 1024 pixel:

On définie size_of_line pour une meilleur lisibilité: unsigned int
size_of_line = 1024*3; C'est le nombre de floatant sur une ligne de la
sous image et non le nombre d'octet. On travail en nombre de floatant
puisque le pointeur (sous_image) est définie par float * et non char *.

De meme, on définie size_of_initial_line, cad le nombre de floatant sur une ligne de l'image initiale.

Admettons que l'on est
<tt><tt>tableau de type float * qui contient l'image initiale.</tt></tt>


for (int i = 0; i < 1024 ; i++)

{

    memcpy(&sous_image[i*size_of_line], &tableau[i*size_of_initial_line], size_of_line * sizeof(float));

}


memcpy prend en 3eme argument le nombre d'octet, or comme size_of_line est le nombre de floatant...


Donc avec ca, tu copies la première image (celle de coordonnée 0,0). Tu
en as 15 autres a faire. Apres c'est juste un pb de décalage a ajouter
a &tableau[X]. Par exemple pour la deuxième image, il faut
"&tableau[i*size_of_initial_line + 1024*3]".


Bon j'ai ptet fait des erreurs, mais j'espère avoir expliqué relativement clairement le pb.
Messages postés
5
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2006

bonjour merci de ta reponse
Je debute en programmation...

Le buffer est :
4096*4096*SIZEOF(float32)= 67108864 Byte soit 64Mb

En d'autre terme mon probleme est de trouver une solution afin de
diviser ce buffer qui contient des pixel stocker en virgule flottant 32
bit RGB

en plusieur petit buffer de 1024*1024;;
SACHANT que je recupere ce buffer en const float à l'aide pointeur tableau :
<tt><tt>tableau = image1.getImage();//buffer contenant 4096*4096 float pixel
//W1 et h1 sont respectivement la largeur et le hauteur de la texture
Mes besoin d'aide c comment faire à partir de ce code pour arriver à afficher des buffert de 1024*1024
merci d'avance
</tt></tt>
Messages postés
5
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2006

Merci
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
2
Il vaut mieux utiliser std::vector, ca sera nettement plus simple.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Qu'est ce que ca simplifie ? rien à part l'allocation.
Messages postés
5
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2006

std::vector comment on peut l'utiliser dans ce cas ?
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
rien de spécial, c'est juste un tableau dont tu n'as pas a te soucier de l'initialisation

mais comme tu débutes, faut pas utiliser ce genre de truc.
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
2
std::vector simplifie la gestion dynamique de la memoire, on ne peut
pas dire que c'est rien, et dans ton new le sizeof(float) est de trop.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Mais pas pour un débutant, c'est n'importe quoi d'utiliser ca. Autant
je suis pas pour apprendre le C, mais apprendre directement le prog
avec la STL, c'est un peu n'importe quoi a mon gout. Et surtout, ca
change rien a son probleme.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Mais sinon en effet, le sizeof(float) est de trop.
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

tout a fait d'accord avec luthor, j'utilise la STL mais ne demandez pas a un débutant de l'utiliser, c'est déstabilisant et faut lire pas mal de chose pour savoir comment ça marche exactement (quand on débute on commence par le debut, la STL est a mon avis la derniere chose avec le polymorphisme et les namespaces que l'ont doit apprendre)
bonne soirée
Messages postés
24
Date d'inscription
samedi 13 octobre 2007
Statut
Membre
Dernière intervention
25 novembre 2008

Bonjour à tous,

   je sais que ce sujet date d'il y a un peu plus d'un an, mais je rencontre actuellement un problème quelque peu similaire. Je suis en 2ème année de Master orienté électronique, donc pas un pro du C++. Or, dans le cadre du projet de fin d'étude, mon groupe et moi-même avons décidé de faire du traitement vidéo en C++ (détection de contour).
   Nous utilisons une camera IP (AXIS 207MW) qui émet un flux MJPEG. Le constructeur de la camera (AXIS) nous as fournit un programme en C++ qui permet de recueillir ce flux et de le visionner en temps réel. Ce programme fonctionne très bien. Cependant, le problème que nous rencontrons est que nous avons utilisé une fonction du programme (GetCurrentImage(...)) pour mettre dans un buffer une image bitmap du flux (en temps réel). Mais, nous ne savons pas comment transformer ce buffer en tableau à deux dimensions, ce qui nous permettrait ensuite de faire notre algorythme de traitement d'image (détection de contours, déjà développé) en jouant sur les pixels et leurs couleurs R, V, B.
Après avoir suivit plusieurs pistes, voici le bout de programme que nous avons réussit à développer:

--------------------------------------------------------------------------------------------------------------------------------------------
void

CMJPEGunicastDlg::OnPlayLive()
{
VARIANT Tampon;
VARIANT vDataType;
VARIANT vType;
SAFEARRAYBOUND bounds;
long LongueurTampon = 0;
this->UpdateData();
// Set the media URL and the media type
m_AMC.SetMediaURL("http://" + m_ipText + "/axis-cgi/mjpg/video.cgi");
m_AMC.SetMediaType("mjpeg-unicast");
try
{
// Starts the download of the mjpeg stream from the Axis camera/video server
m_AMC.GetCurrentImage(1, &Tampon, &LongueurTampon);
bounds.cElements = LongueurTampon;
bounds.lLbound = 0;
vDataType.vt = VT_ARRAY |VT_UI1;
vDataType.parray = SafeArrayCreate(VT_UI1, 1, &bounds);
vType.vt = VT_ARRAY|VT_I4;
vType.intVal = 1;
void *pDest;
SafeArrayAccessData(vDataType.parray, &pDest);
BYTE *buffer = new BYTE[LongueurTampon];
memcpy(buffer,(BYTE*) pDest, LongueurTampon);
SafeArrayUnaccessData(vDataType.parray);
delete [] buffer;

m_AMC.Play();

}
--------------------------------------------------------------------------------------------------------------------------------------------

Lorsque nous compilons tout notre projet sous VC++ pro 2005, avec ce bout de code, tout marche. Nous arrivons à visionner notre flux en temps réel. Maintenant, nous aimerions pouvoir utiliser notre buffer en tant que tableau de pixels à deux dimensions, pour pouvoir visionner en temps réel les contours des objets que l'on filme.

Si quelqu'un acceptait de m'aider, je lui en serais extêmement reconnaissant.

Cordialement,

Crepuscule3