Pour 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.c
// 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é :
5 commentaires On OpenCV : Librairie C++ de gestion vidéo & webcam
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
Rétrolien: Ponglike via webcam : SDL & OpenCv | Le blog de Yohann CIURLIK | Spawnrider.Net :: Blog ()
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 🙂
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 🙂
Oups désolé le lien s'est créé automatiquement : http://www.geckogeek.fr/lire-le-flux-dune-webcam-… .
Barre latérale coulissante
A propos de moi
Spawnrider.Net, le blog de Yohann Ciurlik, blogueur high-tech, architecte solutions, fan d'innovation, photographe enthousiaste mais surtout gadgetophile Par l’intermédiaire de ce blog, j’espère vous faire découvrir mes passions et mes trouvailles issues du Net.
Réseaux sociaux
Récemment
Des idées cadeaux Geek pour Noël
15 décembre 2017Utilisez le cardio-fréquencemètre de sa montre Garmin sur un compteur vélo iGPSPORT IGS50E
2 décembre 2017Activer le verrouillage dynamique sous Windows 10 avec un smartphone Bluetooth
22 novembre 2017Portainer, une interface pour gérer vos containers Docker
19 octobre 2017Suivez-moi sur Twitter
Mes Tweets