Extraction des images d'une vidéo

Signaler
Messages postés
70
Date d'inscription
mardi 7 février 2006
Statut
Membre
Dernière intervention
26 avril 2006
-
Messages postés
70
Date d'inscription
mardi 7 février 2006
Statut
Membre
Dernière intervention
26 avril 2006
-
Bonjour!!

Dans le cadre de mon projet, j'ai besoin d'extraire les images d'une vidéo, or la caméra ne le fait pas elle-même et je suis un peu perdue quant à la façon de réaliser ce travail. J'ai trouvé un code qui pourrait le faire à cette adresse "www.codeproject.com/audio/ExtractAVIFrames.asp" mais je n'arrive pas à le faire marcher. J'ai mis la fonction CreateFromPackedDIBPointer en .h et à la fin du programme principal j'ai mis, camera_capture étant mon .avi :

int main()
{
CString camera_capture;
ExtractAVIFrames(camera_capture);
return 0;
}

Je ne suis pas très forte en C donc il se peut que je fasse une grosse erreur dans l'utilisation de ce code. Je travaille avec VC++.
Pouvez-vous m'aider à résoudre ce problème svp? Merci

3 réponses

Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
8
cette fonction , que j'utilise sert à extraire une image d'un fichier vidéo AVI.
On trouve les fonctions que tu recherches dans la bibliothèque vfw (vidéo for windows). il faut lire l'aide sur les macros disponibles.
il faut que je cherche le code. en tout cas camera capture doit avoir ue valeur (un nom de fichier si tu veux que ça fonctionne.

louis14
Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
8
bon voilà le code que j'utilise ( qui vient de codeproject) et qui fonctionne

AVIFileInit();


LONG m_curframe = MCIWndGetPosition(m_Video);//ici on récupère l'image courante de la vidéo



//declaration


PAVISTREAM m_avistream = NULL;


AVISTREAMINFO m_streaminfo;


HIC m_decomp = NULL;



long m_fmtlen,
//


m_buflen;
//



long m_startframe,


m_endframe;




LPBITMAPINFOHEADER m_srcfmt = NULL;


BYTE* m_rawdata = NULL;


BYTE* m_finaldata = NULL;


PGETFRAME gapgf = NULL;



//Ouverture du fichier



long r;



if (m_avistream)


AVIStreamRelease( m_avistream ), m_avistream=NULL;


r=AVIStreamOpenFromFile( &m_avistream, m_Path,


streamtypeVIDEO, 0, OF_READ | OF_SHARE_EXCLUSIVE, 0 );


TRACE("AVIStreamOpenFromFile: %s\n", r==0 ? "OK" : "failed" );



//»ñµÃ»º³åÇøµÄ³¤¶È


r=AVIStreamFormatSize( m_avistream, 0, &m_fmtlen );


TRACE("AVIStreamFormatSize: %s\n", r==0 ? "OK" : "failed" );



int formatsize=m_fmtlen+
sizeof(RGBQUAD)*256;



if (m_srcfmt)



delete [] m_srcfmt;


m_srcfmt = (LPBITMAPINFOHEADER)
new BYTE[formatsize];


ZeroMemory( m_srcfmt, formatsize );



if (m_dstfmt)



delete [] m_dstfmt;


m_dstfmt = (LPBITMAPINFOHEADER)
new BYTE[formatsize];


ZeroMemory( m_dstfmt, formatsize );


r=AVIStreamReadFormat( m_avistream, 0,


m_srcfmt,


&m_fmtlen );

TRACE("AVIStreamReadFormat: %s\n", r==0 ? "OK" : "failed" );


TRACE(" --- %s ---\n", m_Path);


TRACE(" biSize: %d\n", m_srcfmt->biSize );


TRACE(" biWidth x biHeight: %dx%d\n", m_srcfmt->biWidth, m_srcfmt->biHeight );



if (m_srcfmt->biPlanes != 1)


TRACE(" - biPlanes: %d\n", m_srcfmt->biPlanes );


TRACE(" biBitCount: %d\n", m_srcfmt->biBitCount );


CString comp;



switch (m_srcfmt->biCompression)


{



case BI_RGB:


comp="BI_RGB";



break;



case BI_RLE8:


comp="BI_RLE8";



break;



case BI_RLE4:


comp="BI_RLE4";



break;



case BI_BITFIELDS:


comp="BI_BITFIELDS";



break;


}


TRACE(" biCompression: %s\n", comp );


TRACE(" biSizeImage: %d\n", m_srcfmt->biSizeImage );


TRACE(" ------------------\n");


memcpy( m_dstfmt, m_srcfmt, m_fmtlen );


m_startframe = AVIStreamStart( m_avistream );


TRACE("stream start: %d\n", m_startframe);


m_endframe = AVIStreamEnd( m_avistream );


TRACE("stream end: %d\n", m_endframe );


r=AVIStreamInfo( m_avistream, &m_streaminfo,
sizeof(m_streaminfo) );


TRACE("AVIStreamInfo: %s\n", r==0 ? "OK" : "failed" );


m_buflen = m_dstfmt->biSizeImage;



int finalbuflen=((m_dstfmt->biWidth+3) & ~3) * m_dstfmt->biHeight;



if (m_streaminfo.dwSuggestedBufferSize)



if ((LONG)m_streaminfo.dwSuggestedBufferSize < m_buflen)


{


TRACE("adjusting m_buflen to suggested size\n");


m_buflen = (LONG)m_streaminfo.dwSuggestedBufferSize;


}



if (m_decomp)


ICClose( m_decomp );


m_decomp = ICDecompressOpen( ICTYPE_VIDEO, m_streaminfo.fccHandler, m_srcfmt, m_dstfmt );


TRACE("ICDecompressOpen: %s\n", m_decomp ? "OK" : "failed");



if (m_rawdata)


{


TRACE("delete [] m_rawdata...\n");



delete [] m_rawdata;


}


m_rawdata =
new BYTE[m_buflen];



if (m_finaldata)


{


TRACE("delete [] m_finaldata...\n");



delete [] m_finaldata;


}


m_finaldata =
new BYTE[finalbuflen];


gapgf = AVIStreamGetFrameOpen(m_avistream, NULL);



//getframe


LPSTR lpbi = NULL;



if(m_endframe == m_curframe)


m_curframe--;


lpbi = (LPSTR)AVIStreamGetFrame(gapgf, m_curframe);


HBITMAP hbitmap = CreateBitmap((BYTE*)AVI_FindDIBBits(lpbi),(LPBITMAPINFOHEADER)lpbi);


CxImage ima;


ima.CreateFromHBITMAP(hbitmap);


CString filename;


filename.Format("%s_%d.bmp",m_genericfile,m_curframe);//ici le nom du fichier et cur_frame le numéro de l'image


ima.Save(filename, CXIMAGE_FORMAT_BMP);



//création



if (m_avistream)


AVIStreamRelease( m_avistream ), m_avistream = NULL;



if (m_decomp)


ICClose( m_decomp ), m_decomp=NULL;





if (m_srcfmt)



delete [] m_srcfmt, m_srcfmt=NULL;



if (m_dstfmt)



delete [] m_dstfmt, m_dstfmt=NULL;



if (m_rawdata)


{


TRACE("delete [] m_rawdata...\n");



delete [] m_rawdata, m_rawdata=NULL;


}



if (m_finaldata)


{


TRACE("delete [] m_finaldata..\n");



delete [] m_finaldata, m_finaldata=NULL;;


}



if (gapgf)


{


AVIStreamGetFrameClose(gapgf);


gapgf = NULL;


}


AVIFileExit();

celà doit être ta fonction

louis14
Messages postés
70
Date d'inscription
mardi 7 février 2006
Statut
Membre
Dernière intervention
26 avril 2006

Merci pour la réponse, je regarde ça!!!