Мультимедийное Программирование OpenCV бесплатное чтение

Мультимедийное программирование

Рис.0 Мультимедийное Программирование OpenCV

07.15.2019

Профессор: Orazdurdyyev Serdar Begnarlyevich

Внедрение цифровой обработки изображений / Introduction of Digital Image Processing

Выборка и квантование / Sampling and Quantization

Рис.15 Мультимедийное Программирование OpenCV

Continuous Tone Image – Непрерывное тональное изображение

Sampled Image – Пример изображения

Sampled and Quandtized Image – Выборочное и квантованное изображение

Sampler – образец

Quantizer – Квантизатор

Аналого-цифровое преобразование / Analog to Digital Conversion

Рис.32 Мультимедийное Программирование OpenCV

(a) Analog Signal – Аналоговый сигнал

(b) Sampling – Выборка

(c) Quantization – Квантование

(d) Coding – Кодирование

TS: Sampling Period – Период выборки

Происхождение изображения / Image Origin

Upper-left corner of i – Левый верхний угол изображения

Pixels – Пиксели

Lines – Линии

Рис.47 Мультимедийное Программирование OpenCV

Изменение яркости изображения / Image Brightness Variation

Рис.62 Мультимедийное Программирование OpenCV
Рис.76 Мультимедийное Программирование OpenCV

Brightness – Яркость

Distance – Расстояние

Шаги яркости изображения / Image Brightness Steps

Рис.10 Мультимедийное Программирование OpenCV
Рис.26 Мультимедийное Программирование OpenCV

(a) 8 Steps : 3 bits (b) 16 Steps : 4 bits

(а) 8 шагов: 3 бита (б) 16 шагов: 4 бита

Рис.42 Мультимедийное Программирование OpenCV
Рис.68 Мультимедийное Программирование OpenCV

(c) 32 Steps : 5 bits (d) 64 Steps : 6 bits

(c) 32 шагов: 5 бит (d) 64 шагов: 6 бит

Рис.27 Мультимедийное Программирование OpenCV
Рис.43 Мультимедийное Программирование OpenCV

(e) 128 Steps : 7 bits (f) 256 Steps : 8 bits

(e) 128 шагов: 7 бит (f) 256 шагов: 8 бит

Яркость изображения Разрешение / Image Brightness Resolution

Рис.3 Мультимедийное Программирование OpenCV
Рис.19 Мультимедийное Программирование OpenCV
Рис.35 Мультимедийное Программирование OpenCV
Рис.54 Мультимедийное Программирование OpenCV
Рис.44 Мультимедийное Программирование OpenCV
Рис.13 Мультимедийное Программирование OpenCV
Рис.49 Мультимедийное Программирование OpenCV
Рис.72 Мультимедийное Программирование OpenCV

Световой спектр / Light Spectrum

Рис.28 Мультимедийное Программирование OpenCV

WHITE LIGHT / БЕЛЫЙ СВЕТ

INFRARED / ИНФРАКРАСНЫЙ

ULTRAVIOLET / УЛЬТРАФИОЛЕТ

OPTICAL PRISM / ОПТИЧЕСКАЯ ПРИЗМА

Табличка I. Цветовой спектр, видимый при прохождении белого света через призму. (С разрешения General Electric Co., подразделения по производству ламп.) / Plate I. Color spectrum seen by passing white light a prism. (Courtesy of General Electric Co., Lamp Business Division.)

COSMIC RAYS / КОСМИЧЕСКИЕ ЛУЧИ

GAMMA RAYS / ГАММА ИЗЛУЧЕНИЕ

X-RAYS / X-ЛУЧИ

INFRARED / ИНФРАКРАСНЫЙ

MICRO-WAVES / МИКРОВОЛНЫ

RADIO / РАДИО

ELECTRIC POWER / ЭЛЕКТРОЭНЕРГИЯ

ULTRAVIOLET / УЛЬТРАФИОЛЕТ

VISIBLE SPECTRUM / ВИДИМЫЙ СПЕКТР

INFRARED / ИНФРАКРАСНЫЙ

Смеси света и пигментов / Mixtures of Light and Pigments

Рис.58 Мультимедийное Программирование OpenCV

RGB Color – Цвет RGB

MIXTURES OF LIGHT (Additive primaries)

СМЕСИ СВЕТА (Аддитивные праймериз)

RED – КРАСНЫЙ

YELLOW – ЖЕЛТЫЙ

GREEN – ЗЕЛЕНЫЙ

CYAN – ГОЛУБОЙ

WHITE – БЕЛЫЙ

BLUE – СИНИЙ

MAGENTA – ПУРПУРНЫЙ

MIXTURES OF PIGMENTS СМЕСИ ПИГМЕНТОВ

(Subtractive primaries) (Субтрактивные праймериз)

Рис.73 Мультимедийное Программирование OpenCV

CMY(K) Color / (CMYK) Цвет

RED – КРАСНЫЙ

YELLOW – ЖЕЛТЫЙ

GREEN – ЗЕЛЕНЫЙ

CYAN – ГОЛУБОЙ

BLACK – ЧЕРНЫЙ

BLUE – СИНИЙ

MAGENTA – ПУРПУРНЫЙ

Изображение R, G, B / R, G, B Image

Рис.64 Мультимедийное Программирование OpenCV

Рис.56 Мультимедийное Программирование OpenCV

Исходное изображение (Original Image) Красный компонент (Red Component)

Рис.70 Мультимедийное Программирование OpenCV

Рис.1 Мультимедийное Программирование OpenCV

Зеленый компонент (Green Component) Синий компонент (Blue Component)

Тип цифрового изображения / A Type of Digital Image

Рис.17 Мультимедийное Программирование OpenCV

(а) Цветное изображение (Color Image)

(b) Изображение с уровнем серого (Gray Level Image)

(c) Двоичное изображение (Binary Image)

Тип цифрового изображения / A Type of Digital Image

Рис.33 Мультимедийное Программирование OpenCV

(a) Двоичное изображение / Binary Image

Рис.50 Мультимедийное Программирование OpenCV

(b) Изображение с уровнем серого / Gray Level Image

Тип цифрового изображения / A Type of Digital Image

Рис.65 Мультимедийное Программирование OpenCV

Цветное изображение (Color Image)

2. Введение OpenCV (Introduction of OpenCV)

OpenCV?

● 

OpenCV – библиотека компьютерного зрения с открытым исходным кодом

– Библиотека с открытым исходным кодом для обработки изображений

и компьютерного зрения

– Состоит из более чем 2500 алгоритмов

– Поддержка интерфейсов C, C++, Python, Matlab.

– Поддержка операционных систем для Windows, Linux, Android, Mac

OS и т. д.

– Быстрая реализация алгоритма с использованием инструкций MX

(MultiMedia eXtension) и SSE (потоковые расширения SIMD).

– Разработка интерфейса CUDA и OpenCL

Установка OpenCV / OpenCV Install

• 

Условия для программирования OpenCV с использованием C ++ (для ОС Windows)

– 

На вашем компьютере должна быть установлена 64-битная ОС Windows. (OpenCV поддерживает только 64-битные ОС)

– 

Visual Studio 2017 должен быть установлен как инструмент редактора программ для программирования на C ++. (Последняя версия Visual Studio – 2019, но в настоящее время поддерживает только OpenCV для Visual Studio 2017.)

Установка сообщества Visual Studio 2017.

(① Visual Studio Community 2017 Install)

● 

https://visualstudio.microsoft.com/ru/free-developer-offers/

Рис.29 Мультимедийное Программирование OpenCV

• 

На официальном сайте выше можно загрузить только последнюю версию 2019 года, поэтому вы можете найти версию 2017 года с помощью веб-поиска и загрузки.

• 

30-дневная ознакомительная версия, затем зарегистрируйтесь в Microsoft, войдите в Visual Studio и продолжайте использовать ее бесплатно

Загрузка OpenCV (OpenCV Download)

• 

http://opencv.org

> Releases

• 

После загрузки установочного файла, дважды щелкните файл exe для установки

Рис.8 Мультимедийное Программирование OpenCV

Add to “System Environment Path” of Windows

• 

Зарегистрируйте место установки OpenCV в «Путь к системной среде» Windows

• 

Если вы установили диск C следующим образом, добавьте следующее в Path

• 

C:\OpenCV\build\x64\vc15\bin

Рис.45 Мультимедийное Программирование OpenCV

Настройка OpenCV для Visual Studio 2017

(OpenCV Setup of Visual Studio 2017)

Рис.59 Мультимедийное Программирование OpenCV
Рис.74 Мультимедийное Программирование OpenCV
Рис.4 Мультимедийное Программирование OpenCV
Рис.20 Мультимедийное Программирование OpenCV
Рис.36 Мультимедийное Программирование OpenCV

Проверьте, что Debug mode(режим отладки) в настоящее время включен !!!

Рис.55 Мультимедийное Программирование OpenCV
Рис.69 Мультимедийное Программирование OpenCV
Рис.16 Мультимедийное Программирование OpenCV
Рис.11 Мультимедийное Программирование OpenCV
Рис.37 Мультимедийное Программирование OpenCV
Рис.60 Мультимедийное Программирование OpenCV
Рис.75 Мультимедийное Программирование OpenCV
Рис.9 Мультимедийное Программирование OpenCV
Рис.24 Мультимедийное Программирование OpenCV
Рис.39 Мультимедийное Программирование OpenCV
Рис.57 Мультимедийное Программирование OpenCV
Рис.71 Мультимедийное Программирование OpenCV
Рис.2 Мультимедийное Программирование OpenCV

Режим отладки → opencv_worldxxxd.lib

(Режим выпуска → opencv_worldxxx.lib)

Debug mode → opencv_worldxxxd.lib

(Release mode → opencv_worldxxx.lib)

Рис.21 Мультимедийное Программирование OpenCV
Рис.18 Мультимедийное Программирование OpenCV
Рис.34 Мультимедийное Программирование OpenCV

● 

Имя → OpenCV410_x64_v15_

отлаживать

Name → OpenCV410_x64_v15_debug

● 

Местоположение → Папка сохранения программы OpenCV (помните!!!)

Location → OpenCV program saving folder (remember!!!)

Рис.51 Мультимедийное Программирование OpenCV

• 

При использовании Visual Studio в Release mode(режиме выпуска)

– 

Запустите проект> Свойства в Main Menu

Рис.66 Мультимедийное Программирование OpenCV

– 

Выполните то же самое содержание на страницах с 24 по 30

Release mode → opencv_worldxxx.lib

(Режим выпуска → opencv_worldxxx.lib)

Рис.78 Мультимедийное Программирование OpenCV
Рис.31 Мультимедийное Программирование OpenCV
Рис.61 Мультимедийное Программирование OpenCV

• 

Имя → OpenCV410_x64_v15_release

Name → OpenCV410_x64_v15_release

• 

Местоположение → Папка сохранения программы OpenCV (помните!!!)

Location → OpenCV program saving folder (remember!!!)

Рис.38 Мультимедийное Программирование OpenCV

Пример программы OpenCV / OpenCV Sample Program

• 

запись OpenCV Sample Program

Рис.14 Мультимедийное Программирование OpenCV

• 

Ввод имени программы C++… → ???.cpp

C++ program name typing… → ???.cpp

Рис.40 Мультимедийное Программирование OpenCV
Рис.25 Мультимедийное Программирование OpenCV
Рис.22 Мультимедийное Программирование OpenCV
Рис.5 Мультимедийное Программирование OpenCV

#include <opencv2/highgui.hpp>

пустая функция()

{

cv::Mat i(300, 400, CV_8UC1, cv::Scalar(200));

cv::imshow("Просмотр изображений", i);

резюме::waitKey (0);

}

#include <opencv2/highgui.hpp>

void main()

{

cv::Mat i(300, 400, CV_8UC1, cv::Scalar(200));

cv::imshow("Image Viewer", i);

cv::waitKey(0);

}

Рис.67 Мультимедийное Программирование OpenCV

• 

Ошибка → установка x64!! / Error → x64 setting!!

Рис.52 Мультимедийное Программирование OpenCV
Рис.79 Мультимедийное Программирование OpenCV

• 

Ctrl+F5: запустить без отладки. / Ctrl+F5 : Start without Debugging

Рис.23 Мультимедийное Программирование OpenCV

Выход (Результат) / Output (Result)

Рис.53 Мультимедийное Программирование OpenCV

3. OpenCV Classes

Точка_Класс / Point_ Class

• 

Шаблонный класс (template class) для представления позиций width (ширины) и height (высоты) в двухмерных координатах (2 Dimension coordinate).

Рис.80 Мультимедийное Программирование OpenCV

• 

(Объявление класса Point_( Declaration of Point_ Class)

Point_<int> <==> Point2i <==> Point;

Point_<float> <==> Point2f;

Point_<double> <==> Point2d;

• 

Бывший)

Ex)

Point_<int> pt1(100, 200);

Point_<float> pt2(92.3f, 125.23f);

Point_<double> pt3(100.2, 300.9);

Point pt4(120, 69);

Point2f pt5(0.3f, 0.f), pt6(0.f, 0.4f);

Point2d pt7(0.25, 0.6);

Размер_Класс / Size_ Class

• 

Шаблонный класс(template class), который определяет размер изображения(i) или прямоугольника(rectangle).

Рис.46 Мультимедийное Программирование OpenCV

• 

Объявление класса Size_ (Declaration of Size_ Class)

Size_<int> <==> Size2i <==> Size;

Size_<float> <==> Size2f;

Size_<double> <==> Size2d;

• 

Бывший)

• 

Ex)

Size_<int> sz1(100, 200);

Size_<float> sz2(192.3f, 25.3f);

Size_<double> sz3(100.2, 30.9);

Size sz4(120, 69);

Size2f sz5(0.3f, 0.f);

Size2d sz6(0.25, 0.6);

Прямой_класс / Rect_ Class

• 

класс шаблона для представления rectangle(прямоугольников)

• 

((Начальная точка_x, Начальная точка_y), (Конечная точка_x, Конечная точка_y))

• 

((Начальная точка_x, Начальная точка_y), Ширина, Высота)

Рис.6 Мультимедийное Программирование OpenCV

• 

Объявление класса Rect_ (Declaration of Rect_ Class)

Rect_<int> <==> Rect2i <==> Rect;

Rect_<float> <==> Rect2f;

Rect_<double> <==> Rect2d;

• 

Бывший)

• 

Ex)

Size2d sz(100.5, 60.6);

Point2f pt1(20.f, 30.f), pt2(100.f, 200.f);

Rect_<int> rect1(10, 10, 30, 50);

// column, row, width, height

Rect_<float> rect2(pt1, pt2);

Rect_<double> rect3(Point2d(20.5, 10), sz);

Век-класс / Vec Class

• 

Шаблонный класс(template class) для вектора(Vector) чисел с небольшим количеством элементов.

• 

Укажите data type(тип данных) и количество element(элементов) между < и >.

Vec<uchar, 2> <==> Vec2b

Vec<int, 3> <==> Vec3i

Vec<float, 4> <==> Vec4f

Vec<double, 5> <==> Vec5d

• 

Ex)

Vec<int, 2> v1(5, 12);

Vec<double, 3> v2(40, 130.7, 125.6);

Vec2b v3(10, 10);

Vec6f v4(40.f, 230.25f, 525.6f);

Vec3i v5(200, 230, 250);

Скаляр_класс / Scalar_ Class

• 

Укажите четыре значения в качеств data type(типа данных), чтобы указать значение яркости pixel(пикселя)

• 

Сохраните четыре значения Blue, Green, Red, Alpha(transparency).

• 

Установите в 0, если при инициализации (Initialization) не указано значение

• 

Scalar_<double> <==> Scalar

• 

Ex)

Scalar_<uchar> red(0, 0, 255);

Scalar_<int> blue(255, 0, 0);

Scalar_<double> color1(500);

Scalar_<float> color2(100.f, 200.f, 125.9f);

Мат Класс / Mat Class

• 

Класс(class), используемый для представления i(изображения).

• 

Mat (строки, столбцы, тип, скаляр (rows, cols, type, Scalar))

строки: размер строки (rows: row size)

столбцы: размер столбца (cols : column size)

тип: тип данных (type : data type)

Скаляр: матричное значение (Scalar : matrix value)

Рис.7 Мультимедийное Программирование OpenCV

#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

int main()

{

float data[] = {

      1.2f, 2.3f, 3.2f,

      4.5f, 5.f, 6.5f,

};

Mat m1(2, 3, CV_8U);

Mat m2(2, 3, CV_8U, Scalar(300));

Mat m3(2, 3, CV_32F, data);

Size sz(2, 3);

Mat m4(Size(2, 3), CV_64F);

Mat m5(sz, CV_32F, data);

cout << "[m1] =" << endl << m1 << endl;

cout << "[m2] =" << endl << m2 << endl;

cout << "[m3] =" << endl << m3 << endl << endl;

cout << "[m4] =" << endl << m4 << endl;

cout << "[m5] =" << endl << m5 << endl;

return 0;

}

Рис.41 Мультимедийное Программирование OpenCV
Рис.48 Мультимедийное Программирование OpenCV

#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

int main()

{

Mat m1(4, 3, CV_32FC3);

cout << “Dimension = " << m1.dims << endl;

cout << “Rows = " << m1.rows << endl;

cout << “Columns = " << m1.cols << endl << endl;

cout << “Channels = " << m1.channels() << endl;

cout << “Data Type = " << m1.depth() << endl;

cout << “Matrix Size = " << m1.size() << endl << endl;

cout << “Total Data Number = " << m1.total() << endl;

return 0;

}

Рис.63 Мультимедийное Программирование OpenCV

#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

int main()

{

Mat m1(2, 3, CV_8U, 2);

Mat m2(2, 3, CV_8U, Scalar(10));

Mat m3 = m1 + m2;

Mat m4 = m2 – 6;

Mat m5 = m1;

cout << "[m2] =" << endl << m2 << endl;

cout << "[m3] =" << endl << m3 << endl;

cout << "[m4] =" << endl << m4 << endl << endl;

cout << "[m1] =" << endl << m1 << endl;

cout << "[m5] =" << endl << m5 << endl << endl;

m5 = 100;

cout << "[m1] =" << endl << m1 << endl;

cout << "[m5] =" << endl << m5 << endl;

return 0;

}

• Копирование исходной матрицы в другую матрицу / Copy original matrix to another matrix

• Матовый клон () / Mat clone ()

• void copy To (матрица целей, матрица маски) / void copy To

(objective matrix, mask matrix)

– 

mask matrix : Копирование только ненулевых элементов (elemen)

• 

void convertTo (objective matrix, data type)

– 

data type : data type, которые вы хотите изменить

#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

int main()

{

double data[] = {

      1.1, 2.2, 3.3, 4.4,

      5.5, 6.6, 7.7, 8.9,

      9.9, 10, 11, 12

};

Mat m1(3, 4, CV_64F, data);

Mat m2 = m1.clone(); // copy m1 to m2

Mat m3, m4;

m1.copyTo(m3); // copy m1 to m3

m1.convertTo(m4, CV_8U); // copy m1 to m4 converting to uchar

cout << "[m1] =\n" << m1 << endl;

cout << "[m2] =\n" << m2 << endl;

cout << "[m3] =\n" << m3 << endl;

cout << "[m4] =\n" << m4 << endl;

return 0;

}

векторный класс / vector Class

• 

Контейнер последовательностей(Sequence Container) C++ STL(Standard Template Library)

• 

доступ к элементу(element access) вектора(vector) : используйте оператор индекса(subscript operator), [], как массив(array)

• 

vector() : конструктор(constructor)

• 

void push_back() : добавляет элемент в конец vector

• 

void pop_back() : удалить последний элемент

#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

int main()

{

vector<Point> v1;

v1.push_back(Point(10, 20));

v1.push_back(Point(20, 30));

v1.push_back(Point(50, 60));

vector<float> v2(3, 9.25);

Size arr_size[] = { Size(2, 2), Size(3, 3), Size(4, 4) };

int arr_int[] = { 10, 20, 30, 40, 50 };

vector<Size> v3(arr_size, arr_size + sizeof(arr_size) / sizeof(Size));

vector<int> v4(arr_int + 2, arr_int + sizeof(arr_int) / sizeof(int));

cout << "[v1] " << ((Mat)v1) << endl << endl;

cout << "[v2] " << ((Mat)v2) << endl << endl;

cout << "[v2] " << ((Mat)v2).reshape(1, 1) << endl;

cout << "[v3] " << ((Mat)v3).reshape(1, 1) << endl;

cout << "[v4] " << ((Mat)v4).reshape(1, 1) << endl;

return 0;

}

Класс диапазона / Range class

• 

Используется в основном для указания диапазона row(строк) и column(столбцов) в классе Mat.

• 

Range(int start, int end)

• 

start(начало) в диапазоне, end(конец) не в диапазоне

Функция операции с матрицей / Matrix Operation Function

• 

Matexp inv(метод): расчет обратной матрицы

– метод

• 

Matexp inv(method) : inverse matrix calculation

– method

Рис.77 Мультимедийное Программирование OpenCV

• 

Matexp mul (input matrix): Выполнить поэлементное (element-wise) умножение двух матриц

• 

Matexp t () : вычислить транспонированную матрицу(transposed matrix)

• 

Одновременные уравнения (simultaneous equation)

Рис.12 Мультимедийное Программирование OpenCV

#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

int main()

{

float data[] = {

      1, 0, 2,

      -3, 2, 6,

      -1, -2, 3

};

float ans[] = {6, 30, 8};

Mat m1(3, 3, CV_32F, data);

Mat m2(1, 3, CV_32F, ans);

Mat m2_t = m2.t();

Mat m1_inv = m1.inv(DECOMP_LU);

Mat x = m1_inv * m2_t;

cout << "[m1] = " << endl << m1 << endl;

cout << "[m1_inv] = " << endl << m1_inv << endl << endl;

cout << "[m2(transposed)] = " << endl << m2_t << endl << endl;

cout << “solution x1, x2, x3 = " << x.t() << endl;

}

насыщенный_ бросок < > / saturate_cast < >

• 

i data는 основном представляют собой кодированные(encoding) данные с 8 битами на канал.

• 

Поскольку он использует только 8bit, он имеет ограниченный диапазон значений пикселей (0 ~ 255).

• 

saturate_cast() template method : Когда значение сохраняется в 8-битном, если оно превышает 8-битный диапазон, оно сохраняется как 0 или 255

• 

Ex)

Mat m1(2, 2, CV_8U);

m1(0, 0) = -50; // -> 206

m1(0, 1) = 300; // -> 44

m1(1, 0) = saturate_cast<uchar>(-50);

m1(1, 1) = saturate_cast<uchar>(300);

4. Пользовательские интерфейсы OpenCV

(OpenCV User Interfaces)

Контрольние виндов / Window Control

• 

Named Window (winname, flags) : Устанавливает имя window и создает window с этим именем

– 

flags : Изменение размера window

Рис.30 Мультимедийное Программирование OpenCV

• 

imshow (): отображает матрицу "mat" как окно в окне winname

• 

destroyWindow (): удаляет указанное окно с экрана

• 

destroyAllWindows (): удалить все видимые окна

• 

moveWindow (x, y): переместить окно winname в указанную позицию (x (столбец, y (строка))

#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

int main()

{

Mat i1(300, 400, CV_8U, Scalar(255));

Mat i2(300, 400, CV_8U, Scalar(100));

string h21 = "white window control";

string h22 = "gray window control";

namedWindow(h21, WINDOW_AUTOSIZE);

namedWindow(h22, WINDOW_NORMAL);

moveWindow(h21, 100, 200);

moveWindow(h22, 300, 200);

imshow(h21, i1);

imshow(h22, i2);

waitKey();

destroyAllWindows();

return 0;

}

Контрольние событиями клавиатуры / Keyboard Event Control

• 

waitKey (delay, задержка): ожидает ввода ключа в течение времени задержки(delay), возвращает(return) значение клавиши, когда происходит событие клавиши,

– 

delay : время задержки. ms.

– 

delay <= 0 : Бесконечное ожидание, пока не произойдет ключевое событие

– 

delay > 0 : дождитесь ввода ключа в течение времени задержки. return (Возвращает) -1, если в течение времени задержки нет клавишного ввода

• 

Используйте waitKeyEx () для ввода клавиши со стрелкой (arrow key)

• 

Event (Событие) происходит только когда window active (активно).

Контрольние событиями мыши / Mouse Event Control

• 

Создать callback function (функцию обратного вызова) (event handler) (обработчик событий) для обработки событий мыши и зарегистрировать эту функцию в системе через setMouseCallback ()

Продолжение книги