Loe raamatut: «Мультимедийное Программирование OpenCV», lehekülg 3

Font:

• 

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-значный код кодека (

www.fourcc.org

)


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

Vanusepiirang:
12+
Ilmumiskuupäev Litres'is:
26 juuli 2024
Kirjutamise kuupäev:
2024
Objętość:
125 lk 126 illustratsiooni
Õiguste omanik:
Автор
Allalaadimise formaat:
epub, fb2, fb3, ios.epub, mobi, pdf, txt, zip