Kitabı oku: «Мультимедийное Программирование OpenCV», sayfa 2
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).