OpenCV и Java/Windows. Основы

OpenCV (от англ. Open Source Computer Vision Library) — это библиотека алгоритмов компьютерного зрения с открытым исходным кодом. Реализована на C/C++, также разрабатывается для Python, Java, Ruby т.д. В этой статье мы рассмотрим привязку к языку программирование Java применительно к операционной системе Windows.

Введение


Для начала давайте определим что же мы имеем в виду под компьютерным зрением — это получение информации из изображений, при чем изображение может быть как отдельной фотографией, так и последовательностью кадров видео, даже в режиме реального времени.

Типичными задачами компьютерного зрения являются обнаружение, отслеживание и классификация объектов. Так же нужно понимать, что большое значение имеет цифровой шум, который возникает при использовании дешевых камер, а так как многие алгоритмы к этому чувствительны, это может привести к неправильно найденным границам объекта или ложным особым точкам. Существует множество и других сложностей, к примеру:

  • Пиксел имеет квадратную форму, а в видео даже встречается прямоугольная форма элементов изображения. Попробуйте нарисовать прямую линию под углом, увеличить масштаб и посмотреть, что получилось. При увеличенном масштабе даже человек не сможет сказать, что это линия.
  • Вторая проблема возникает при сжатии изображения, которое используется для уменьшения размера файла. Например, при сохранении в формате JPEG появляются артефакты сжатия, с которыми нужно как-то бороться.

Таких проблем множество и даже целой статьи не хватит для полной документации и рекомендаций на счет их устранения, поэтому на этом етапе мы закончим введение, так как нам достаточно информации для понимания.

Установка OpenCV


Для начала необходимо установить библиотеку OpenCV. Для этого открываем страницу https://opencv.org/releases/ и устанавливаем нужную нам версию нажав на пункт Windows(в моем случаи версия 4.1.0). Дальше мы следуем инструкций представленных на рисунку(прошу заметить, что не надо указывать путь с русскими буквами, лучше всего закинуть в корень диска).

image

image

Настройки редактора Eclipse, Netbeans и т. д вы можете найти в интернете за таким запросом: "how to configure opencv in netbeans/eclipse". На этом установку мы закончим и непосредственно перейдем к самой библиотеке.

Базовые понятия


В первую очередь, нужно заметить что в OpenCV особого внимания стоит уделить таким понятиям как: точка, матрица ну и вектор/скаляр.

Класс Point: точка
Точка, представляющая местоположение в координатном пространстве (x,y), заданное с целочисленной точностью. Инструкция импорта:

import org.opencv.core.Point;

Приведем пример использования:

import org.opencv.core.Point;

class Exmpl {

  public static void main(String[] arguments) {
    Point ts = new Point(4, 13);

    System.out.println("Starting location:");
    System.out.println("X equals " + ts.x);
    System.out.println("Y equals " + ts.y);

    System.out.println("\nMoving to (7, 6)");
    ts.x = 7;
    ts.y = 6;

    System.out.println("\nEnding location:");
    System.out.println("X equals " + ts.x);
    System.out.println("Y equals " + ts.y);
  }
}

Основные методы класса Point:
— set() — задает новое значение. Формат метода:
public void set(double[] vals)

— equals() — выполняет сравнение двух точек. Формат метода:
public boolean equals(Object obj)

— clone() — создает копию объекта. Формат метода:
public Point clone()

— inside() — возвращает true, если точка входит в указанную прямоугольную
область. Формат метода:

import org.opencv.core.Rect;
public boolean inside(Rect r)

Также стоит отметить о описывании координаты точки в трехмерном пространстве, с помощью класса Point3, Инструкция импорта:

import org.opencv.core.Point3;
Чтобы не занимать много времени этот класс мы рассматривать не будем, в интернете информации достаточно

Класс Mat: матрица
Класс Mat описывает матрицу, которая, например, служит для хранения изображений. Инструкция импорта:

import org.opencv.core.Mat;

Пример создания пустой матрицы и вывода информации о ней:
Mat m = new Mat();
System.out.println(m.dump()); // []
System.out.println(m.cols()); // 0
System.out.println(m.width()); // 0
System.out.println(m.rows()); // 0
System.out.println(m.height()); // 0

Пример создания матрицы типа CV_8UC1 из трех строк и двух столбцов (каждый
элемент такой матрицы будет иметь один канал, который может содержать
8-битное целое число без знака в диапазоне от 0 до 255):

// import org.opencv.core.CvType;
Mat m = new Mat(3, 2, CvType.CV_8UC1);
System.out.println(m.dump());
/*
[ 0, 0;
0, 0;
0, 0]
*/
System.out.println(m.cols()); // 2
System.out.println(m.width()); // 2
System.out.println(m.rows()); // 3
System.out.println(m.height()); // 3

Матрица из предыдущего примера будет заполнена произвольными значениями (не
обязательно нулями). Чтобы присвоить элементам матрицы начальное значение,
следует использовать параметр s:

Mat m = new Mat(3, 2, CvType.CV_8UC1, new Scalar(1.0));
System.out.println(m.dump());
/*
[ 1, 1;
1, 1;
1, 1]
*/

Создать матрицу, заполненную нулями, позволяет статический метод zeros().
Форматы метода:

public static Mat zeros(int rows, int cols, int type)
public static Mat zeros(Size size, int type)

Создать матрицу, заполненную единицами, позволяет статический метод ones().

Форматы метода:

public static Mat ones(int rows, int cols, int type)
public static Mat ones(Size size, int type)

Получить информацию о размерах матрицы позволяют следующие методы из класса Mat:

— rows() — возвращает количество строк (высоту для изображения). Формат
метода:
public int rows()
— cols() — возвращает количество столбцов (ширину для изображения). Формат
метода:
public int cols()
— width() — возвращает ширину для изображения. Формат метода:
public int width()
— height() — возвращает высоту для изображения. Формат метода:
public int height()
— size() — возвращает размеры изображения (Size(cols, rows)). Формат метода:
public Size size()

Доступ к элементам а так же описания вектора на данном этапе мы упустим, книга, в которой подробно будет описано все пункты: OpenCV и Java. Обработка изображений и компьютерное зрение. Николай Прохоренок. Очень интересная книга, советую, всю информацию я брал с нее и максимально хотел выставить её в коротком формате.
Tags:
компьютерное зрение, opencv, java

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.