转自:http://blog.csdn.net/jia_zhengshen/article/details/9384245
#define _AFXDLL//为了方便使用mfc类
#include<afxwin.h>
#include<opencv\cv.h>
#include<opencv\highgui.h>
#include<stdio.h>
#include <stdio.h>
LPVOID screenCaptureData=NULL;
HBITMAP hBitmap;
HDC hDDC;
HDC hCDC;
int nWidth;
int nHeight;
void initGDI(){
nWidth = GetSystemMetrics(SM_CXSCREEN);//得到屏幕的分辨率的x
nHeight = GetSystemMetrics(SM_CYSCREEN);//得到屏幕分辨率的y
screenCaptureData = new char[nWidth*nHeight*4];
memset(screenCaptureData,0,nWidth);
// Get desktop DC, create a compatible dc, create a comaptible bitmap and select into compatible dc.
hDDC = GetDC( GetDesktopWindow() );//得到屏幕的dc
hCDC = CreateCompatibleDC(hDDC);//
hBitmap =CreateCompatibleBitmap(hDDC,nWidth,nHeight);//得到位图
SelectObject(hCDC,hBitmap); //好像总得这么写。
}
void gdiScreenCapture(LPVOID screenCaptureData){
BitBlt(hCDC,0,0,nWidth,nHeight,hDDC,0,0,SRCCOPY);
GetBitmapBits(hBitmap,nWidth*nHeight*4,screenCaptureData);//得到位图的数据,并存到screenCaptureData数组中。
IplImage *img = cvCreateImage(cvSize(nWidth,nHeight),8,4);//创建一个rgba格式的IplImage
memcpy(img->imageData,screenCaptureData,nWidth*nHeight*4);//这样比较浪费时间,但写的方便。这里必须得是*4,上面的链接写的是*3,这是不对的。
IplImage *img2 = cvCreateImage(cvSize(nWidth,nHeight),8,3);//创建一个bgr格式的IplImage,可以没有这个Img2这个变量。
cvCvtColor(img,img2,CV_BGRA2BGR);
cvShowImage("img",img);
cvSaveImage("rgba.jpg",img);
cvShowImage("img2",img2);//保存Image
cvSaveImage("hello.jpg",img2);
cvWaitKey();
}
//int APIENTRY _tWinMain(HINSTANCE hInstance,
// HINSTANCE hPrevInstance,
// LPTSTR lpCmdLine,
// int nCmdShow)
int main()
{
initGDI();
gdiScreenCapture(screenCaptureData);
return 0;
}
原文中的opencv版本比较早,使用了IplImage,根据需要可以改成新版中的Mat
这里的代码不够严谨,内存没有释放,等把自己的调试好后再放新的代码