Как сделать снимок части вашего рабочего стола с помощью opencv и Qt - PullRequest
0 голосов
/ 07 января 2020

Заранее спасибо за помощь. Поэтому ниже я пытаюсь создать снайперский инструмент. Я создал виджет с помощью Qt и сделал его почти прозрачным. Пользователь использует свою мышь, чтобы создать квадрат области, которую он хочет скопировать. Я могу заставить его скопировать раздел, но не раздел записи. Я использовал функцию getcursor, чтобы получить пользовательские курсоры positiona, а также конечную и начальную точки квадрата. Я установил свой виджет на размер экрана, а затем сфотографировал весь рабочий стол (используя размер окна моего виджета в качестве размера изображения), используя мою функцию void. Однако значения x, y экрана и изображений не «перекрываются», вместо того, чтобы получить то, что находится в квадрате пользователя dr aws, он получает другой квадрат на экране. Есть ли способ исправить это?

Frame_Record::Frame_Record(QWidget* parent) : QWidget(parent)
{
    //this->setStyleSheet("background-color:rgba(0,0,0,0)");

    this->setWindowState(Qt::WindowFullScreen);
    this->setWindowOpacity(0.1);
    this->setStyleSheet("QWidget{background:#000000}");
    x_size = this->size().width();
    y_size = this->size().height();
    //cv::waitKey(0);
    //setAttribute(Qt::WA_TranslucentBackground);

    /*setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
    setAttribute(Qt::WA_NoSystemBackground);
    setAttribute(Qt::WA_TranslucentBackground);
    //setAttribute(Qt::WA_PaintOnScreen);
    //setAttribute(Qt::transparent);
    setAttribute(Qt::WA_MouseNoMask,true);
    setAttribute(Qt::WA_MouseTracking,true);*/
}

void Frame_Record::mousePressEvent(QMouseEvent* events)
{
    POINT start;
    GetCursorPos(&start);
    qDebug() << "Mouse pressed PRessed";
    x_start = start.x;
    y_start = start.y;
}

void Frame_Record::mouseReleaseEvent(QMouseEvent* events)
{
    qDebug() << "Mouse unpressed";
    qDebug() << x_start;
    qDebug() << y_start;
    qDebug() << x_end;
    qDebug() << y_end;
    POINT end;
    GetCursorPos(&end);

    x_end = end.x;
    y_end = end.y;
    get_Image(y_size, x_size); //y then x   
    this->close();
}

void Frame_Record::mouseMoveEvent(QMouseEvent* events)
{
    POINT end;
    GetCursorPos(&end);

    x_end = end.x;
    y_end = end.y;
    qDebug() << "mouse is moving";
}

void Frame_Record::get_Image(int screen_w, int screen_h)
{
    HBITMAP bitmap;
    cv::Mat pic;

    HDC hdcSys = GetDC(NULL);
    HDC hdcMem = CreateCompatibleDC(hdcSys);

    void* ptrBitmapPixels;

    BITMAPINFO bInfo;
    HDC hdc{};
    ZeroMemory(&bInfo, sizeof(BITMAPINFO));
    bInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bInfo.bmiHeader.biWidth = screen_w;
    bInfo.bmiHeader.biHeight = -screen_h;
    bInfo.bmiHeader.biPlanes = 1;
    bInfo.bmiHeader.biBitCount = 32;

    bitmap = CreateDIBSection(hdc, &bInfo, DIB_RGB_COLORS, &ptrBitmapPixels, NULL, 0);
    SelectObject(hdcMem, bitmap);

    pic =cv::Mat(screen_h, screen_w, CV_8UC4, ptrBitmapPixels, 0);
    BitBlt(hdcMem, 0, 0, screen_w, screen_h, hdcSys, 0, 0, SRCCOPY);
    cv::Mat mod_pic(pic, cv::Range(x_start, x_end), cv::Range(y_start, y_end));

    // pic(cv::Rect(x_start, y_start, x_start - x_end, y_start - y_end));   
    // Mat matRef=matBitmap(Range(100,200), Range(100,200));
    //bitwise_not(matRef,matRef);

    cv::imshow("Title", mod_pic);
    cv::waitKey(0);
    cv::destroyAllWindows();
}

1 Ответ

0 голосов
/ 07 января 2020

Вы можете попробовать следующий код в Qt, чтобы вывести экран

QScreen *screen = // init screen first (application.primaryScreen();)
QRect rect = screen->geometry();
// instead you can also use your x and y coordinates
QPixmap pixmap = screen->grabWindow(0, rect .x(), rect .y(), rect .width(), rect .height());

И затем вы можете делать то, что вы хотите с QPixmap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...