•
Video Capture Class / Класс видеозахвата: Читать frame (кафраме) с камеры или видео файла
–
Video Capture /
Захват видео (имя файла, устройство)
•
device / устройство: идентификатор устройства захвата (Если есть одна камера, 0)
–
open (): открытие видеофайла или камеры
–
isOpened(): подключено ли возврат устройства захвата
–
get(): возвращаемое значение идентификатора свойства
–
set(): установка свойств видео с использованием идентификатора свойств
–
read(): чтение видеокадра, затем передача в матрицу изображения
●
идентификатор свойства
/ properties identifier
•
Video Writer Class: save (сохранить) image (изображение) matrix (матрицы) в видео файл(video file)
–
VideoWriter (file name, fourcc, fps, framesize, isColor / имя файла, fourcc, частота кадров, размер кадра, isColor)
•
fourcc: 4-character code of codec (4-значный код кодека)
•
fps: frame per second (кадр в секунду)
•
framesize: video frame size (column x row) /размер видеокадра (столбец x строка)
•
isColor: true – color ecoding, false – gray frame encoding /
true – кодирование цвета, false – кодирование серого кадра
–
open () : opening of video file (открытие видеофайла)
–
isOpened () : будь открытым возврат файла записи видео
–
write() : writing video frame from image matrix (запись видеокадра из матрицы изображений)
●
4-значный код кодека (
)
(4-character code of codec (www.fourcc.org)
// Video Frame Reading Program
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
VideoCapture capture(0);
if (!capture.isOpened())
{
cout << “camera not connected!!" << endl;
exit(1);
}
cout << “Width " << capture.get(CAP_PROP_FRAME_WIDTH) << endl;
cout << “Height" << capture.get(CAP_PROP_FRAME_HEIGHT) << endl;
cout << “Exposure " << capture.get(CAP_PROP_EXPOSURE) << endl;
cout << “Brightness " << capture.get(CAP_PROP_BRIGHTNESS) << endl;
// next page continued....
Point shade = Point(10, 40) + Point(2, 2);
int font = FONT_HERSHEY_SIMPLEX;
string text = "EXPOS: " + to_string((int)capture.get(CAP_PROP_EXPOSURE));
Mat frame;
for (;;) {
capture.read(frame);
putText(frame, text, shade, font, 0.7, Scalar(0, 0, 0), 2); putText(frame, text, Point(10, 40), font, 0.7, Scalar(120, 200, 90), 2);
imshow(“Camera Viewer", frame);
if (waitKey(30) >= 0)
break;
}
return 0;
}
// Video Frame Writing Program
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
VideoCapture capture(0);
CV_Assert(capture.isOpened());
double fps = 29.97;
int delay = cvRound(1000.0 / fps);
Size size(640, 480);
int fourcc = VideoWriter::fourcc('D', 'X', '5', '0');
capture.set(CAP_PROP_FRAME_WIDTH, size.width);
capture.set(CAP_PROP_FRAME_HEIGHT, size.height);
// next page continued....
cout << "width x height : " << size << endl;
cout << "VideoWriterfourcc : " << fourcc << endl;
cout << "delay : " << delay << endl;
cout << "fps : " << fps << endl;
VideoWriter writer;
writer.open("../image/video_file.avi", fourcc, fps, size);
CV_Assert(writer.isOpened());
Mat frame;
for (;;) {
capture >> frame;
writer << frame;
imshow(“Camera Viewer", frame);
if (waitKey(delay) >= 0)
break;
}
return 0;
}
// Video File Reading Program
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
VideoCapture capture;
capture.open("../image/video_file.avi");
CV_Assert(capture.isOpened());
Mat frame;
double frame_rate = capture.get(CAP_PROP_FPS);
int delay = 1000 / frame_rate;
int frame_cnt = 0, font = FONT_HERSHEY_PLAIN;
Point pt(25, 55);
Point shade = pt + Point(2, 2);
// next page continued....
while (capture.read(frame))
{
if (waitKey(delay) >= 0) break;
string text = "Frame Count : ";
text += to_string(frame_cnt++);
putText(frame, text, shade, font, 1.8, Scalar(0, 0, 0), 2);
putText(frame, text, pt, font, 1.8, Scalar(120, 200, 90), 2);
imshow(“Video File Reading", frame);
}
return 0;
}
5. Работа OpenCV с массивами / OpenCV Operation on Arrays
Основные функции обработки массивов / Fundamental Array Processing Functions
•
flip (src, dst, flipCode): вертикальное, горизонтальное, переворот в обоих направлениях
–
src: входной массив
–
dst: внешний массив
–
flipCode : 0 – горизонтальное перевор
1 – вертикальное переворот
–1 – горизонтальное и вертикальное переворачивание
•
transpose (): вернуть транспонированную матрицу входной матрицы
// Image Flipping Program
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("../image/flip_test.jpg", IMREAD_COLOR);
CV_Assert(image.data);
Mat x_axis, y_axis, xy_axis, trans_img;
flip(image, x_axis, 0);
flip(image, y_axis, 1);
flip(image, xy_axis, -1);
transpose(image, trans_img);
imshow("image", image);
imshow("x_axis", x_axis);
imshow("y_axis", y_axis);
imshow("xy_axis", xy_axis);
imshow("trans_img", trans_img);
waitKey();
return 0;
}
Функции обработки каналов / Channel Processing Functions
Метод сохранения элемента трехканальной матрицы (цвет)
// Image Channel Dividing Program
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("../image/color.jpg", IMREAD_COLOR);
CV_Assert(image.data);
Mat bgr[3];
split(image, bgr);
imshow("image", image);
imshow(“Blue Channel", bgr[0]);
imshow(“Green Channel", bgr[1]);
imshow(“Red Channel", bgr[2]);
waitKey(0);
return 0;
}
Четыре фундаментальные операции над массивами / The Four Fundamental Operations of Arrays
•
Выполняет поэлементную (element-wise) операцию (operation)
•
add (), subtract (), multiply (), divide ()
•
element-wise
element-wise
// The Four Fundamental Operations of Arrays
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat m1(3, 6, CV_8UC1, Scalar(10));
Mat m2(3, 6, CV_8UC1, Scalar(50));
Mat m_add1, m_add2, m_sub, m_div1, m_div2;
Mat mask(m1.size(), CV_8UC1, Scalar(0));
Rect rect(Point(3, 0), Size(3, 3));
mask(rect).setTo(1);
add(m1, m2, m_add1);
add(m1, m2, m_add2, mask);
// next page continued....
divide(m1, m2, m_div1);
m1.convertTo(m1, CV_32F);
m2.convertTo(m2, CV_32F);
divide(m1, m2, m_div2);
cout << "[m1] = " << endl << m1 << endl;
cout << "[m2] = " << endl << m2 << endl;
cout << "[mask] = " << endl << mask << endl << endl;
cout << "[m_add1] = " << endl << m_add1 << endl;
cout << "[m_add2] = " << endl << m_add2 << endl;
cout << "[m_div1] = " << endl << m_div1 << endl;
cout << "[m_div2] = " << endl << m_div2 << endl;
return 0;
}
Операции с корнем, степенью и величиной массивов / Root, Power, Magnitude Operations of Arrays
•
sqrt (input, ouput): вычисление квадратного корня из всех элементов массива
•
pow (input, power, ouput):
расчет мощности всех элементов массива
•
magnitude (x, y, output): расчет величин векторов x и y
•
exp (input, ouput): вычисление экспоненты всех элементов массива
•
log (input, ouput): вычисление натуральных логарифмов всех элементов массива
Логические битовые операции с массивами / Logical Bit Operations of Arrays
•
Выполнять logical operation (логические операции) в битовых единицах (bit-wise) элементов массива (array elements)
•
bitwise_and (вход 1, вход 2, выход, маска)
–
mask: Выполнять расчеты только для позиций с ненулевым значением
•
bitwise_or (вход 1, вход 2, выход, маска)
•
bitwise_xor (вход 1, вход 2, выход, маска)
•
bitwise_not (вход, вывод, маска)
// Logical Bit Operations of Arrays
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat image1(250, 250, CV_8U, Scalar(0));
Mat image2(250, 250, CV_8U, Scalar(0));
Mat image3, image4, image5, image6;
Point center = image1.size() / 2;
circle(image1, center, 80, Scalar(255), -1);
rectangle(image2, Point(0, 0), Point(125, 250), Scalar(255), -1);
bitwise_or(image1, image2, image3);
bitwise_and(image1, image2, image4);
bitwise_xor(image1, image2, image5);
bitwise_not(image1, image6);
imshow("image1", image1);
imshow("image2", image2);
imshow("bitwise_or", image3);
imshow("bitwise_and", image4);
imshow("bitwise_xor", image5);
imshow("bitwise_not", image6);
waitKey();
return 0;
}
●
Выход (Output)
Абсолютное значение, Макс., Мин. Операции с массивами / Absolute value, Max, Min Operations of Arrays
•
abs (): Расчет абсолютного значения всех элементов массива
•
absdiff (): После поэлементного (element-wise) вычитания двух массивов рассчитайте absolute value (абсолютное значение).
•
max (src1, src2, dst): сравнить src1 и src2 поэлементно (element-wise) и return большое значение в dst matrix
•
min (src1, src2, dst): сравнить src1 и src2 поэлементно (element-wise) и return Меньшие значение в dst matrix
// Absolute value, Max, Min Operations of Arrays
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat image1 = imread("../image/Semiconduct.tif", 0);
Mat image2 = imread("../image/Semiconduct2.tif", 0);
CV_Assert(image1.data && image2.data);
Mat dif_img, abs_dif1, abs_dif2;
image1.convertTo(image1, CV_16S);
image2.convertTo(image2, CV_16S);
subtract(image1, image2, dif_img);
abs_dif1 = abs(dif_img);
image1.convertTo(image1, CV_8U);
image2.convertTo(image2, CV_8U);
dif_img.convertTo(dif_img, CV_8U);
abs_dif1.convertTo(abs_dif1, CV_8U);
// next page continued....
absdiff(image1, image2, abs_dif2);
imshow("image1", image1), imshow("image2", image2);
imshow("dif_img", dif_img);
imshow("abs_dif1", abs_dif1), imshow("abs_dif2", abs_dif2);
Mat image_max, image_min;
image1 = imread("../image/abs_test1.jpg", 0);
image2 = imread("../image/abs_test2.jpg", 0);
CV_Assert(image1.data && image2.data);
max(image1, 120, image_max);
min(image1, image2, image_min);
image_max.convertTo(image_max, CV_8U);
image_min.convertTo(image_min, CV_8U);
imshow("image_max", image_max);
imshow("image_min", image_min);
waitKey();
return 0;
}
Статистические операции с массивами / Statistics Operations of Arrays
•
sum (input): вычисляет сумму элементов (element) для каждого канала (channel) в array (массиве)
•
mean (input, mask): вычисляет среднее значение элементов (element) для каждого канала (channel) в array
–
mask: Выполнять расчеты только для позиций с ненулевым значением
•
mean Std Dev (input, mean, stddev, mask): Рассчитать среднее (mean) и стандартное отклонение (standard deviation) элементов массива (array elements).
•
count Non Zero (): return (Вернуть) количество ненулевых элементов массива
// Statistics Operations of Arrays
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("../image/sum_test.jpg", 1);
CV_Assert(image.data);
Mat mask(image.size(), CV_8U, Scalar(0));
mask(Rect(20, 40, 70, 70)).setTo(255);
Scalar sum_value = sum(image);
Scalar mean_value1 = mean(image);
Scalar mean_value2 = mean(image, mask);
cout << "[sum_value] = " << sum_value << endl;
cout << "[mean_value1] = " << mean_value1 << endl;
cout << "[mean_value2] = " << mean_value2 << endl << endl;
// next page continued....
Mat mean, stddev;
meanStdDev(image, mean, stddev);
cout << "[mean] = " << mean << endl;
cout << "[stddev] = " << stddev << endl << endl;
meanStdDev(image, mean, stddev, mask);
cout << "[mean] = " << mean << endl;
cout << "[stddev] = " << stddev << endl;
imshow("image", image), imshow("mask", mask);
waitKey();
return 0;
}
6. Обработка изображений с использованием OpenCV / Image
Processing using OpenCV
Доступ к пикселям изображения / Image Pixel Access
•
Mat::at (): Функция шаблона (template function), которая access (обращается) к указанному элементу (пикселю) (element (pixel)) матрицы (matrix).
•
Тип возвращаемых данных (return data type) функции Mat :: at () должен соответствовать типу данных (data type) элемента массива (array element).
•
mat1.at<uchar>(10, 20);
•
mat2.at<int>(i, j);
•
mat3.at<double>(y, x);
•
mat4.at<Vec3d>(y, x)[0];
Пиксельное отображение изображения / Image Pixel Display
// Image Pixel Display
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("../image/pixel_test.jpg", IMREAD_GRAYSCALE);
if (image.empty()){
cout << “can’t open Image!!!" << endl;