2 jours que je bloque sur LPVIDEOHDR

cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007 - 16 avril 2006 à 12:02
cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007 - 17 avril 2006 à 22:36
Bonjour à tous,

Celà fait deux jours que j'essaye de faire fonctionner :

void CWebCam::ChargeTable(int ID_Bmp, LPVIDEOHDR lpVHdr)
{
// Déclaration des variables
int i, j; // Bcl
BYTE R, G, B; // Recupère des infos
...
...
BYTE* pData = (BYTE*)lpVHdr->lpData;
for(i=0; i<nHeight; i++)
for(j=0; j<nWidth; j++)
{
// Récupère chaque coef du RGB
TblImage[ID_Bmp].points[i][j].R = R = pData[2];
TblImage[ID_Bmp].points[i][j].G = G = pData[1];
TblImage[ID_Bmp].points[i][j].B = B = pData[0];

// Calcul la couleur
TblImage[ID_Bmp].points[i][j].Couleur = R + 256*G + 256*256*B;

// Prochain pixel
pData = pData+3;
}
return;
}

Celà me faire une exeception car je dépasse la limité de pData.
Je m'explique :
Taille lpVHdr => 115200 octets
Taille de l'image 320*240 soit normalement 320*240*3(pixels)= 230400 octets
Donc je ne peux pas lire les 230400 octets dans pData qui lui n'en fait que 115200 octets !

La question que je me pose : Comment est organisé "lpVHdr->lpData" pour réaliser l'extraction des pixels RVB ?

Merci pour votre aide!!!

jmh

18 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 avril 2006 à 12:54
Ce qui est bizarre c'est que du coup ca nous fait du 1,5 octet par pixel...
J'ai vu d'autres exemples ou ils faisaient comme tu fais
Tu peux essayer de mettre ton image dans un HDC avec StretchDIBits, et après récupérer les pixels avec GetPixel. Par contre ce sera clairement plus long
0
cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007
16 avril 2006 à 13:24
Justement c'est ce que je veux éviter, car je retravaille l'image avant de l'afficher. Donc j'utilise la macro "OnFrame"
pour transférer l'image dans un tableau de point-pixel.
La méthode que j'utilise est une méthode courante, mais il y a un probléme avec le format des pixels.
Et pourquoi celà marche chez les autres et pas chez moi ?
jmh
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 avril 2006 à 13:28
Travailler avec un HDC ne veut pas dire l'afficher
Tu crée un dc mémoire (CreateCompatibleDC, CreateCompatibleBitmap) et ton image ne sera pas à l'écran. Au moment de l'afficher, tu fais ensuite un BitBlt du DC mémoire vers le DC écran.
0
cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007
16 avril 2006 à 13:32
Oui, c'est vrai, mais c'est du temps de traitement comme tu l'a dit, j'ai essayé cette méthode avant de passer par le callback. De plus tu ne peux pas synchroniser ton post-traitement car tu ne maitrises pas le moment ou l'image sera affichée dans DC.

jmh
0

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

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 avril 2006 à 13:47
Pourquoi je ne maitrise pas le moment ou l'image sera affichée?
0
cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007
16 avril 2006 à 13:57
parce qu'aprés avoir fait la séquence suivante :

// Rafraichissement
capPreviewRate(hWnd_WC, 15) ;

// Affiche
capPreview(hWnd_WC, TRUE) ;

l'affichage se fait de maniére automatique. C'est le progrés.

A moins que tu connaisses une astuce !

Je tiens à te remercier pour ta disponibilité.

jmh
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 avril 2006 à 14:00
Non je ne connais pas d'astuce... Mais toi aussi tu fais un traitement (même sans passer par un DC mémoire), donc tu ne maitrise rien de plus qu'avec un DC mémoire...
0
cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007
16 avril 2006 à 14:06
En fait, le callback te permet de récupérer les datas vidéo à chaque frame, et permet donc de faire le prétraitement à chaque frame, des calculs, ...

jmh
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 avril 2006 à 14:08
Oui mais qu'est ce qui te fais dire qu'avec un dc mémoire ca ne va pas marcher? Si le temps de traitement n'est pas trop long tu n'aura pas de problème
0
cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007
16 avril 2006 à 14:13
Oui, c'est vrai mais comment sais-tu qu'une nouvelle frame vient d'arriver ? Et comment te synchronises-tu avec ?

jmh
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 avril 2006 à 14:20
Je suis d'accord, mais tu devais déja avoir ce problème depuis le début. Je vois pas pourquoi le fait d'utiliser un DC mémoire va changer quelque chose
0
cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007
16 avril 2006 à 14:23
Biensur que j'avais ce probléme depuis le début, c'est pour celà, que j'utilise le callback.
Maintenant pour en revenir à ce callback et au traitement des datas, il doit bien y avoir une raison, sinon je me fait moine !

jmh
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 avril 2006 à 14:25
Désolé d'insister, mais qu'est ce qui t'empêche d'utiliser un DC mémoire dans ton callback? C'est une solution détournée que je te propose, étant donné que tu n'arrive pas à lire directement les pixels
0
cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007
16 avril 2006 à 14:30
Effectivement, celà est envisageable, je n'y avait pas pensé !
Pour le moment, je cherche la performance, si je ne trouve pas de solution, je passerai par un DC mémoire!

Merci.

jmh
0
cs_akim77 Messages postés 73 Date d'inscription lundi 12 avril 2004 Statut Membre Dernière intervention 17 septembre 2008 4
17 avril 2006 à 10:29
Es-tu sûr de la taille de ton image ?


j'avais utilisé , sans problème la portion de code suivant :

LRESULT CChildView::FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVideoHdr)
{
CVideoCapWnd theVideoCapWnd;
CAPSTATUS capStat;
theVideoCapWnd.Attach(hWnd);
if (theVideoCapWnd.GetStatus(&capStat, sizeof(CAPSTATUS))) {
UINT nWidth = capStat.uiImageWidth;
UINT nHeight = capStat.uiImageHeight;
LPBYTE lpData = lpVideoHdr->lpData;

ASSERT(lpVideoHdr->dwBytesUsed == nWidth * nHeight * 3);

BYTE Y; int index; bool init = false;
for (int i=0; i<nHeight; ++i) {
for (int j=0; j<nWidth; ++j) {
index = 3*(i*nWidth+j);
Y = floor(0.299*lpData[index+2] + 0.587*lpData[index+1] ...

ça vient de la concurence désolé !
http://www.codeproject.com/audio/featuretracking.asp

si ça peut t'aider !

Akim
0
cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007
17 avril 2006 à 15:39
Non je n'en suis pas sûr, car en pratique :
Taille lpVHdr => 115200 octets,
et en théorie :
Taille de l'image 320*240 soit normalement 320*240*3(pixels)= 230400 octets,
Poutant lpVHdr->dwBufferLength 115200 et lpVideoHdr->dwBytesUsed 115200 aussi !

Je ne sais pas ou allez chercher les pixels qui me manquent ! Un vrai casse tête.

Dans ta citation :
for (int i=0; i<nHeight; ++i) {
for (int j=0; j<nWidth; ++j) {
index = 3*(i*nWidth+j);
Y = floor(0.299*lpData[index+2] + 0.587*lpData[index+1] ...

Tu fais une conversion en YUV en partant de tes données brutes qui sont normalement en format RVB plutot BVR pour respecter l'ordre. Dans mon cas je veux juste remplir un tableau de pixel avec les données RVB, donc c'est encore plus simple.

Merci quand même.

jmh
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
17 avril 2006 à 16:16
Tu as essayé avec un DC mémoire, pour voir si au moins toutes les données sont bien présentes?
0
cs_jmhC Messages postés 108 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 10 août 2007
17 avril 2006 à 22:36
Le probléme que j'ai c'est que je n'ai pas l'intégralité des données pour composer l'image. Je pense que c'est un probléme de format d'extraction pour le convertir en RVB. Je vais faire le test en passant par le bitmap puis affichage pour comprendre.

jmh
0
Rejoignez-nous