windows api+opencv实现动态截屏并显示
2018-02-01 18:37
567 查看
先上效果
![](https://img-blog.csdn.net/20180201182842674?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTg5ODQxNTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
下面是实现代码
#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;
}声明:转载请声明出处,本人入门级菜鸟,有问题大佬多多指教:QQ941131649
下面是实现代码
#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;
}声明:转载请声明出处,本人入门级菜鸟,有问题大佬多多指教:QQ941131649
相关文章推荐
- 谈一谈分别利用opencv、Qt、matlab动态显示图片的实现
- 使用Visifire+ArcGIS API for Silverlight实现Graphic信息的动态图表显示
- 用VC实现动态改变Windows的显示特性
- 使用Visifire+ArcGIS API for Silverlight实现Graphic信息的动态图表显示
- 使用Visifire+ArcGIS API for Silverlight实现Graphic信息的动态图表显示
- ArcGIS.Server.9.3和ArcGIS API for Flex实现动态图层和瓦片图层叠加显示(二)
- 使用Visifire+ArcGIS API for Silverlight实现Graphic信息的动态图表显示
- ArcGIS.Server.9.3和ArcGIS API for Flex实现动态图层和瓦片图层叠加显示(二)
- 用VC实现动态改变Windows的显示特性
- ArcGIS.Server.9.3和ArcGIS API for Flex实现动态图层和瓦片图层叠加显示(二)
- 使用Visifire+ArcGIS API for Silverlight实现Graphic信息的动态图表显示
- [转]ArcGIS.Server.9.3和ArcGIS API for Flex实现动态图层和瓦片图层叠加显示(二)
- 使用mongodb实现首页的动态显示
- 如何通过动态生成Html灵活实现DataGrid分类统计的界面显示功能
- JS实现动态显示当前时间(12/24小时制)
- 基于javascript实现动态显示当前系统时间
- 用JSP+Servlet实现二进制图像的动态显示-JSP教程,Java技巧及代码
- Android 实现点击 动态全屏显示
- 纯JS实现动态时间显示代码
- windows笔记-API实现透明窗体