cs_Crepuscule3
Messages postés24Date d'inscriptionsamedi 13 octobre 2007StatutMembreDernière intervention25 novembre 2008
-
4 déc. 2007 à 19:16
SebLinck
Messages postés212Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention23 juin 2011
-
6 août 2008 à 11:35
Bonjour à tous,
je travaille sur un projet d'acquisition vidéo depuis une camera IP emettant un flux vidéo MJPEG. J'arrive à acquérir ma vidéo mais maintenant je souhaiterais faire un traitement vidéo (détection de contours).
J'ai fais un bout de programme, il se compile correctement sous visual studio pro 2005, j'arrive à le débugger... Je génère une fenêtre windows dans laquelle je peux normalement visualiser la vidéo mais quand je clique sur "play", ça plante et me met une erreur.
Voici mon bout de programme:
void
CMJPEGunicastDlg::OnPlayLive()
{
VARIANT Tampon;
VARIANT vDataType;
VARIANT vType;
SAFEARRAYBOUND bounds;
long LongueurTampon = 0;
unsignedchar TabPix[640*3][480];
int x, y;
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(0, &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(Tampon.parray, &pDest);
BYTE *buffer = new BYTE[LongueurTampon];
memcpy(buffer,(BYTE*) pDest, LongueurTampon);
constint bpp = 3;
int offset = 0;
for (x=0; x<48; x++)
{
for (y=0; x<(64); x++)
{
//offset = ((y*640) +x)*bpp;
TabPix[x][y] = buffer[((y*64) +x)*bpp];
//R = buffer[offset + 0];
//G = buffer[offset + 1];
//B = buffer[offset + 2];
}
}
SafeArrayUnaccessData(Tampon.parray);
delete [] buffer;
m_AMC.Play();
}
catch (COleDispatchException *e)
{
if (e->m_scError == E_INVALIDARG)
{
MessageBox("Invalid parameters.");
}
elseif (e->m_scError == E_ACCESSDENIED)
{
MessageBox("Access denied.");
}
else
{
MessageBox("Failure.");
}
}
}
Le programme plante à la ligne:
SafeArrayAccessData(Tampon.parray, &pDest);
Je ne suis pas sûr mais il semblerait que l'on arrive pas à lire les élements de Tampon.parray.
Est-ce que quelqu'un saurait m'expliquer ce qui se passe?
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 6 déc. 2007 à 11:47
Salut,
Des variables non utilisées tu ne déclarera pas.
A quoi sert ton vDataType ?
A quoi sert ton vType ?
Vu que bounds ne te sert que pour vDataType, tu peux le virer aussi.
Tu récupère un pointeur sur ton "tableau" avec SafeArrayAccessData.
Puis tu le recopies dans buffer.
Puis tu le recopies dans TabPix.
Tu à l'air de penser que tu manipule un tableau de 640 * 480 * 3 octets = 921600 octets.
Recopier 921600 octets, ça prend du temps non négligeable, même sur un pentium cinquante douze.
Autant memcopy est vaguement optimisé (Va certaiment copier le tableau
32 bits par 32 bits), autant ta deuxième recopie doit prendre au bas
mot 4 ou cinqs front d'horloges processeurs par octets (Copie RAM ->
registre, registre -> RAM, calculs des offsets, saut de boucle...)
Tout ça juste pour du vent.
T'embête pas à faire des copies !
Dans ton MP, tu me dis "Lorsque j'ai mis l'argument à 0 elle m'a fait
un jpeg et lorsque j'ai mis à 1, c'était un bitmap". Là tu as mis 0.
Une Bitmap, c'est pas un bête tableau de pixels. Si tu ouvre une bitmap
avec le bloc note, tu vas contater que les deux premiers caractères
sont BM. Ces deux caractère font partie de l'entête du fichier bitmap.
Les fichiers bitmaps ont une succession d'entêtes avant les pixels (Qui
précisent la taille de la bitmap, sont type de compression, son nombre
de bytes par pixels...), et ont parfois aussi une pallette.
Je suis pas devin et je sais pas si GetCurrentImage renvoie une bitmap
ou un tableau de pixel... Je te mets simplement en garde que tu devrais
t'assurer de ce qu'elle te renvoies (D'où l'utilité du source de
mon MP).
Concernant ton erreur, tu devrais vérifier que GetCurrentImage te renvoie bien un tableau, et pas un VARIANT ne contenant rien.
m_AMC.GetCurrentImage(0 ou 1, &Tampon, &LongueurTampon);
if ((Tampon.vt & VT_ARRAY) != VT_ARRAY)
MessageBox("Echec de la récupération de l'image");
<hr size="2" width="100%" />3ème année en ecole d'ingé d'info cherche stage de 4 mois à partir du 01/04/08