【问题标题】:Programmatically grab screenshots in OSX and convert to OpenCV Mat以编程方式在 OSX 中抓取屏幕截图并转换为 OpenCV Mat
【发布时间】:2020-05-26 14:21:34
【问题描述】:

我正在尝试捕获 Mac OS X 显示屏幕并将其转换为 C++ 中的 OpenCV Mat

我写了以下代码:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <unistd.h>
#include <stdio.h>
#include <ApplicationServices/ApplicationServices.h>

using namespace std;
using namespace cv;

int main (int argc, char * const argv[])
{
    size_t width = CGDisplayPixelsWide(CGMainDisplayID());
    size_t height = CGDisplayPixelsHigh(CGMainDisplayID());

    Mat im(cv::Size(width,height), CV_8UC4);
    Mat bgrim(cv::Size(width,height), CV_8UC3);
    Mat resizedim(cv::Size(width,height), CV_8UC3);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef contextRef = CGBitmapContextCreate(
                                                    im.data, im.cols, im.rows,
                                                    8, im.step[0],
                                                    colorSpace,    kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);

    while (true)
    {
        CGImageRef imageRef = CGDisplayCreateImage(CGMainDisplayID());
        CGContextDrawImage(contextRef,
                           CGRectMake(0, 0, width, height),
                           imageRef);
        cvtColor(im, bgrim, CV_RGBA2BGR);
        resize(bgrim, resizedim,cv::Size(),0.5,0.5);
        imshow("test", resizedim);
        cvWaitKey(10);
        CGImageRelease(imageRef);
    }

//    CGContextRelease(contextRef);
//    CGColorSpaceRelease(colorSpace);

    return 0;
}

然后,结果就在这里了。

我原以为会捕获我当前的实际显示,但实际上只捕获了背面壁纸。

你知道有什么解决办法吗?
如果您能回复我,我将不胜感激。

【问题讨论】:

    标签: c++ macos opencv screenshot


    【解决方案1】:

    事实证明,问题仅仅是由于 OSX catalina 的保护。 因此,只能通过向程序提供访问屏幕的权限来解决。 抱歉这个琐碎的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2013-07-31
      • 2016-03-18
      相关资源
      最近更新 更多