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

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

こちらを参考にしました。
画像とビデオの読み込みと書き込み — opencv v2.1 documentation
スクリーンキャプチャ【Windowsプログラミング研究所】

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


[cpp]
#include

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;
}
[/cpp]

   / ̄ ̄\ 
 /   _ノ  \ 参考先をコピペしてるだけじゃねえか 
 |    ( ●)(●)               ____
. |   ⌒(__人__)            /      \
  |     ` ⌒´ノ          /─    ─  \   いやだってね…
.  |         }  \      / (●) (●)    \ 
.  ヽ        }     \     |   (__人__)  U    |
   ヽ     ノ       \   \   ` ⌒´     _/
   /    く. \      \  ノ           \
   |     \  \    (⌒二              |
    |    |ヽ、二⌒)、      \         |  |