Read online book «Мультимедийное Программирование OpenCV» author Serdar Orazdurdyyev

Мультимедийное Программирование OpenCV
Serdar Orazdurdyyev
Внедрение цифровой обработки изображений / Introduction of Digital Image Processing.

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

Программа стипендий для профессоров
Проект по наращиванию потенциала профессионально-технического училища Марыйского велаята Туркменистана

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

2019.07.15 – 07.29

Профессор. Ким, Ын Сон

Внедрениецифровойобработкиизображений / 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 / КОСМИЧЕСКИЕЛУЧИ
GAMMARAYS / ГАММА ИЗЛУЧЕНИЕ
X-RAYS / X-ЛУЧИ

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

MICRO-WAVES / МИКРОВОЛНЫ
RADIO / РАДИО
ELECTRICPOWER / ЭЛЕКТРОЭНЕРГИЯ
ULTRAVIOLET / УЛЬТРАФИОЛЕТ
VISIBLESPECTRUM / ВИДИМЫЙ СПЕКТР
INFRARED / ИНФРАКРАСНЫЙ

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



RGB Color – Цвет RGB

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

RED –КРАСНЫЙ
YELLOW – ЖЕЛТЫЙ
GREEN – ЗЕЛЕНЫЙ
CYAN – ГОЛУБОЙ
WHITE – БЕЛЫЙ
BLUE – СИНИЙ
MAGENTA –ПУРПУРНЫЙ

MIXTURESOFPIGMENTSСМЕСИ ПИГМЕНТОВ
(Subtractiveprimaries) (Субтрактивные праймериз)




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

RED – КРАСНЫЙ
YELLOW – ЖЕЛТЫЙ
GREEN – ЗЕЛЕНЫЙ
CYAN – ГОЛУБОЙ
BLACK – ЧЕРНЫЙ
BLUE – СИНИЙ
MAGENTA – ПУРПУРНЫЙ

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






Исходное изображение (OriginalImage) Красный компонент (RedComponent)






Зеленыйкомпонент (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/ (https://visualstudio.microsoft.com/ru/free-developer-offers/)




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

? Загрузка OpenCV (OpenCV Download)
• 
http://opencv.org (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
пустая функция()
{
cv::Mat image(300, 400, CV_8UC1, cv::Scalar(200));
cv::imshow("Просмотр изображений", image);
резюме::waitKey (0);
}

#include
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_ <==> Point2i <==> Point;
Point_ <==> Point2f;
Point_ <==> Point2d;

• 
Бывший
)
Ex)
Point_ pt1(100, 200);
Point_ pt2(92.3f, 125.23f);
Point_ 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_ <==> Size2i <==> Size;
Size_ <==> Size2f;
Size_ <==> Size2d;

• 
Бывший
)
• 
Ex)
Size_ sz1(100, 200);
Size_ sz2(192.3f, 25.3f);
Size_ 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_ <==> Rect2i <==> Rect;
Rect_ <==> Rect2f;
Rect_ <==> Rect2d;
• 
Бывший
)

• 
Ex)
Size2d sz(100.5, 60.6);
Point2f pt1(20.f, 30.f), pt2(100.f, 200.f);

Rect_ rect1(10, 10, 30, 50);
// column, row, width, height
Rect_ rect2(pt1, pt2);
Rect_ rect3(Point2d(20.5, 10), sz);

Век-класс / Vec Class
• 
Шаблонный класс(template class) для вектора(Vector) чисел с небольшим количеством элементов.
• 
Укажите data type(тип данных) и количество element(элементов) между < и >.
Vec <==> Vec2b
Vec <==> Vec3i
Vec <==> Vec4f
Vec <==> Vec5d
• 
Ex)
Vec v1(5, 12);
Vec 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_ <==> Scalar
• 
Ex)
Scalar_ red(0, 0, 255);
Scalar_ blue(255, 0, 0);
Scalar_ color1(500);
Scalar_ 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
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
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
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
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
using namespace cv;
using namespace std;
int main()
{
vector v1;
v1.push_back(Point(10, 20));
v1.push_back(Point(20, 30));
v1.push_back(Point(50, 60));
vector 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 v3(arr_size, arr_size + sizeof(arr_size) / sizeof(Size));
vector 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
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(-50);
m1(1, 1) = saturate_cast(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
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 ()

Конец ознакомительного фрагмента.
Текст предоставлен ООО «Литрес».
Прочитайте эту книгу целиком, купив полную легальную версию (https://www.litres.ru/pages/biblio_book/?art=70924117) на Литрес.
Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.