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

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

Полная версия

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

• 

Если во время выполнения программы обнаружено событие мыши, оно call(вызовет) созданную пользователем callback function (функцию обратного вызова).





#include <opencv2/opencv.hpp>

using name space cv;

using name space std;

void on Mouse (int, int, int, int, void *);

int main ()

{

Mat image (200, 300, CV_8U);

image.setTo (255);

imshow (“mouse event 1", image);

imshow (“mouse event 2", image);

set Mouse Callback (“mouse event 1", on Mouse, 0);

waitKey(0);

return 0;

}

// next page continued....


void on Mouse (int event, int x, int y, int flags, void *params)

{

switch (event)

{

      case EVENT_LBUTTONDOWN:

            cout << “Left mouse button press" << endl;

            break;

      case EVENT_RBUTTONDOWN:

            cout << "Right mouse button press" << endl;                         break;

      case EVENT_RBUTTONUP:

            cout << "Right mouse button release" << endl;

            break;

      case EVENT_LBUTTONDBLCLK:

            cout << "Left mouse button double click" << endl;                   break;

}

}


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

• 

Полоса прокрутки (scroll bar) или ползунок (slider bar), используемые при выборе определенного значения в определенном диапазоне

• 

Create Trackbar (tn, pw, sv, max, обратный вызов, данные)

– tn: имя трекбара

– pw: имя родительского window

– sv: значение ползунка

– max: максимальное значение ползунка (минимальное значение = 0)

– callback: функция обратного вызова (onChange)

– data: userdata transferred to callback function


#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

string title = “Trackbar Event";

Mat image;

void onChange(int value, void* userdata)

{

int add_value = value – 128;

cout << “added pixel value " << add_value << endl;

Mat tmp = image + add_value;

imshow(title, tmp);

}

// next page continued....


int main()

{

int value = 128;

image = Mat(300, 400, CV_8UC1, Scalar(128));

namedWindow(title, WINDOW_AUTOSIZE);

createTrackbar(“Brightness", title, &value, 255, onChange);

imshow(title, image);

waitKey(0);

return 0;

}


Линия, Прямоугольный рисунок / Line, Rectangle Drawing

• 

Line (img, pt1, pt2, цвет, толщина, тип линий, сдвиг)


• 

rectangle (img, pt1, pt2, цвет, толщина, тип линий, сдвиг)


– 

img: Тема должна быть нарисована matrix (image)

– 

pt1, pt2: звездная точка, конечная точка (star point, end point)

– 

color: цвет линии или прямоугольника (line or rectangle color)

– 

thickness : line thickness (-1: Заполните внутри)

– 

linetype




– 

сдвиг: вправо, битовый сдвиг // сдвиг вправо и влево

– 

сдвиг: бит вправо // сдвиг вправо и влево


#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

int main ()

{

Scalar blue (255, 0, 0), red (0, 0, 255), green = Scalar (0, 255, 0);

Scalar white (255, 255, 255);

Scalar yellow (0, 255, 255);

Mat image (400, 600, CV_8UC3, white);

Point pt1(50, 130), pt2(200, 300), pt3(300, 150), pt4(400, 50);

Rect rect (pt3, Size (200, 150));

Line (image, pt1, pt2, red);

line (image, pt3, pt4, green, 2, LINE_AA);

line (image, pt3, pt4, green, 3, LINE_8, 1);

rectangle (image, rect, blue, 2);

 

rectangle (image, rect, blue, FILLED, LINE_4, 1);

rectangle (image, pt1, pt2, red, 3);

imshow (“Line & Rectangle", image);

waitKey (0);

return 0;

}

• 

Выход (Output) 80-niň suratyna täzeden seret





Текстовый рисунок / Text Drawing

• 

putText (img, текст, организация, FontFace, FontScale, цвет, толщина, тип линии (img, text, org, fontFace, fontScale, color, thickness, linetype))


– 

img: матрица написать Текст (изображение)

– 

text: написать характер

– 

org: начальные координаты текста

– 

font Face: текстовый шрифт

– 

font Scale: Коэффициент увеличения размера шрифта

– 

color: цвет текста

– 

thickness: толщина текста

– 

linetype: тип текстовой строки (по умолчанию = 8)


• 

Начальные координаты строки дисплея – lower left (левый нижний)


font Face: текстовый шрифт //ширина (text font //shirift)



#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

int main()

{

Scalar olive(128, 128, 0), violet(221, 160, 221), brown(42, 42, 165);

Point pt1(20, 100), pt2(20, 200), pt3(20, 250);

Mat image(300, 500, CV_8UC3, Scalar(255, 255, 255));

putText(image, "SIMPLEX", Point(20, 30), FONT_HERSHEY_SIMPLEX, 1, brown);

putText(image, "DUPLEX", pt1, FONT_HERSHEY_DUPLEX, 2, olive);

putText(image, "TRIPLEX", pt2, FONT_HERSHEY_TRIPLEX, 3, violet);

putText(image, "ITALIC", pt3, FONT_HERSHEY_PLAIN | FONT_ITALIC, 2, violet);

imshow(“Text Drawing", image);

waitKey(0);

return 0;

}


• 

Выход (Output) 84-nji sahypa hem täzeden seretmeli





Рисунок круга / Circle Drawing

• 

circle (изображение, центр, радиус, цвет, толщина, тип линии)


– 

img: matrix Чтобы нарисовать круг (image)

– 

center: координаты центра круга

– 

radius: радиус круга

– 

color: цвет круга

– 

thickness: толщина круга

– 

linetype: тип окружной линии (по умолчанию = 8)


#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

int main()

{

Scalar orange(0, 165, 255), blue(255, 0, 0), magenta(255, 0, 255);

Mat image(300, 500, CV_8UC3, Scalar(255, 255, 255));

Point center = image.size() / 2;

Point pt1(70, 50), pt2(350, 220);

circle(image, center, 100, blue);

circle(image, pt1, 80, orange, 2);

circle(image, pt2, 60, magenta, -1);

int font = FONT_HERSHEY_COMPLEX;

putText(image, "center_blue", center, font, 1.2, blue);

putText(image, "pt1_orange", pt1, font, 0.8, orange);

putText(image, "pt2_magenta", pt2 + Point(2, 2), font, 0.5, Scalar(0, 0, 0), 2);

putText(image, "pt2_magenta", pt2, font, 0.5, magenta, 1);

imshow(“Circle Drawing", image);

waitKey(0);

return 0;

}


● 

Выход

/ Output



Обработка файлов изображений / Image File Processing

• 

imread (имя файла, флаги)


– 

имя файла: имя файла изображения для чтения

– 

флаги: тип цвета на следующей странице…





#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

void print_matInfo(string name, Mat img)

{

string str;

int depth = img.depth();

if (depth == CV_8U) str = "CV_8U";

else if (depth == CV_8S) str = "CV_8S";

else if (depth == CV_16U) str = "CV_16U";

else if (depth == CV_16S) str = "CV_16S";

else if (depth == CV_32S) str = "CV_32S";

else if (depth == CV_32F) str = "CV_32F";

else if (depth == CV_64F) str = "CV_64F";

cout << name;

cout << format(": depth(%d) channels(%d) -> data type: ", depth, img.channels());

cout << str << "C" << img.channels() << endl;

}

// next page continued....


int main()

{

string filename = "../image/read_color.jpg";

Mat color2gray = imread(filename, IMREAD_GRAYSCALE);

Mat color2color = imread(filename, IMREAD_COLOR);

CV_Assert(color2gray.data && color2color.data);

Rect roi(100, 100, 1, 1);

cout << “Matrix (100,100) pixel value " << endl;

cout << "color2gray " << color2gray(roi) << endl;

cout << "color2color " << color2color(roi) << endl;

print_matInfo("color2gray", color2gray);

print_matInfo("color2color", color2color);

imshow("color2gray", color2gray);

imshow("color2color", color2color);

waitKey(0);

return 0;

}







• 

imwrite (имя файла, изображение, вектор параметров)


– 

имя файла: сохранение имени файла

– 

изображение: матрица (изображение) для сохранения

– 

вектор параметров: пара векторов параметров в зависимости от метода сжатия





• 

Легко save (сохранить) image file (файл изображения) с расширением имени (extension name)

• 

Форматы файлов изображений JPG, BMP, PNG, TIF, PPM и т. д.


#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

int main()

{

Mat img8 = imread("../image/read_color.jpg", IMREAD_COLOR);

CV_Assert(img8.data);

vector<int> params_jpg, params_png;

params_jpg.push_back(IMWRITE_JPEG_QUALITY);

params_jpg.push_back(50);

params_png.push_back(IMWRITE_PNG_COMPRESSION);

params_png.push_back(9);

imwrite("../image/write_test1.jpg", img8);

imwrite("../image/write_test2.jpg", img8, params_jpg);

imwrite("../image/write_test.png", img8, params_png);

imwrite("../image/write_test.bmp", img8);

return 0;

}


Обработка видео / Video Processing

• 

Video file (Видеофайл) сжимается (compression) кодеком (codec) в соответствии с форматом (format), а сохраненный видеофайл распаковывается (decompression).

Рейтинг@Mail.ru