2010-06-07 9 views
2

J'essaie d'écrire un programme pour jouer à un jeu PC en plein écran pour le plaisir (comme une expérience en vision par ordinateur et intelligence artificielle).Comment acquérir rapidement et traiter la sortie d'écran en temps réel

Pour cette expérience, je suppose que le jeu n'a aucune API sous-jacente pour les joueurs AI (ni la source disponible) donc j'ai l'intention de traiter les informations visuelles rendues par le jeu sur l'écran.

Le jeu fonctionne en mode plein écran sur un système win32 (direct-X je suppose).

Actuellement, je suis en utilisant les fonctions win32

#include <windows.h> 
#include <cvaux.h> 
class Screen { 
    public: 
    HWND windowHandle; 
    HDC  windowContext; 
    HBITMAP buffer; 
    HDC  bufferContext; 
    CvSize size; 
    uchar* bytes; 
    int channels; 
Screen() { 
    windowHandle = GetDesktopWindow(); 
    windowContext = GetWindowDC (windowHandle); 
    size = cvSize (GetDeviceCaps (windowContext, HORZRES), GetDeviceCaps (windowContext, VERTRES)); 
    buffer = CreateCompatibleBitmap (windowContext, size.width, size.height); 
    bufferContext = CreateCompatibleDC (windowContext); 
    SelectObject (bufferContext, buffer); 
    channels = 4; 
    bytes = new uchar[size.width * size.height * channels]; 
} 

~Screen() { 
    ReleaseDC(windowHandle, windowContext); 
    DeleteDC(bufferContext); 
    DeleteObject(buffer); 
    delete[] bytes; 
} 

void CaptureScreen (IplImage* img) { 
    BitBlt(bufferContext, 0, 0, size.width, size.height, windowContext, 0, 0, SRCCOPY); 
    int n = size.width * size.height; 
    int imgChannels = img->nChannels; 

    GetBitmapBits (buffer, n * channels, bytes); 

    uchar* src = bytes; 
    uchar* dest = (uchar*) img->imageData; 
    uchar* end = dest + n * imgChannels; 

    while (dest < end) { 
     dest[0] = src[0]; 
     dest[1] = src[1]; 
     dest[2] = src[2]; 

     dest += imgChannels; 
     src += channels; 
    } 
} 

Le taux auquel je peux traiter des trames en utilisant cette approche est beaucoup trop lent. Y a-t-il un meilleur moyen d'acquérir des cadres d'écran?

+0

pourrait vouloir ajouter 3d ou des jeux à vos balises meta –

+0

Je pensais que le problème sous-jacent était plus général que mon application spécifique (qui se trouve être un jeu isométrique RTS) – Akusete

Répondre

0

En règle générale, j'accrocherais les appels de fonction de basculement de tampon pour que je puisse capturer le framebuffer sur chaque trame.

http://easyhook.codeplex.com/