Comment faire pour capturer le bureau dans OpenCV (ie. transformer une image bitmap dans une Mat)?
Je veux utiliser OpenCV pour le traitement de mon bureau comme si il s'agissait d'un flux vidéo.
Je suis familier avec OpenCV.
Je ne suis pas familier avec l'API Windows.
Je me rends compte il y a d'autres façons de capturer l'écran, mais pour les besoins de ma question, j'en ai besoin pour être fait à l'aide d'OpenCV.
Voici mon (super naïve) code:
HWND hDesktopWnd;
HDC hDesktopDC;
hDesktopWnd=GetDesktopWindow();
hDesktopDC=GetDC(hDesktopWnd);
//get the height and width of the screen
int height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
int width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
//create a bitmap
HBITMAP hbDesktop = CreateCompatibleBitmap( hDesktopDC, width, height);
Mat src(height,width,CV_8UC4);
src.data = (uchar*)hbDesktop;
imshow("output",src); //fails :(
Il y a des questions similaires sur StackOverflow, mais ils sont soit pour le style ancien OpenCV, ou pour le système d'exploitation Android.
Je suis sur windows 7 64x
Opencv 2.4.3
Merci quelqu'un qui peut répondre à cette question.
- Avez-vous jetez un oeil à cette question: stackoverflow.com/questions/6999830/convert-hbitmap-to-cvmat ?
- ouais, il ne peut pas comprendre, soit
- Super~! Juste une chose, je pense que vous pourriez aussi avoir besoin de DeleteObject et DeleteDC/ReleaseDC pour éviter les fuites de mémoire.
Vous devez vous connecter pour publier un commentaire.
Après BEAUCOUP d'essai et d'erreur, j'ai réussi à écrire une fonction pour le faire. ici c'est pour les personnes qui pourraient en avoir besoin:
hwnd
est la poignée de la fenêtre, mais quand il est NUL, il fait ce qu'il est censé, de retour de l'ensemble de l'écran.Une meilleure façon de le faire est de le faire alors que l'allocation de mémoire pour les pixels qu'une seule fois. donc, la seule copie faite ici est celle qui fait par BitBlt
Noter qu'aucune erreur de manipulation fait ici pour le rendre facile à comprendre, mais vous devez le faire de la gestion d'erreur dans votre code!
Espère que cette aide
GetDC(NULL)
deux fois?