class.exe

blog.netaka.net

OpenCVでスクリーンショット(Windows)

1/7/2011

この記事を書いてから12年が経っています。内容が古いかもしれません。

スクリーンショット(Windows)
スクリーンショット(Windows)

OpenCVでデスクトップの画像を扱う方法です。前回のWindows版です。OpenCVのバージョンは前回と同じく2.2です。適切なライブラリを指定してください。

こちらを参考にしました。

うまくいけば、画像のようになるはずです。ソースコードは以下から。

#include <opencv2/opencv.hpp>

int main (int argc, char * const argv[])
{
    /* デスクトップのサイズ */
    HWND desktop = GetDesktopWindow();
    RECT rect;
    GetWindowRect(desktop, &rect);
    int width = rect.right;
    int height = rect.bottom;

    /* RGB用と反転用とリサイズ用のIplImageの作成 */
    IplImage *iplimage = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, 3);
    IplImage *flipimage = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
    IplImage *resizeimage = cvCreateImage(cvSize(width/2, height/2), IPL_DEPTH_8U, 3);

    /* DIBの情報を設定する */
    BITMAPINFO bmpInfo;
    bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpInfo.bmiHeader.biWidth = width;
    bmpInfo.bmiHeader.biHeight = height;
    bmpInfo.bmiHeader.biPlanes = 1;
    bmpInfo.bmiHeader.biBitCount = 24;
    bmpInfo.bmiHeader.biCompression = BI_RGB;

    /* DIBSection作成 */
    LPDWORD lpPixel;
    HDC hDC = GetDC(desktop);
    HBITMAP hBitmap = CreateDIBSection(hDC, &bmpInfo, DIB_RGB_COLORS, (void**)&lpPixel, NULL, 0);
    HDC hMemDC = CreateCompatibleDC(hDC);
    SelectObject(hMemDC, hBitmap);

    /* IplImageヘッダにデータをセット */
    iplimage->imageData = (char *)lpPixel;

    /* ウィンドウ */
    cv::namedWindow("Screenshot", CV_WINDOW_AUTOSIZE);

    while (true)
    {
        /* デスクトップから取得 */
        BitBlt(hMemDC, 0, 0, width, height, hDC, 0, 0, SRCCOPY);

        /* 上下反転して,リサイズ */
        cvFlip(iplimage, flipimage);
        cvResize(flipimage, resizeimage);

        /* ウィンドウへ表示 */
        cv::imshow("Screenshot", resizeimage);
        if(cv::waitKey(30) >= 0) break;
    }

    /* 解放 */
    cvReleaseImageHeader(&iplimage);
    cvReleaseImage(&flipimage);
    cvReleaseImage(&resizeimage);
    ReleaseDC(desktop, hDC);
    DeleteDC(hMemDC);
    DeleteObject(hBitmap);

    return 0;
}