Serdar Orazdurdyyev
Мультимедийное Программирование OpenCV

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

07.15.2019

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

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

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

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

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

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

Sampler – образец

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

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

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

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

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

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

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

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

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

Pixels – Пиксели

Lines – Линии

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

Brightness – Яркость

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

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

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

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

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

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

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

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

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

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

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

RGB Color – Цвет RGB

MIXTURES OF LIGHT (Additive primaries)

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

RED – КРАСНЫЙ

YELLOW – ЖЕЛТЫЙ

GREEN – ЗЕЛЕНЫЙ

CYAN – ГОЛУБОЙ

WHITE – БЕЛЫЙ

BLUE – СИНИЙ

MAGENTA – ПУРПУРНЫЙ

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

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

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

RED – КРАСНЫЙ

YELLOW – ЖЕЛТЫЙ

GREEN – ЗЕЛЕНЫЙ

CYAN – ГОЛУБОЙ

BLACK – ЧЕРНЫЙ

BLUE – СИНИЙ

MAGENTA – ПУРПУРНЫЙ

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

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

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

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

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

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

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

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

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

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

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

Цветное изображение (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/

• 

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

• 

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

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

• 

http://opencv.org

> Releases

• 

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

③ Add to “System Environment Path” of Windows

• 

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

• 

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

• 

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

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

(OpenCV Setup of Visual Studio 2017)

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

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

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

Debug mode → opencv_worldxxxd.lib

(Release mode → opencv_worldxxx.lib)

● 

Имя → OpenCV410_x64_v15_

отлаживать

Name → OpenCV410_x64_v15_debug

● 

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

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

• 

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

– 

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

– 

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

Release mode → opencv_worldxxx.lib

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

• 

Имя → OpenCV410_x64_v15_release

Name → OpenCV410_x64_v15_release

• 

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

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

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

• 

запись OpenCV Sample Program

• 

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

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

#include <opencv2/highgui.hpp>

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

{

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

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

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

}

#include <opencv2/highgui.hpp>

void main()

{

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

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

cv::waitKey(0);

}

• 

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

• 

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

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

3. OpenCV Classes

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

• 

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

• 

(Объявление класса 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), который определяет размер изображения(image) или прямоугольника(rectangle).

• 

Объявление класса 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), Ширина, Высота)

• 

Объявление класса 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), используемый для представления image(изображения).

• 

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

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

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

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

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

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

}

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

}

#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

• 

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

• 

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

• 

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

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

• 

image 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

• 

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

• 

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

• 

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

• 

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

#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

int main()

{

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

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

string title1 = "white window control";

string title2 = "gray window control";

namedWindow(title1, WINDOW_AUTOSIZE);

namedWindow(title2, WINDOW_NORMAL);

moveWindow(title1, 100, 200);

moveWindow(title2, 300, 200);

imshow(title1, image1);

imshow(title2, image2);

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 ()

Конец ознакомительного фрагмента.

Текст предоставлен ООО «Литрес».

Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.

Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.