Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
1 / 1 / 1
Регистрация: 23.08.2012
Сообщений: 100
1

Создание скриншота определенной области экрана

27.02.2014, 08:15. Показов 4216. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Стоит передо мной задача делать скриншоты определенной части экрана и последующая обработка их через OpenCV. Пытался нагуглить готовые примеры создания скришотов экрана, но найденные примеры отказывались компилироваться либо вываливались с кучей ошибок. Подскажите каким образом можно создавать скриншоты определенной части экрана и сохранять их в файл. Или, подойдет и такой вариант, сохранение скриншота в какой то внутренний формат, который поймет и сможет обработать OpenCV, без сохранения на жесткий диск.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.02.2014, 08:15
Ответы с готовыми решениями:

Создание нормального скриншота масштабированного экрана
Как создать скриншот масштабированного экрана? Для понимания поясню. На ноутбуках 15,6 дюймов с...

Выделение определённой области экрана
Если в кратце, то мне надо чтобы по нажатию на кнопку надо было сделать 2 клика и выделить область...

Cкриншот определенной области экрана
У меня есть код который делает скриншот экрана!!! как его переделать таким образом что бы бралось...

Очистка экрана в определенной области
есть ли такая ф-я, которая очищает экран в определенной области? например, очистить с 3 строки 4...

6
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
27.02.2014, 08:30 2
Screener
мб поможет
0
1 / 1 / 1
Регистрация: 23.08.2012
Сообщений: 100
27.02.2014, 08:44  [ТС] 3
dzrkot, там программа на Делфи. Мне бы либо примеры на С++, либо направление куда копать...
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
27.02.2014, 09:08 4
у kde есть приложение Ksnapshot, исходники открыты, у него как раз есть функция создания скриншота окна приложения, посмотрев исходники думаю можно разобраться как она это делает....
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
27.02.2014, 09:15 5
CyberGenius, посмотрите в сторону GetDC( HWND_DESKTOP ).

Добавлено через 2 минуты
Оно?
http://stackoverflow.com/quest... into-a-mat
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
27.02.2014, 11:30 6
Цитата Сообщение от CyberGenius Посмотреть сообщение
Пытался нагуглить готовые примеры создания скришотов экрана, но найденные примеры отказывались компилироваться либо вываливались с кучей ошибок.
а может стоило ошибки почитать и исправить?

Как создать скриншот части экрана?
0
1 / 1 / 1
Регистрация: 23.08.2012
Сообщений: 100
27.02.2014, 18:35  [ТС] 7
Нашел такой код. В VS2012 он успешно строится, но после запуска вылазит исключение:

C++
1
Unhandled exception at at 0x7621B727 in ConsoleApplication1.exe: Microsoft C++ exception: cv::Exception at memory location 0x0040FA3C.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include< windows.h >
#include< opencv2/opencv.hpp >
 
class Screen{
public:
    Screen(){
        // Параметры экрана
        HWND hwnd = GetDesktopWindow(); 
        hWDC = GetWindowDC( hwnd );
        width = GetSystemMetrics( SM_CXSCREEN );
        height = GetSystemMetrics( SM_CYSCREEN );
 
        // Совместимый контекст в памяти
        hScreen = CreateCompatibleDC( hWDC ); // - DeleteDC( hScreen );
        hBM = CreateCompatibleBitmap( hWDC, width, height ); // - DeleteObject( hBM );
        hBM_Temp = SelectObject( hScreen, hBM ); // - SelectObject( hScreen, hBM_Temp );
 
        // Описание рабочего массива бит совместимого контекста в памяти
        BMI.bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
        BMI.bmiHeader.biWidth = width;
        BMI.bmiHeader.biHeight = -height;
        BMI.bmiHeader.biPlanes = 1;
        BMI.bmiHeader.biBitCount = 24;
        BMI.bmiHeader.biCompression = BI_RGB;
 
        // Массив данных скриншота
        const int colorSize = 3; // Размер пикселя
        const int alignment = 4; // Выравнивание строки        
        int step = ( int )ceil( width * colorSize / ( double )alignment ) * alignment; // Шаг строки
        //int step = ( width * colorSize / alignment + ( width * colorSize % alignment? 1: 0 ) ) * alignment; // Шаг строки
        data = new char[ step * height ]; // - delete[] data;
 
        // Скриншот
        screen = new cv::Mat( height, width, CV_8UC3, data, step ); // - delete screen;
    };
 
    ~Screen(){
        SelectObject( hScreen, hBM_Temp );
        DeleteObject( hBM );
        DeleteDC( hScreen );
        delete screen; screen = NULL;
        delete[] data; data = NULL;
    };
 
    cv::Mat& get(){
        BitBlt( hScreen, 0, 0, width, height, hWDC, 0, 0, SRCCOPY );
        GetDIBits( hScreen, hBM, 0, height, data, &BMI, DIB_RGB_COLORS );
        return *screen;
    };
 
private:
    HDC hWDC; // Контекст экрана
    HDC hScreen; // Совместимый с экраном контекст в памяти
    HBITMAP hBM; // Рабочий массив бит совместимого контекста в памяти
    BITMAPINFO BMI; // Описание рабочего массива бит совместимого контекста в памяти
 
    int width; // Ширина экрана в пикселях
    int height; // Высота экрана в пикселях
 
    char* data; // Массив данных скриншота
    cv::Mat* screen; // Скриншот
 
    HGDIOBJ hBM_Temp; // Массив бит совместимого контекста в памяти созданный по умолчанию 
};
 
int main(){
    Screen sh;
    cv::Mat screen = sh.get();
    cv::imwrite( "D:\\snapshot.png", screen );
    return 0;
}
При этом ошибка перестает появляться, если закомментировать строку
C++
1
cv::imwrite( "D:\\snapshot.png", screen );
0
27.02.2014, 18:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2014, 18:35
Помогаю со студенческими работами здесь

Распознание текста в определённой области экрана
Помогите пожалуйста с написанием программы. по распознованию текста в определённой области экрана...

Отлов цвета в определенной области экрана
Всем доброго времени суток. На сколько сложно реализовать такой механизм? Хочется автоматизировать...

Создание таблицы-контейнера из определенной области формы
Пишу компонент который может держать в себе другие и в runtime режиме может менять размеры...

Получение скриншота экрана
Привет всем! Пытаюсь получить скриншот экрана: QDesktopWidget *desktop =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru