OpenCV : Librairie C++ de gestion vidéo & webcam

Par Yohann CIURLIK le 29 novembre 2007, 22:11

calib thumb OpenCV : Librairie C++ de gestion vidéo & webcamPour un projet en SDL, j’ai eu besoin d’utiliser la webcam pour faire de l’acquisition. L’idée était au départ de créer un jeu piloté via la webcam (à la manière de EyeToy sur Playstation).

J’ai commencé par utiliser le driver Cap de Windows via cette classe de gestion de webcam :

Fichier Webcam.

// WebCam.cpp: implementation of the WebCam class.
//
//////////////////////////////////////////////////////////////////////

#include "WebCam.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

WebCam::WebCam()
{
	//Créé une surface sur laquel on va pouvoir mettre l'image charger depuis la cam
	image = SDL_CreateRGBSurface(SDL_SWSURFACE, 320, 240, 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF);
	if ( image == NULL ) {					fprintf(stderr, "Impossible de creer la surface de la classe WebCam: %s\n", SDL_GetError());
    }
}

WebCam::~WebCam()
{

}

bool WebCam::Connect()
{
	//Récupère le Hwnd et le HDC de la fenètre SDL
	SDL_SysWMinfo wmInfo;
	SDL_VERSION(&wmInfo.version);
	SDL_GetWMInfo(&wmInfo);
	WebCam::hWnd = wmInfo.window;
	WebCam::hDC = GetDC(WebCam::hWnd);

	//Connection a la webcam
	hWnd_WC = capCreateCaptureWindow("WebCam", WS_CHILD, 0, 0, 1, 1, hWnd, 0);	

	//Vérifie la connection
	if(!capDriverConnect(hWnd_WC, 0))
	{
		MessageBox(NULL, "Erreur lors de l'initialisation de la WebCam.\nReportez-vous à l'aide pour plus d'information.", "Erreur", MB_ICONERROR);
		return FALSE;
	}

	//trouve le HDC associé a la cam
	hDC_WC = GetDC(hWnd_WC);
	return TRUE;
}

void WebCam::StopConnect()
{
	//Déconnect
	capDriverDisconnect(hWnd_WC);
}

void WebCam::GetImage_Init()
{
	BITMAPINFO bmpinfo;

//	capDlgVideoDisplay( hWnd_WC );
//	capDlgVideoFormat ( hWnd_WC );
//	capDlgVideoSource ( hWnd_WC );

	//Modifie les infos de la cam, et initialise la cam pour récuperer des image 320*240
	capGetVideoFormat(hWnd_WC, &bmpinfo, sizeof(BITMAPINFO));

	bmpinfo.bmiHeader.biSize	= sizeof(BITMAPINFOHEADER);
	bmpinfo.bmiHeader.biWidth	= 320;
	bmpinfo.bmiHeader.biHeight	= 240;
	if(!capSetVideoFormat(hWnd_WC, &bmpinfo, sizeof(BITMAPINFO)))
	{
		printf("erreur durant le setvideoformat\n");
	}

	//Définni la fonction de Callback en cas de nouvelle image
	capSetCallbackOnFrame(hWnd_WC, Main_CallBack);
}

void WebCam::GetImage()
{
	//Charge une image
	capCaptureSingleFrameOpen(hWnd_WC);
	capCaptureSingleFrame(hWnd_WC);
	capCaptureSingleFrameClose(hWnd_WC);
}

void WebCam::CallBack(HWND hWnd, LPVIDEOHDR lpVHdr)
{
	//Copie le buffer de la cam ds une surface SDL
	SDL_LockSurface(WebCam::image);
	for(unsigned int i=0;idwBufferLength/3;i++)
	{
		putpixel(WebCam::image,  319-i%320,	239-i/320,	SDL_MapRGB(WebCam::image->format, lpVHdr->lpData[i*3]+2, lpVHdr->lpData[i*3+1] , lpVHdr->lpData[i*3]));
	}
	SDL_UnlockSurface(WebCam::image);
}

fichier Webcam.h

// WebCam.h: interface for the WebCam class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_WEBCAM_H)
#define AFX_WEBCAM_H

	#include 
	#include 
	#include 

	#include 

	#include "main.h"

	class WebCam
	{
	public:
		WebCam();
		virtual ~WebCam();

		bool WebCam::Connect();
		void WebCam::StopConnect();
		void WebCam::GetImage();
		void WebCam::GetImage_Init();
		void WebCam::CallBack(HWND hWnd, LPVIDEOHDR lpVHdr);

		HWND	hWnd;
		HWND	hWnd_WC;
		HDC		hDC;
		HDC		hDC_WC;

		SDL_Surface *image;
	};

#endif

Puis j’ai trouvé la solution miracle !Une librairie complète permettant de gérer les flux vidéos et le traitement : OpenCV.

Cette librairie open-source permet de gérer des flux de tout type et permet de faire de la motion capture ou de la reconnaissance faciale aisément. Elle fait bien plus (gestion colorimétrique, luminosité, contraste, perspective, triangulation, détection de contours, …).

Quelques liens :

Screenshot d’un test de reconnaissance faciale avec une webcam de mauvaise qualité :

 OpenCV : Librairie C++ de gestion vidéo & webcam

Cet article vous a plu ? Abonnez-vous au blog par mail ou flux RSS : vous recevrez automatiquement les nouveaux billets !


5 Commentaires


1
aimenvir123 juin 2009 à 15:53

salut yohann jai un petit question moi je travaille sur un sujet «  »CORBA » le but et de cree un client et un serveur lié a une webcam et a chaque fois le client se connecte et il demande la phtos alors ta pas une idée pour realisé sa et est ce que ton codes peut me servir pour le realisé merci


2

[...] utilise la librairie multimédia SDL disponible ici et la librairie OpenCv d’acquisition et traitement d’images dont j’avais parlé dans un précédent [...]


3
Vinz17 mars 2010 à 16:16

Salut aimenvir, si ca t'intéresse on a fait un tuto sur OpenCV qui récupère une vidéo mais tu peux juste catcher une image via la webcam / caméra :-) http://www.geckogeek.fr/lire-le-flux-dune-webcam-…. A+ ! :)


4
Vinz17 mars 2010 à 16:16

Salut aimenvir, si ca t'intéresse on a fait un tuto sur OpenCV qui récupère une vidéo mais tu peux juste catcher une image via la webcam / caméra :-) http://www.geckogeek.fr/lire-le-flux-dune-webcam-…. A+ ! :)


5
Vinz17 mars 2010 à 16:16

Oups désolé le lien s'est créé automatiquement : http://www.geckogeek.fr/lire-le-flux-dune-webcam-… .

Laissez un commentaire

Votre commentaire

inicio