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;
}