c++ - 在 cv::Mat 中捕获部分屏幕

标签 c++ opencv

我尝试捕捉屏幕的一部分并将其放入 cv::Mat 中,输出是相同的颜色(当我捕捉到白色背景时它是白色的,当我捕捉到灰色时它是灰色的所以你可以理解它在某种程度上确实起作用了)但是图像是模糊的、对齐的和重复的(它重复相同的像素)。

例如,在我的 Chrome 浏览器中写下这个问题时,我尝试了该程序,结果是: fuzzy output

您可以识别浏览器(URL 栏、文本框和按钮等。但图像本身远非准确甚至接近,并且像素在不应该重复的时候重复(url 栏重复本身、文本框等)。

this中的代码问题没有在我的机器上编译。但是我知道我使用的代码(不是 OpenCV 部分)可以在我的机器上运行(我已经用它来捕获我的屏幕并且当我用 libpng 保存它时它运行得很好)。

我的代码如下(这里没有声明的变量在别处声明了,哪个值是正确的,我查了一下,比如x, w, h 等):

    HDC hdcSource = GetDC(NULL);
    HDC hdcMemory = CreateCompatibleDC(hdcSource);
    HBITMAP hBitmap = CreateCompatibleBitmap(hdcSource, w, h);
    HBITMAP hBitmapOld = (HBITMAP)SelectObject(hdcMemory, hBitmap);
    BITMAPINFOHEADER bmi = { 0 };
    bmi.biSize = sizeof(BITMAPINFOHEADER);
    bmi.biPlanes = 1;
    bmi.biBitCount = 24;

    bmi.biWidth = w;
    bmi.biHeight = -h;
    bmi.biCompression = BI_RGB;

    bmi.biSizeImage = ((bmi.biWidth * bmi.biBitCount + 31) & ~31) / 8 * bmi.biHeight<0 ? -bmi.biHeight : bmi.biHeight;
    bmi.biXPelsPerMeter = 0;
    bmi.biYPelsPerMeter = 0;
    bmi.biClrImportant = 0;
    bmi.biClrUsed = 256;

    if (!(BitBlt(hdcMemory, 0, 0, w, h, hdcSource, p1.x, p1.y, SRCCOPY)))
    {
        exit(1);
    }
    hBitmap = (HBITMAP)SelectObject(hdcMemory, hBitmapOld);
    if (!hBitmap)
    {
        exit(1);
    }

    my_pic.create(h, w, CV_8UC4);

    //StretchBlt(hdcSource, 0, 0, w, h, GetDC(NULL), 0, 0, w, h, SRCCOPY); //This line is what I saw in the other question but it didn't help

    if (!(GetDIBits(hdcSource, hBitmap, 0, h, my_pic.data, (BITMAPINFO*)&bmi, DIB_RGB_COLORS)))
    {
        exit(1);
    }
    DeleteDC(hdcSource);
    DeleteDC(hdcMemory);

最佳答案

您的位图像素采用 RGB 格式,但您试图使其适合 CV_8UC4(四 channel )矩阵。尝试使用 CV_8UC3 矩阵类型。

关于c++ - 在 cv::Mat 中捕获部分屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34420464/

相关文章:

c++ - 移动构造函数应该采用 const 还是非 const 右值引用?

c++ - 为什么动态链接的二进制文件显示硬编码的 SO 名称?

c++ - google style guide on interface class的问题

android - 什么在 Android 上表现更好?使用 Java 或 C++ 编写的应用程序

c++ - 在 C++ 中使用 while 循环查找一组数字中的最小值的程序

使用特征检测器的 OpenCV 运动跟踪

python - FindContours 仅支持 8uC1 和 32sC1 图像

c++ - 如何正确地将freetype位图缓冲区转换为opencv Mat?

python - 将 OpenCV 与 Tkinter 结合使用

c++ - OpenCV 前景检测速度慢