21xrx.com
2025-06-22 10:21:46 Sunday
登录
文章检索 我的文章 写文章
使用C++和OpenCV截取窗口图片
2023-10-15 15:01:50 深夜i     43     0
C++ OpenCV 截取 窗口图片

在计算机视觉领域,OpenCV是一个被广泛使用的开源计算机视觉库。它提供了一系列的函数和算法,用于处理图像和视频。在本文中,我们将介绍如何使用C++和OpenCV来截取窗口图片。

首先,我们需要安装OpenCV库。可以从OpenCV的官方网站下载并安装适合自己操作系统的版本。安装完成后,我们可以开始编写代码。

在C++中,我们使用OpenCV的Highgui模块来实现窗口图片的截取。首先,我们需要包含OpenCV的头文件,并使用cv和cv::imshow命名空间。然后,我们使用cv::namedWindow函数来创建一个窗口,并给窗口命名。

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
  namedWindow("MyWindow");
  while (1)
  {
    imshow("MyWindow", ...);
  }
  destroyWindow("MyWindow");
  return 0;
}

接下来,在while循环中,我们可以使用cv::imshow函数来显示窗口。对于截取窗口图像的关键步骤如下所示:

HDC hwindowDC, hwindowCompatibleDC;
int height, width, srcheight, srcwidth;
HBITMAP hbwindow;
BITMAPINFOHEADER bi;
Mat src;
HWND hwnd = FindWindow(nullptr, "MyWindow");
hwindowDC = GetDC(hwnd);
hwindowCompatibleDC = CreateCompatibleDC(hwindowDC);
SetStretchBltMode(hwindowCompatibleDC, COLORONCOLOR);
RECT windowsize;  //用来存储窗口的坐标和尺寸
GetClientRect(hwnd, &windowsize);
srcheight = windowsize.bottom - windowsize.top;
srcwidth = windowsize.right - windowsize.left;
height = windowsize.bottom / SCALE;  //调整截图的尺寸
width = windowsize.right / SCALE;
src.create(height, width, CV_8UC4);
//创建一个与指定设备兼容的位图
//选择一个位图,将对象与选择的位图保持一致。
hbwindow = CreateCompatibleBitmap(hwindowDC, width, height);
bi.biSize = sizeof(BITMAPINFOHEADER);  //指定位图信息头的结构大小
bi.biWidth = width;  //指定位图的宽度以像素为单位。
bi.biHeight = -height;  //指定位图的高度以像素为单位。如果位图为顶部向下,则此值必须为正数;如果是从底部向上,则此值必须为负数。
bi.biPlanes = 1;  //指定目标设备的平面数
bi.biBitCount = 32;  //指定每个像素的位数。
bi.biCompression = BI_RGB;  //指定位图的压缩类型
bi.biSizeImage = 0;  //指定复制到位图的数据的大小
bi.biXPelsPerMeter = 0;  //指定目标设备每米的水平像素数
bi.biYPelsPerMeter = 0;  //指定目标设备每米的垂直像素数。此值用于设备的映射模式,ESCAPE组合验证方法,使用以米为单位的源和目标点,和METAFILE驱动程序使用此值来映射米到设备单位。设备的水平和垂直分辨率可以有不同的值。
bi.biClrUsed = 0;  //指定位图实际使用的颜色索引数。0表示应使用所选调色板的最大颜色数。
bi.biClrImportant = 0;  //指定所选调色板中重要的颜色索引数,优先级高于biClrUsed。
//使用指定的位图信息和颜色表将颜色数据从指定的装置独立位图中复制到DIB中。
SelectObject(hwindowCompatibleDC, hbwindow);  
//复制位图
StretchBlt(hwindowCompatibleDC, 0, 0, width, height, hwindowDC, 0, 0, srcwidth, srcheight, SRCCOPY); 
GetDIBits(hwindowCompatibleDC, hbwindow, 0, height, src.data, (BITMAPINFO*)&bi, DIB_RGB_COLORS); 
cvtColor(src, src, COLOR_BGRA2BGR);  //从BGRA转换为BGR格式
imshow("MyWindow", src);
//释放设备描述表(DC)资源
DeleteObject(hbwindow);
DeleteDC(hwindowCompatibleDC);
ReleaseDC(hwnd, hwindowDC);

在以上代码中,我们使用Windows API函数来获得与窗口相关的设备描述表(Device Context, DC)以及该窗口的相关信息。然后,我们使用这些信息创建一个位图,并将窗口截图复制到位图中。

最后,我们使用OpenCV的cvtColor函数将BGRA格式的图像转换为BGR格式,并使用cv::imshow函数将图像显示在窗口中。截取完成后,我们可以使用cv::imwrite函数将图像保存到本地磁盘。

希望本文对你在使用C++和OpenCV截取窗口图片方面有所帮助。使用OpenCV,我们可以轻松处理图像和视频,并实现各种功能。如果你想进一步了解OpenCV的功能和用法,请参考OpenCV的官方文档。

  
  

评论区