Программно получить скриншоты в OSX и конвертировать в OpenCV Mat - PullRequest
2 голосов
/ 11 февраля 2020

Я пытаюсь захватить экран дисплея Ma c OS X и преобразовать его в OpenCV Mat в C ++.

Я написал следующий код:

#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;
}

и затем, результат здесь.

result

Я ожидал, что мое текущее текущее отображение будет снято, но фактически были сняты только задние обои.

Вы знаете какое-нибудь решение?
Буду признателен, если вы ответите мне.

1 Ответ

0 голосов
/ 13 февраля 2020

Оказалось, что проблема была просто из-за защиты OSX каталиной. Таким образом, это должно быть решено только путем предоставления программе доступа к экрану. Извините за этот тривиальный вопрос.

...