利用OpenCV+WinAPI 实现快速屏幕截图

2 篇文章 0 订阅
1 篇文章 0 订阅
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
 
using namespace cv;
 
 
 
  
void Screen();
BOOL HBitmapToMat(HBITMAP& _hBmp,Mat& _mat);
HBITMAP	hBmp;
HBITMAP	hOld;
 
 
void main()
{
 
	while(1)
	{
		
		
		Mat src;
		Mat dst;
		//屏幕截图
		Screen();
		
		//类型转换
		HBitmapToMat(hBmp,src);
		
		//调整大小
		resize(src,dst,cvSize(1200,800),0,0);
		
		imshow("dst",dst);
		DeleteObject(hBmp);
		waitKey(200);//这里调节帧数  现在200ms是5帧
		
	}
	
 
}
 
//抓取当前屏幕函数
void Screen(){
	
	//创建画板
	HDC hScreen	= CreateDC("DISPLAY", NULL, NULL, NULL);
	HDC	hCompDC	= CreateCompatibleDC(hScreen);
	//取屏幕宽度和高度
	int		nWidth	= GetSystemMetrics(SM_CXSCREEN);	
	int		nHeight	= GetSystemMetrics(SM_CYSCREEN);
	//创建Bitmap对象
	hBmp	= CreateCompatibleBitmap(hScreen, nWidth, nHeight);
	hOld	= (HBITMAP)SelectObject(hCompDC, hBmp);
	BitBlt(hCompDC, 0, 0, nWidth, nHeight, hScreen, 0, 0, SRCCOPY);	
	SelectObject(hCompDC, hOld);
	//释放对象
	DeleteDC(hScreen);	
	DeleteDC(hCompDC);
	
 
	
	
}
 
 
//把HBITMAP型转成Mat型
BOOL HBitmapToMat(HBITMAP& _hBmp,Mat& _mat)
 
{
	//BITMAP操作
	BITMAP bmp;    
	GetObject(_hBmp,sizeof(BITMAP),&bmp);    
	int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8 ;   
	int depth = bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U;    
	//mat操作
	Mat v_mat;
	v_mat.create(cvSize(bmp.bmWidth,bmp.bmHeight), CV_MAKETYPE(CV_8U,nChannels));
	GetBitmapBits(_hBmp,bmp.bmHeight*bmp.bmWidth*nChannels,v_mat.data);  
	_mat=v_mat;
	return TRUE;   
}

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值