【问题标题】:Capturing part of the screen in cv::Mat在 cv::Mat 中捕获部分屏幕
【发布时间】:2016-03-28 23:46:14
【问题描述】:

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

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

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

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

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

    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);

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    您有位图像素的 RGB 格式,但您试图将其拟合到 CV_8UC4(四通道)矩阵。尝试使用 CV_8UC3 矩阵类型。

    【讨论】:

    • 完美!非常感谢,我不敢相信我没有注意到它。不知何故,当我经常调用它时,由于某种原因,例如here,它是对齐的,但大多数时候(在我让计算机“休息”几秒钟而不执行代码之后)它可能会出现预计像this 一样连续执行几次(比如5次)。知道为什么会这样吗?我认为唯一可以改变的可能是结束记忆,但这将如何影响图片并使其对齐?有什么想法吗?
    • Opencv 使用对齐方式,因此您需要对齐内存中的行。在网上看有很多实现。垫到位图转换器。
    猜你喜欢
    • 2016-02-13
    • 1970-01-01
    • 2012-05-24
    • 2020-10-28
    • 2018-06-10
    • 2011-12-16
    • 2012-05-16
    • 2012-04-19
    • 1970-01-01
    相关资源
    最近更新 更多