Учебники

OpenCV — Краткое руководство

OpenCV — Обзор

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

Давайте начнем главу с определения термина «компьютерное зрение».

Компьютерное зрение

Computer Vision может быть определена как дисциплина, которая объясняет, как реконструировать, прерывать и понимать трехмерную сцену из ее 2D-изображений с точки зрения свойств структуры, присутствующей в сцене. Он занимается моделированием и копированием человеческого зрения с использованием компьютерного программного и аппаратного обеспечения.

Computer Vision значительно перекрывает следующие поля:

  • Обработка изображений — фокусируется на манипулировании изображениями.

  • Распознавание образов — объясняет различные методы классификации образцов.

  • Фотограмметрия — это касается получения точных измерений из изображений.

Обработка изображений — фокусируется на манипулировании изображениями.

Распознавание образов — объясняет различные методы классификации образцов.

Фотограмметрия — это касается получения точных измерений из изображений.

Computer Vision Vs Обработка изображений

Обработка изображений связана с преобразованием изображения в изображение. Вход и выход обработки изображения оба изображения.

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

Приложения компьютерного зрения

Здесь мы перечислили некоторые из основных областей, где интенсивно используется Computer Vision.

Применение робототехники

  • Локализация — определение местоположения робота автоматически

  • навигация

  • Избегание препятствий

  • Сборка (колышек, сварка, покраска)

  • Манипуляции (например, робот-манипулятор PUMA)

  • Human Robot Interaction (HRI) — Интеллектуальная робототехника для взаимодействия и обслуживания людей

Локализация — определение местоположения робота автоматически

навигация

Избегание препятствий

Сборка (колышек, сварка, покраска)

Манипуляции (например, робот-манипулятор PUMA)

Human Robot Interaction (HRI) — Интеллектуальная робототехника для взаимодействия и обслуживания людей

Применение в медицине

  • Классификация и обнаружение (например, классификация повреждения или клеток и обнаружение опухоли)
  • 2D / 3D сегментация
  • 3D реконструкция человеческого органа (МРТ или УЗИ)
  • Визуальная робототехника

Применение промышленной автоматизации

  • Промышленный контроль (обнаружение дефектов)
  • сборочный
  • Считывание штрих-кода и этикетки на упаковке
  • Сортировка объектов
  • Понимание документа (например, OCR)

Приложение безопасности

  • Биометрия (радужная оболочка, отпечаток пальца, распознавание лица)

  • Наблюдение — обнаружение определенных подозрительных действий или поведения

Биометрия (радужная оболочка, отпечаток пальца, распознавание лица)

Наблюдение — обнаружение определенных подозрительных действий или поведения

Транспортное приложение

  • Автономное транспортное средство
  • Безопасность, например, мониторинг бдительности водителя

Особенности библиотеки OpenCV

Используя библиотеку OpenCV, вы можете —

  • Читать и писать изображения

  • Захват и сохранение видео

  • Обрабатывать изображения (фильтровать, преобразовывать)

  • Выполнить обнаружение функции

  • Обнаружение определенных объектов, таких как лица, глаза, автомобили, в видео или изображениях.

  • Проанализируйте видео, т.е. оцените движение в нем, вычтите фон и отследите объекты в нем.

Читать и писать изображения

Захват и сохранение видео

Обрабатывать изображения (фильтровать, преобразовывать)

Выполнить обнаружение функции

Обнаружение определенных объектов, таких как лица, глаза, автомобили, в видео или изображениях.

Проанализируйте видео, т.е. оцените движение в нем, вычтите фон и отследите объекты в нем.

OpenCV изначально разрабатывался на C ++. В дополнение к этому были предоставлены привязки Python и Java. OpenCV работает в различных операционных системах, таких как Windows, Linux, OSx, FreeBSD, Net BSD, Open BSD и т. Д.

В этом руководстве объясняются концепции OpenCV на примерах, использующих привязки Java.

Библиотечные модули OpenCV

Ниже приведены основные библиотечные модули библиотеки OpenCV.

Основная функциональность

Этот модуль охватывает основные структуры данных, такие как Scalar, Point, Range и т. Д., Которые используются для создания приложений OpenCV. В дополнение к этому, он также включает в себя многомерный массив Mat , который используется для хранения изображений. В библиотеку Java OpenCV этот модуль включен как пакет с именем org.opencv.core .

Обработка изображения

Этот модуль охватывает различные операции обработки изображений, такие как фильтрация изображений, геометрические преобразования изображений, преобразование цветового пространства, гистограммы и т. Д. В библиотеку Java OpenCV этот модуль включен как пакет с именем org.opencv.imgproc .

видео

Этот модуль охватывает такие понятия анализа видео, как оценка движения, вычитание фона и отслеживание объекта. В библиотеку Java OpenCV этот модуль включен как пакет с именем org.opencv.video .

Видео ввод / вывод

Этот модуль объясняет захват видео и видеокодеки с использованием библиотеки OpenCV. В библиотеку Java OpenCV этот модуль включен как пакет с именем org.opencv.videoio .

calib3d

Этот модуль включает в себя алгоритмы, касающиеся основных алгоритмов геометрии нескольких видов, калибровки одиночной и стереокамеры, оценки позы объекта, стерео соответствия и элементов трехмерной реконструкции. В библиотеку Java OpenCV этот модуль включен как пакет с именем org.opencv.calib3d .

features2d

Этот модуль включает в себя концепции обнаружения и описания функций. В библиотеку Java OpenCV этот модуль включен как пакет с именем org.opencv.features2d .

Objdetect

Этот модуль включает в себя обнаружение объектов и экземпляров предопределенных классов, таких как лица, глаза, кружки, люди, автомобили и т. Д. В библиотеку Java OpenCV этот модуль включен как пакет с именем org.opencv.objdetect .

Highgui

Это простой в использовании интерфейс с простыми возможностями пользовательского интерфейса. В библиотеке Java OpenCV функции этого модуля включены в два разных пакета, а именно org.opencv.imgcodecs и org.opencv.videoio .

Краткая история OpenCV

OpenCV изначально была исследовательской инициативой Intel для консультирования приложений, интенсивно использующих процессор. Он был официально запущен в 1999 году.

  • В 2006 году была выпущена его первая основная версия, OpenCV 1.0.
  • В октябре 2009 года была выпущена вторая основная версия, OpenCV 2.
  • В августе 2012 года OpenCV была взята некоммерческой организацией OpenCV.org.

OpenCV — Окружающая среда

В этой главе вы узнаете, как установить OpenCV и настроить его среду в вашей системе.

Установка OpenCV

Прежде всего, вам необходимо загрузить OpenCV в вашу систему. Следуйте инструкциям ниже.

Шаг 1 — Откройте домашнюю страницу OpenCV , перейдя по следующей ссылке: http://opencv.org/ При нажатии вы увидите его домашнюю страницу, как показано ниже.

OpenCV HomePage

Шаг 2 — Теперь нажмите на ссылку « Загрузки», выделенную на скриншоте выше. При нажатии вы будете перенаправлены на страницу загрузок OpenCV.

Страница загрузок OpenCV

Шаг 3 — При нажатии на выделенную ссылку на приведенном выше снимке экрана будет загружен файл с именем opencv-3.1.0.exe . Извлеките этот файл, чтобы создать папку opencv в вашей системе, как показано на следующем снимке экрана.

OpenCV скачать

Шаг 4 — Откройте папку OpenCVbuildjava . Здесь вы найдете jar-файл OpenCV с именем opencv-310.jar . Сохраните этот файл в отдельной папке для дальнейшего использования.

Файл OpenCV Jar

Установка Затмения

После загрузки необходимых файлов JAR вы должны внедрить эти файлы JAR в свою среду Eclipse. Вы можете сделать это, установив Build Path для этих файлов JAR и используя pom.xml .

Установка пути сборки

Ниже приведены шаги по настройке OpenCV в Eclipse.

Шаг 1 — Убедитесь, что вы установили Eclipse в вашей системе. Если нет, загрузите и установите Eclipse в своей системе.

Шаг 2. Откройте Eclipse, нажмите «Файл», «Новый» и откройте новый проект, как показано на следующем снимке экрана.

Открытое Затмение

Шаг 3 — При выборе проекта вы получите мастер New Project . В этом мастере выберите проект Java и нажмите кнопку « Далее» , как показано на следующем снимке экрана.

Выберите проект

Шаг 4. В дальнейшем вы будете перенаправлены в мастер New Java Project . Создайте новый проект и нажмите « Далее» , как показано на следующем снимке экрана.

Мастер создания Java-проекта

Шаг 5 — После создания нового проекта, щелкните по нему правой кнопкой мыши. Выберите Build Path и нажмите Configure Build Path…, как показано на следующем снимке экрана.

Выберите путь сборки

Шаг 6 — Нажав на опцию Build Path , вы будете перенаправлены к мастеру Java Build Path . Нажмите кнопку Add External JARs , как показано на следующем снимке экрана.

Нажмите Build Path

Шаг 7 — Выберите путь, по которому вы сохранили файл opencv-310.jar .

Шаг 8 — При нажатии кнопки « Открыть» на приведенном выше снимке экрана эти файлы будут добавлены в вашу библиотеку.

Нажмите кнопку Открыть

Шаг 9 — Нажав OK , вы успешно добавите необходимые JAR-файлы в текущий проект, и вы можете проверить эти добавленные библиотеки, развернув Ссылочные библиотеки.

Нажмите ОК

Установка пути для собственных библиотек

В дополнение к JAR-файлам вам нужно указать путь к собственным библиотекам (DLL-файлам) OpenCV.

Расположение файлов DLL — Откройте папку установки OpenCV и перейдите в подпапку buildjava . Здесь вы найдете две папки x64 (64-битная) и x86 (32-битная), которые содержат DLL- файлы OpenCV.

Расположение DLL-файлов

Откройте соответствующую папку, подходящую для вашей операционной системы, затем вы увидите файл dll , как показано на следующем снимке экрана.

Открыть папку

Теперь также установите путь для этого файла, выполнив шаги, указанные ниже —

Шаг 1 — еще раз откройте окно JavaBuildPath. Здесь вы можете увидеть добавленный файл JAR и Системную библиотеку JRE .

Системная библиотека JRE

Шаг 2 — Расширив его, вы получите системные библиотеки и расположение собственной библиотеки , как показано на следующем снимке экрана.

Местоположение родной библиотеки

Шаг 3 — Дважды щелкните по расположению Native Library . Здесь вы можете увидеть окно «Конфигурация папки родной библиотеки», как показано ниже.

Двойной щелчок по расположению нативной библиотеки

Здесь нажмите кнопку « Внешняя папка» и выберите местоположение файла DLL в вашей системе.

OpenCV — Хранение изображений

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

Класс Mat библиотеки OpenCV используется для хранения значений изображения. Он представляет собой n-мерный массив и используется для хранения данных изображения в градациях серого или цветных изображений, объемов вокселей, векторных полей, облаков точек, тензоров, гистограмм и т. Д.

Этот класс состоит из двух частей данных: заголовок и указатель

  • Заголовок — содержит информацию, такую ​​как размер, метод, используемый для хранения, и адрес матрицы (постоянный по размеру).

  • Указатель — хранит значения пикселей изображения (сохраняет при изменении).

Заголовок — содержит информацию, такую ​​как размер, метод, используемый для хранения, и адрес матрицы (постоянный по размеру).

Указатель — хранит значения пикселей изображения (сохраняет при изменении).

Класс Мат

Java-библиотека OpenCV предоставляет этот класс с тем же именем ( Mat ) в пакете org.opencv.core .

Конструкторы

Класс Mat библиотеки Java OpenCV имеет различные конструкторы, с помощью которых вы можете создавать объекты Mat.

S.No Конструкторы и описание
1

Мат()

Это конструктор по умолчанию, в большинстве случаев без параметров. Мы используем это для конструктора, чтобы создать пустую матрицу и передать это другим методам OpenCV.

2

Mat (int row, int cols, int type)

Этот конструктор принимает три параметра целочисленного типа, представляющих количество строк и столбцов в двумерном массиве и тип массива (который должен использоваться для хранения данных).

3

Mat (int row, int cols, int type, Scalar s)

Включая параметры предыдущего, этот конструктор дополнительно принимает объект класса Scalar в качестве параметра.

4

Мат (размер размер, тип int)

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

5

Мат (размер размер, тип int, скаляр s)

Включая параметры предыдущего, этот конструктор дополнительно принимает объект класса Scalar в качестве параметра.

6

Mat (длинный адрес)

7

Мат (Mat m, Range rowRange)

Этот конструктор принимает объект другой матрицы и объект класса Range, представляющий диапазон строк, которые будут взяты для создания новой матрицы.

8

Mat (Mat m, Range rowRange, Range colRange)

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

9

Мат (Mat m, Rect roi)

Этот конструктор принимает два объекта, один представляет другую матрицу, а другой представляет область интереса.

Мат()

Это конструктор по умолчанию, в большинстве случаев без параметров. Мы используем это для конструктора, чтобы создать пустую матрицу и передать это другим методам OpenCV.

Mat (int row, int cols, int type)

Этот конструктор принимает три параметра целочисленного типа, представляющих количество строк и столбцов в двумерном массиве и тип массива (который должен использоваться для хранения данных).

Mat (int row, int cols, int type, Scalar s)

Включая параметры предыдущего, этот конструктор дополнительно принимает объект класса Scalar в качестве параметра.

Мат (размер размер, тип int)

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

Мат (размер размер, тип int, скаляр s)

Включая параметры предыдущего, этот конструктор дополнительно принимает объект класса Scalar в качестве параметра.

Mat (длинный адрес)

Мат (Mat m, Range rowRange)

Этот конструктор принимает объект другой матрицы и объект класса Range, представляющий диапазон строк, которые будут взяты для создания новой матрицы.

Mat (Mat m, Range rowRange, Range colRange)

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

Мат (Mat m, Rect roi)

Этот конструктор принимает два объекта, один представляет другую матрицу, а другой представляет область интереса.

Примечание

  • Тип массива. Используйте CV_8UC1, …, CV_64FC4 для создания 1-4 канальных матриц или CV_8UC (n), …, CV_64FC (n) для создания многоканальных (до каналов CV_CN_MAX) матриц.

  • Тип матриц был представлен различными полями класса CvType, который принадлежит пакету org.opencv.core .

Тип массива. Используйте CV_8UC1, …, CV_64FC4 для создания 1-4 канальных матриц или CV_8UC (n), …, CV_64FC (n) для создания многоканальных (до каналов CV_CN_MAX) матриц.

Тип матриц был представлен различными полями класса CvType, который принадлежит пакету org.opencv.core .

Методы и описание

Ниже приведены некоторые методы класса Mat.

S.No Методы и описание
1

Циновка (int x)

Этот метод принимает целочисленный параметр, представляющий индекс столбца, а также извлекает и возвращает этот столбец.

2

Мат ряд (int y)

Этот метод принимает целочисленный параметр, представляющий индекс строки, и извлекает и возвращает эту строку.

3

int cols ()

Этот метод возвращает количество столбцов в матрице.

4

int row ()

Этот метод возвращает количество строк в матрице.

5

Mat setTo (значение Mat)

Этот метод принимает объект типа Mat и устанавливает элементы массива в указанное значение.

6

Коврик SetTo (Скалярные s)

Этот метод принимает объект типа Scalar и устанавливает элементы массива в указанное значение.

Циновка (int x)

Этот метод принимает целочисленный параметр, представляющий индекс столбца, а также извлекает и возвращает этот столбец.

Мат ряд (int y)

Этот метод принимает целочисленный параметр, представляющий индекс строки, и извлекает и возвращает эту строку.

int cols ()

Этот метод возвращает количество столбцов в матрице.

int row ()

Этот метод возвращает количество строк в матрице.

Mat setTo (значение Mat)

Этот метод принимает объект типа Mat и устанавливает элементы массива в указанное значение.

Коврик SetTo (Скалярные s)

Этот метод принимает объект типа Scalar и устанавливает элементы массива в указанное значение.

Создание и отображение матрицы

В этом разделе мы собираемся обсудить наш первый пример OpenCV. Мы увидим, как создать и отобразить простую матрицу OpenCV.

Ниже приведены шаги, которые необходимо выполнить для создания и отображения матрицы в OpenCV.

Шаг 1: Загрузите собственную библиотеку OpenCV

При написании кода Java с использованием библиотеки OpenCV первый шаг, который вам нужно сделать, это загрузить собственную библиотеку OpenCV с помощью loadLibrary () . Загрузите собственную библиотеку OpenCV, как показано ниже.

//Loading the core library 
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Шаг 2: Создание класса Mat

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

//Creating a matrix 
Mat matrix = new Mat(5, 5, CvType.CV_8UC1, new Scalar(0));

Шаг 3: Заполните матрицу, используя методы

Вы можете получить определенные строки / столбцы матрицы, передав значения индекса в методы row () / col () .

И вы можете установить значения для них, используя любой из вариантов методов setTo () .

//Retrieving the row with index 0 
Mat row0 = matrix.row(0); 
     
//setting values of all elements in the row with index 0 
row0.setTo(new Scalar(1)); 
     
//Retrieving the row with index 3 
Mat col3 = matrix.col(3);  
     
//setting values of all elements in the row with index 3 
col3.setTo(new Scalar(3));

пример

Вы можете использовать следующий программный код для создания и отображения простой матрицы в Java с использованием библиотеки OpenCV.

import org.opencv.core.Core; 
import org.opencv.core.Mat;  
import org.opencv.core.CvType;  
import org.opencv.core.Scalar;   

class DisplayingMatrix { 
   public static void main(String[] args) {     
      //Loading the core library 
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);     

      //Creating a matrix 
      Mat matrix = new Mat(5, 5, CvType.CV_8UC1, new Scalar(0));  

      //Retrieving the row with index 0 
      Mat row0 = matrix.row(0);

      //setting values of all elements in the row with index 0 
      row0.setTo(new Scalar(1)); 

      //Retrieving the row with index 3 
      Mat col3 = matrix.col(3);  

      //setting values of all elements in the row with index 3 
      col3.setTo(new Scalar(3)); 

      //Printing the matrix 
      System.out.println("OpenCV Mat data:\n" + matrix.dump()); 
   } 
}

Выполнив вышеуказанную программу, вы получите следующий вывод:

OpenCV Mat data: 
[  1,   1,   1,   3,   1; 
   0,   0,   0,   3,   0; 
   0,   0,   0,   3,   0; 
   0,   0,   0,   3,   0; 
   0,   0,   0,   3,   0]

Загрузка изображения с использованием JavaSE API

Класс BufferedImage пакета java.awt.image.BufferedImage используется для хранения изображения, а класс ImageIO пакета import javax.imageio предоставляет методы для чтения и записи изображений.

пример

Вы можете использовать следующий программный код для загрузки и сохранения изображений с использованием библиотеки JavaSE.

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO;
  
public class LoadingImage_JSE_library {
   public static void main( String[] args ) throws IOException {
      //Input File 
      File input = new File("C:/EXAMPLES/OpenCV/sample.jpg");
          
      //Reading the image 
      BufferedImage image = ImageIO.read(input);
      
      //Saving the image with a different name
      File ouptut = new File("C:/OpenCV/sample.jpg");
      ImageIO.write(image, "jpg", ouptut);
         
      System.out.println("image Saved");
   } 
}

Выполнив вышеуказанную программу, вы получите следующий вывод:

image Saved

Если вы откроете указанный путь, вы можете наблюдать сохраненное изображение следующим образом —

Загрузка изображения с использованием JavaSE API

OpenCV — чтение изображений

Класс Imgcodecs пакета org.opencv.imgcodecs предоставляет методы для чтения и записи изображений. Используя OpenCV, вы можете прочитать изображение и сохранить его в матрице (выполнить преобразования в матрице при необходимости). Позже вы можете записать обработанную матрицу в файл.

Метод read () класса Imgcodecs используется для чтения изображения с использованием OpenCV. Ниже приводится синтаксис этого метода.

imread(filename)

Он принимает аргумент (имя файла) , переменную типа String, представляющую путь к файлу, который должен быть прочитан.

Ниже приведены шаги, которые необходимо выполнить для чтения изображений в Java с использованием библиотеки OpenCV.

Шаг 1: Загрузите собственную библиотеку OpenCV

Загрузите собственную библиотеку OpenCV, используя метод load () , как показано ниже.

//Loading the core library 
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Шаг 2: Создание класса Imgcodecs

Создание экземпляра класса Imgcodecs .

//Instantiating the Imgcodecs class 
Imgcodecs imageCodecs = new Imgcodecs();

Шаг 3: Чтение изображения

Прочитайте изображение, используя метод imread () . Этот метод принимает строковый аргумент, представляющий путь к изображению, и возвращает изображение, считанное как объект Mat .

//Reading the Image from the file  
Mat matrix = imageCodecs.imread(Path of the image);

пример

Следующий программный код показывает, как вы можете прочитать изображение с помощью библиотеки OpenCV.

import org.opencv.core.Core; 
import org.opencv.core.Mat;  
import org.opencv.imgcodecs.Imgcodecs;
 
public class ReadingImages {
   public static void main(String args[]) { 
      //Loading the OpenCV core library  
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); 
     
      //Instantiating the Imagecodecs class 
      Imgcodecs imageCodecs = new Imgcodecs(); 
     
      //Reading the Image from the file  
      String file ="C:/EXAMPLES/OpenCV/sample.jpg"; 
      Mat matrix = imageCodecs.imread(file); 
     
      System.out.println("Image Loaded");     
   } 
}

При выполнении вышеуказанной программы OpenCV загружает указанное изображение и отображает следующий вывод:

Image Loaded

OpenCV — написание изображения

Метод write () класса Imgcodecs используется для записи изображения с использованием OpenCV. Чтобы написать изображение, повторите первые три шага из предыдущего примера.

Чтобы написать изображение, вам нужно вызвать метод imwrite () класса Imgcodecs .

Ниже приводится синтаксис этого метода.

imwrite(filename, mat)

Этот метод принимает следующие параметры —

  • filenameстроковая переменная, представляющая путь, куда сохранить файл.

  • mat — объект Mat, представляющий изображение для записи.

filenameстроковая переменная, представляющая путь, куда сохранить файл.

mat — объект Mat, представляющий изображение для записи.

пример

Следующая программа является примером написания изображения с использованием Java-программы с использованием библиотеки OpenCV.

import org.opencv.core.Core; 
import org.opencv.core.Mat; 
import org.opencv.imgcodecs.Imgcodecs;
 
public class WritingImages {  
   public static void main(String args[]) { 
      //Loading the OpenCV core library  
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
      
      //Instantiating the imagecodecs class 
      Imgcodecs imageCodecs = new Imgcodecs(); 

      //Reading the Image from the file and storing it in to a Matrix object 
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";   
      Mat matrix = imageCodecs.imread(file); 

      System.out.println("Image Loaded ..........");
      String file2 = "C:/EXAMPLES/OpenCV/sample_resaved.jpg"; 

      //Writing the image 
      imageCodecs.imwrite(file2, matrix); 
      System.out.println("Image Saved ............"); 
   } 
}

Выполнив вышеуказанную программу, вы получите следующий вывод:

Image Loaded .......... 
Image Saved ...........

Если вы откроете указанный путь, вы можете наблюдать сохраненное изображение, как показано ниже —

Написать изображение

OpenCV — GUI

В предыдущих главах мы обсуждали, как читать и сохранять изображение с помощью Java-библиотеки OpenCV. В дополнение к этому, мы также можем отображать загруженные изображения в отдельном окне, используя библиотеки GUI, такие как AWT / Swings и JavaFX.

Преобразование мата в буферизованное изображение

Для чтения изображения мы используем метод imread () . Этот метод возвращает изображение, прочитанное в форме Matrix . Но, чтобы использовать это изображение с библиотеками GUI (AWT / Swings и JavaFX), его следует преобразовать как объект класса BufferedImage пакета java.awt.image.BufferedImage .

Ниже приведены шаги для преобразования объекта Mat из OpenCV в объект BufferedImage .

Шаг 1: закодировать мат в MatOfByte

Прежде всего, вам необходимо преобразовать матрицу в матрицу байта. Вы можете сделать это, используя метод imencode () класса Imgcodecs . Ниже приводится синтаксис этого метода.

imencode(ext, image, matOfByte);

Этот метод принимает следующие параметры —

  • Ext — параметр String, указывающий формат изображения (.jpg, .png и т. Д.)

  • изображение — Матовый объект изображения

  • matOfByte — пустой объект класса MatOfByte

Ext — параметр String, указывающий формат изображения (.jpg, .png и т. Д.)

изображение — Матовый объект изображения

matOfByte — пустой объект класса MatOfByte

Кодируйте изображение, используя этот метод, как показано ниже.

//Reading the image 
Mat image = Imgcodecs.imread(file);

//instantiating an empty MatOfByte class 
MatOfByte matOfByte = new MatOfByte();

//Converting the Mat object to MatOfByte 
Imgcodecs.imencode(".jpg", image, matOfByte);

Шаг 2: преобразовать объект MatOfByte в байтовый массив

Преобразуйте объект MatOfByte в байтовый массив, используя метод toArray () .

byte[] byteArray = matOfByte.toArray();

Шаг 3: Подготовка объекта InputStream

Подготовьте объект InputStream, передав байтовый массив, созданный на предыдущем шаге, в конструктор класса ByteArrayInputStream .

//Preparing the InputStream object 
InputStream in = new ByteArrayInputStream(byteArray);

Шаг 4: Подготовка объекта InputStream

Передайте объект Input Stream, созданный на предыдущем шаге, в метод read () класса ImageIO . Это вернет объект BufferedImage.

//Preparing the BufferedImage 
BufferedImage bufImage = ImageIO.read(in);

Отображение изображения с помощью AWT / Swings

Чтобы отобразить изображение с помощью фрейма AWT / Swings, сначала прочитайте изображение с помощью метода imread () и преобразуйте его в BufferedImage, выполнив вышеупомянутые шаги.

Затем создайте экземпляр класса JFrame и добавьте буферизованное изображение, созданное в ContentPane JFrame, как показано ниже:

//Instantiate JFrame 
JFrame frame = new JFrame();
 
//Set Content to the JFrame 
frame.getContentPane().add(new JLabel(new ImageIcon(bufImage))); 
frame.pack(); 
frame.setVisible(true);

пример

Следующий программный код показывает, как вы можете прочитать изображение и отобразить его через окно свинга, используя библиотеку OpenCV.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;

public class DisplayingImagesUsingSwings {
   public static void main(String args[]) throws Exception { 
      //Loading the OpenCV core library  
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); 
    
      //Reading the Image from the file and storing it in to a Matrix object 
      String file = "C:/EXAMPLES/OpenCV/sample.jpg"; 
      Mat image = Imgcodecs.imread(file); 
    
      //Encoding the image 
      MatOfByte matOfByte = new MatOfByte();       
      Imgcodecs.imencode(".jpg", image, matOfByte); 

      //Storing the encoded Mat in a byte array 
      byte[] byteArray = matOfByte.toArray(); 

      //Preparing the Buffered Image 
      InputStream in = new ByteArrayInputStream(byteArray); 
      BufferedImage bufImage = ImageIO.read(in); 

      //Instantiate JFrame 
      JFrame frame = new JFrame(); 

      //Set Content to the JFrame 
      frame.getContentPane().add(new JLabel(new ImageIcon(bufImage))); 
      frame.pack(); 
      frame.setVisible(true);
      
      System.out.println("Image Loaded");     
   } 
}

Выполнив вышеуказанную программу, вы получите следующий вывод:

Image Loaded

Кроме того, вы можете увидеть окно, отображающее загруженное изображение, как показано ниже:

Отображение изображения с помощью Swings

Отображение изображения с использованием JavaFX

Для отображения изображения с использованием JavaFX, прежде всего, прочитайте изображение с помощью метода imread () и преобразуйте его в BufferedImage . Затем преобразуйте BufferedImage в WritableImage, как показано ниже.

WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

Передайте этот объект WritableImage в конструктор класса ImageView .

ImageView imageView = new ImageView(writableImage);

пример

Следующий программный код показывает, как прочитать изображение и отобразить его через окно JavaFX с помощью библиотеки OpenCV.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import javax.imageio.ImageIO;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;

public class DisplayingImagesJavaFX extends Application {
   @Override 
   public void start(Stage stage) throws IOException {   
      WritableImage writableImage = loadImage(); 
  
      //Setting the image view 
      ImageView imageView = new ImageView(writableImage); 
        
      //Setting the position of the image 
      imageView.setX(50); 
      imageView.setY(25); 
        
      //setting the fit height and width of the image view 
      imageView.setFitHeight(400); 
      imageView.setFitWidth(500);
      
      //Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);
      
      //Creating a Group object  
      Group root = new Group(imageView);
      
      //Creating a scene object
      Scene scene = new Scene(root, 600, 400);
      
      //Setting title to the Stage 
      stage.setTitle("Loading an image");
      
      //Adding scene to the stage
      stage.setScene(scene);

      //Displaying the contents of the stage
      stage.show();
   } 
   public WritableImage loadImage() throws IOException {
      //Loading the OpenCV core library  
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
      
      //Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat image = Imgcodecs.imread(file);
      
      //Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", image, matOfByte);

      //Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();
      
      //Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray); 
      BufferedImage bufImage = ImageIO.read(in);

      System.out.println("Image Loaded");
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage; 
   }
   public static void main(String args[]) {
      launch(args); 
   } 
}

Выполнив вышеуказанную программу, вы получите следующий вывод:

Image Loaded

Кроме того, вы можете увидеть окно, отображающее загруженное изображение, как показано ниже:

Отображение изображения с использованием JavaFX

OpenCV — флаг IMREAD_XXX

OpenCV поддерживает различные типы изображений, такие как цветные, двоичные, оттенки серого и т. Д. Используя метод imread () и предопределенные поля класса Imgcodecs , вы можете прочитать данное изображение как другой тип.

Параметр flags метода imread () (IMREAD_XXX)

В предыдущих главах мы видели синтаксис метода imread () класса Imgcodecs . Он принимает строковый аргумент, представляющий местоположение изображения, которое должно быть прочитано.

imread(filename)

Метод imread () имеет другой синтаксис.

imread(filename, int flags)

Этот синтаксис принимает два параметра —

  • filename — принимает аргумент (filename) , переменную типа String, представляющую путь к файлу, который должен быть прочитан.

  • flags — Целочисленное значение, представляющее предопределенное значение флага. Для каждого значения это читает данное изображение как определенный тип (цвет серой шкалы и т. Д.)

filename — принимает аргумент (filename) , переменную типа String, представляющую путь к файлу, который должен быть прочитан.

flags — Целочисленное значение, представляющее предопределенное значение флага. Для каждого значения это читает данное изображение как определенный тип (цвет серой шкалы и т. Д.)

Ниже приведена таблица, в которой перечислены различные поля, представленные в классе Imgproc, в качестве значений для этого параметра.

S.No Поля и описание
1

IMREAD_COLOR

Если для флага установлено это значение, загруженное изображение будет преобразовано в 3-канальное цветное изображение BGR (синий, зеленый, красный).

2

IMREAD_GRAYSCALE

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

3

IMREAD_LOAD_GDAL

Если флаг установлен на это значение, вы можете загрузить изображение с помощью драйвера gdal .

4

IMREAD_ANYCOLOR

Если для флага установлено это значение, изображение читается в любом возможном цветовом формате.

5

IMREAD_REDUCED_COLOR_2

IMREAD_REDUCED_COLOR_4

IMREAD_REDUCED_COLOR_8

Если флаг установлен на это значение, изображение считывается как трехканальный BGR, а размер изображения уменьшается до ½, ¼ или of от исходного размера изображения относительно используемого поля.

6

IMREAD_REDUCED_GRAYSCALE_2

IMREAD_REDUCED_GRAYSCALE_4

IMREAD_REDUCED_GRAYSCALE_8

Если для флага установлено это значение, изображение считывается как одноканальное изображение в градациях серого, а размер изображения уменьшается до ½, ¼ или of от исходного размера изображения по отношению к используемому полю. ,

7

IMREAD_UNCHANGED

Если для флага установлено это значение, загруженное изображение возвращается как есть.

IMREAD_COLOR

Если для флага установлено это значение, загруженное изображение будет преобразовано в 3-канальное цветное изображение BGR (синий, зеленый, красный).

IMREAD_GRAYSCALE

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

IMREAD_LOAD_GDAL

Если флаг установлен на это значение, вы можете загрузить изображение с помощью драйвера gdal .

IMREAD_ANYCOLOR

Если для флага установлено это значение, изображение читается в любом возможном цветовом формате.

IMREAD_REDUCED_COLOR_2

IMREAD_REDUCED_COLOR_4

IMREAD_REDUCED_COLOR_8

Если флаг установлен на это значение, изображение считывается как трехканальный BGR, а размер изображения уменьшается до ½, ¼ или of от исходного размера изображения относительно используемого поля.

IMREAD_REDUCED_GRAYSCALE_2

IMREAD_REDUCED_GRAYSCALE_4

IMREAD_REDUCED_GRAYSCALE_8

Если для флага установлено это значение, изображение считывается как одноканальное изображение в градациях серого, а размер изображения уменьшается до ½, ¼ или of от исходного размера изображения по отношению к используемому полю. ,

IMREAD_UNCHANGED

Если для флага установлено это значение, загруженное изображение возвращается как есть.

OpenCV — чтение изображения в градациях серого

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

import java.awt.image.BufferedImage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

public class ReadingAsGrayscale extends Application {
   @Override
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);
      
      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);
      
      // Creating a Group object  
      Group root = new Group(imageView);
      
      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);
      
      // Setting title to the Stage
      stage.setTitle("Reading image as grayscale");
      
      // Adding scene to the stage
      stage.setScene(scene);
      
      // Displaying the contents of the stage
      stage.show();
   } 
   public WritableImage loadAndConvert() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the imagecodecs class
      Imgcodecs imageCodecs = new Imgcodecs();

      String input = "C:/EXAMPLES/OpenCV/sample.jpg";

      // Reading the image
      Mat src = imageCodecs.imread(input, Imgcodecs.IMREAD_GRAYSCALE);
       
      byte[] data1 = new byte[src.rows() * src.cols() * (int)(src.elemSize())];
      src.get(0, 0, data1);
      
      // Creating the buffered image
      BufferedImage bufImage = new BufferedImage(src.cols(),src.rows(), 
         BufferedImage.TYPE_BYTE_GRAY);
      
      // Setting the data elements to the image
      bufImage.getRaster().setDataElements(0, 0, src.cols(), src.rows(), data1);
              
      // Creating a WritableImage
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      System.out.println("Image Read");
      return writableImage;
   } 
   public static void main(String args[]) throws Exception { 
      launch(args); 
   } 
}

Входное изображение

Предположим, что ниже указано входное изображение sample.jpg, указанное в вышеуказанной программе.

Образец изображения

Выходное изображение

При выполнении программы вы получите следующий вывод.

GrayScale Выходное изображение

OpenCV — чтение изображения как BGR

Следующая программа демонстрирует, как прочитать цветное изображение как изображение типа BGR и отобразить его с помощью окна JavaFX. Здесь мы прочитали изображение, передав флаг IMREAD_COLOR методу imread () вместе со строкой, содержащей путь цветного изображения.

import java.awt.image.BufferedImage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

public class ReadingAsColored extends Application {
   @Override 
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();
       
      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);
      
      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);
      
      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);
     
      // Setting title to the Stage
      stage.setTitle("Reading as colored image");

      // Adding scene to the stage
      stage.setScene(scene);
      
      // Displaying the contents of the stage
      stage.show();
   } 
   public WritableImage loadAndConvert() throws Exception {     
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
       
      String input = "C:/EXAMPLES/OpenCV/sample.jpg";
       
      Mat dst = new Mat();

      // Reading the image
      Mat src = Imgcodecs.imread(input, Imgcodecs.IMREAD_COLOR);

      byte[] data1 = new byte[src.rows() * src.cols() * (int)(src.elemSize())]; 
      src.get(0, 0, data1);
      
      // Creating the buffered image
      BufferedImage bufImage = new BufferedImage(src.cols(),src.rows(), 
         BufferedImage.TYPE_3BYTE_BGR);

      // Setting the data elements to the image 
      bufImage.getRaster().setDataElements(0, 0, src.cols(), src.rows(), data1);

      // Creating a WritableImage
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      System.out.println("Image read");
      return writableImage;
   } 
   public static void main(String args[]) throws Exception {
      launch(args);
   } 
}

Входное изображение

Предположим, что ниже указано входное изображение sample.jpg, указанное в вышеуказанной программе.

Образец изображения

Выходное изображение

При выполнении программы вы получите следующий вывод.

BGR выходное изображение

OpenCV — Цветные изображения в GrayScale

В предыдущих главах мы обсуждали, как читать входное изображение в виде различных типов (двоичный файл, оттенки серого, BGR и т. Д.). В этой главе мы узнаем, как преобразовать один тип изображения в другой.

Класс с именем Imgproc пакета org.opencv.imgproc предоставляет методы для преобразования изображения из одного цвета в другой.

Преобразование цветных изображений в оттенки серого

Метод с именем cvtColor () используется для преобразования цветных изображений в оттенки серого. Ниже приводится синтаксис этого метода.

cvtColor(Mat src, Mat dst, int code)

Этот метод принимает следующие параметры —

  • src — матрица, представляющая источник.

  • dst — матрица, представляющая пункт назначения.

  • code — Целочисленный код, представляющий тип преобразования, например, RGB в оттенки серого.

src — матрица, представляющая источник.

dst — матрица, представляющая пункт назначения.

code — Целочисленный код, представляющий тип преобразования, например, RGB в оттенки серого.

Цветные изображения можно преобразовать в оттенки серого, передав код Imgproc.COLOR_RGB2GRAY вместе с исходной и целевой матрицами в качестве параметра для метода cvtColor () .

пример

Следующая программа демонстрирует, как читать цветное изображение как изображение в градациях серого и отображать его в окне JavaFX.

import java.awt.image.BufferedImage;
  
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;

import javafx.stage.Stage;

public class ColorToGrayscale extends Application {
   @Override
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();
       
      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Colored to grayscale image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   } 
   public WritableImage loadAndConvert() throws Exception {
      //Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      String input = "C:/EXAMPLES/OpenCV/sample.jpg";

      //Reading the image
      Mat src = Imgcodecs.imread(input);

      //Creating the empty destination matrix
      Mat dst = new Mat();

      //Converting the image to gray sacle and saving it in the dst matrix
      Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2GRAY);
      
      //Extracting data from the transformed image (dst)
      byte[] data1 = new byte[dst.rows() * dst.cols() * (int)(dst.elemSize())];
      dst.get(0, 0, data1);

      //Creating Buffered image using the data
      BufferedImage bufImage = new BufferedImage(dst.cols(),dst.rows(), 
         BufferedImage.TYPE_BYTE_GRAY);

      //Setting the data elements to the image
      bufImage.getRaster().setDataElements(0, 0, dst.cols(), dst.rows(), data1);

      //Creating a WritableImage
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      System.out.println("Converted to Grayscale");
      return writableImage;
   }
   public static void main(String args[]) throws Exception {
      launch(args);
   }
}

Входное изображение

Предположим, что ниже указано входное изображение sample.jpg, указанное в вышеуказанной программе.

Образец изображения

Выходное изображение

При выполнении программы вы получите следующий вывод.

Цветные изображения в выводе GrayScale

OpenCV — цветное изображение в двоичный

Метод под названием threshold () используется для преобразования изображений в градациях серого в двоичное изображение. Ниже приводится синтаксис этого метода.

threshold(Mat src, Mat dst, double thresh, double maxval, int type)

Этот метод принимает следующие параметры —

  • mat — объект Mat, представляющий входное изображение.

  • dst — объект Mat, представляющий выходное изображение.

  • thresh — Целое число, представляющее пороговое значение.

  • maxval — целое число, представляющее максимальное значение для использования с типами порогов THRESH_BINARY и THRESH_BINARY_INV.

  • type — Целочисленный код, представляющий тип преобразования, например, RGB в оттенки серого.

mat — объект Mat, представляющий входное изображение.

dst — объект Mat, представляющий выходное изображение.

thresh — Целое число, представляющее пороговое значение.

maxval — целое число, представляющее максимальное значение для использования с типами порогов THRESH_BINARY и THRESH_BINARY_INV.

type — Целочисленный код, представляющий тип преобразования, например, RGB в оттенки серого.

Вы можете преобразовать изображение в градациях серого в двоичное изображение, передав код Imgproc.THRESH_BINARY вместе со значениями оставшимся параметрам.

пример

Следующая программа демонстрирует, как читать цветное изображение как двоичное изображение и отображать его с помощью окна JavaFX.

import java.awt.image.BufferedImage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

public class ColorToBinary extends Application {
   @Override
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);
      
      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);
      
      // Setting title to the Stage
      stage.setTitle("Loading an image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage loadAndConvert() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the Imgcodecs class
      Imgcodecs imageCodecs = new Imgcodecs();
        
      // File input = new File("C:/EXAMPLES/OpenCV/sample.jpg");
      String input = "C:/EXAMPLES/OpenCV/sample.jpg";

      // Reading the image
      Mat src = imageCodecs.imread(input);

      // Creating the destination matrix
      Mat dst = new Mat();

      // Converting to binary image...
      Imgproc.threshold(src, dst, 200, 500, Imgproc.THRESH_BINARY);

      // Extracting data from the transformed image (dst)
      byte[] data1 = new byte[dst.rows() * dst.cols() * (int)(dst.elemSize())];
      dst.get(0, 0, data1);

      // Creating Buffered image using the data
      BufferedImage bufImage = new BufferedImage(dst.cols(),dst.rows(), 
         BufferedImage.TYPE_BYTE_GRAY);

      // Setting the data elements to the image
      bufImage.getRaster().setDataElements(0, 0, dst.cols(), dst.rows(), data1);

      // Creating a Writable image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      System.out.println("Converted to binary");
      return writableImage;
   }  
   public static void main(String args[]) throws Exception {
      launch(args);
   }
}

Входное изображение

Предположим, что ниже указано входное изображение sample.jpg, указанное в вышеуказанной программе.

Образец изображения

Выходное изображение

При выполнении программы вы получите следующий вывод.

Цветное изображение в двоичный вывод

OpenCV — Оттенки серого до бинарных

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

пример

Следующая программа демонстрирует, как читать изображение в градациях серого как двоичное изображение и отображать его в окне JavaFX.

import java.awt.image.BufferedImage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

public class GrayScaleToBinary extends Application {
   @Override
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();
       
      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);
      
      // Setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Grayscale to binary image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage loadAndConvert() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the imagecodecs class
      Imgcodecs imageCodecs = new Imgcodecs();

      String input = "E:/OpenCV/chap7/grayscale.jpg";

      // Reading the image
      Mat src = imageCodecs.imread(input);

      // Creating the destination matrix
      Mat dst = new Mat();

      // Converting to binary image...
      Imgproc.threshold(src, dst, 200, 500, Imgproc.THRESH_BINARY);

      // Extracting data from the transformed image (dst)
      byte[] data1 = new byte[dst.rows() * dst.cols() * (int)(dst.elemSize())];
      dst.get(0, 0, data1);

      // Creating Buffered image using the data
      BufferedImage bufImage = new BufferedImage(dst.cols(),dst.rows(), 
         BufferedImage.TYPE_BYTE_BINARY);

      // Setting the data elements to the image
      bufImage.getRaster().setDataElements(0, 0, dst.cols(), dst.rows(), data1);

      // Creating a Writable image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      System.out.println("Converted to binary");
      return writableImage;
   }
   public static void main(String args[]) throws Exception {
      launch(args);
   }
}

Входное изображение

Предположим, что ниже указано входное изображение sample.jpg, указанное в вышеуказанной программе.

Образец изображения

Выходное изображение

При выполнении программы вы получите следующий вывод.

GrayScale в бинарный

OpenCV — рисование круга

Вы можете рисовать на изображении различные формы, такие как круг, прямоугольник, линия, эллипс, полилинии, выпуклые, полилинии, полилинии, используя соответствующие методы пакета org.opencv.imgproc .

Вы можете нарисовать окружность на изображении, используя метод circle () класса imgproc . Ниже приводится синтаксис этого метода —

circle(img, center, radius, color, thickness)

Этот метод принимает следующие параметры —

  • mat — объект Mat, представляющий изображение, на котором должен быть нарисован круг.

  • точка — объект Point, представляющий центр круга.

  • radius — переменная типа integer, представляющая радиус круга.

  • скалярскалярный объект, представляющий цвет круга. (БГР)

  • толщинацелое число, представляющее толщину круга; по умолчанию значение толщины равно 1.

mat — объект Mat, представляющий изображение, на котором должен быть нарисован круг.

точка — объект Point, представляющий центр круга.

radius — переменная типа integer, представляющая радиус круга.

скалярскалярный объект, представляющий цвет круга. (БГР)

толщинацелое число, представляющее толщину круга; по умолчанию значение толщины равно 1.

пример

Следующая программа демонстрирует, как нарисовать круг на изображении и отобразить его с помощью окна JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingCircle extends Application {
   Mat matrix = null;
   
   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingCircle obj = new DrawingCircle();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing Circle on the image");
      
      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }      
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      //Drawing a Circle
      Imgproc.circle (
         matrix,                 //Matrix obj of the image
         new Point(230, 160),    //Center of the circle
         100,                    //Radius
         new Scalar(0, 0, 255),  //Scalar object for color
         10                      //Thickness of the circle
      );
      
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      this.matrix = matrix;
      
      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Выполнив вышеуказанную программу, вы получите следующий вывод:

Рисование круга

OpenCV — рисование линии

Вы можете нарисовать линию на изображении, используя метод line () класса imgproc . Ниже приводится синтаксис этого метода.

line(img, pt1, pt2, color, thickness)

Этот метод принимает следующие параметры —

  • mat — объект Mat, представляющий изображение, на котором должна быть нарисована линия.

  • pt1 и pt2 — объекты двух точек, представляющие точки, между которыми должна быть проведена линия.

  • скалярскалярный объект, представляющий цвет круга. (БГР)

  • толщина — целое число, представляющее толщину линии; по умолчанию значение толщины равно 1.

mat — объект Mat, представляющий изображение, на котором должна быть нарисована линия.

pt1 и pt2 — объекты двух точек, представляющие точки, между которыми должна быть проведена линия.

скалярскалярный объект, представляющий цвет круга. (БГР)

толщина — целое число, представляющее толщину линии; по умолчанию значение толщины равно 1.

пример

Следующая программа демонстрирует, как нарисовать линию на изображении и отобразить ее с помощью окна JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingLine extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
   
      // Capturing the snapshot from the camera
      DrawingLine obj = new DrawingLine();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object  
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing a line on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      // Drawing a line
      Imgproc.line (
         matrix,                    //Matrix obj of the image
         new Point(10, 200),        //p1
         new Point(300, 200),       //p2
         new Scalar(0, 0, 255),     //Scalar object for color
         5                          //Thickness of the line
      );
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);

      this.matrix = matrix;

      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Выполнив вышеуказанную программу, вы получите следующий вывод:

Рисование линии

OpenCV — рисование прямоугольника

Вы можете нарисовать прямоугольник на изображении, используя метод rectangle () класса imgproc . Ниже приводится синтаксис этого метода —

rectangle(img, pt1, pt2, color, thickness)

Этот метод принимает следующие параметры —

  • mat — объект Mat, представляющий изображение, на котором должен быть нарисован прямоугольник.

  • pt1 и pt2 — два объекта Point, представляющие вершины прямоугольника, который должен быть нарисован.

  • scalarСкалярный объект, представляющий цвет прямоугольника. (БГР)

  • толщина — целое число, представляющее толщину прямоугольника; по умолчанию значение толщины равно 1.

mat — объект Mat, представляющий изображение, на котором должен быть нарисован прямоугольник.

pt1 и pt2 — два объекта Point, представляющие вершины прямоугольника, который должен быть нарисован.

scalarСкалярный объект, представляющий цвет прямоугольника. (БГР)

толщина — целое число, представляющее толщину прямоугольника; по умолчанию значение толщины равно 1.

пример

В следующем примере показано, как нарисовать прямоугольник на изображении и отобразить его с помощью окна JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingRectangle extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingRectangle obj = new DrawingRectangle();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing Rectangle on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      // Drawing a Rectangle
      Imgproc.rectangle (
         matrix,                    //Matrix obj of the image
         new Point(130, 50),        //p1
         new Point(300, 280),       //p2
         new Scalar(0, 0, 255),     //Scalar object for color
         5                          //Thickness of the line
      );
      
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);

      this.matrix = matrix;

      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Выполнив вышеуказанную программу, вы получите следующий вывод:

Рисование прямоугольника

OpenCV — рисование эллипса

Вы можете нарисовать эллипс на изображении, используя метод rectangle () класса imgproc . Ниже приводится синтаксис этого метода —

ellipse(img, box, color, thickness)

Этот метод принимает следующие параметры —

  • mat — объект Mat, представляющий изображение, на котором должен быть нарисован прямоугольник.

  • box — объект RotatedRect (эллипс нарисован вписанным в этот прямоугольник.)

  • скалярскалярный объект, представляющий цвет прямоугольника. (БГР)

  • толщина — целое число, представляющее толщину прямоугольника; по умолчанию значение толщины равно 1.

mat — объект Mat, представляющий изображение, на котором должен быть нарисован прямоугольник.

box — объект RotatedRect (эллипс нарисован вписанным в этот прямоугольник.)

скалярскалярный объект, представляющий цвет прямоугольника. (БГР)

толщина — целое число, представляющее толщину прямоугольника; по умолчанию значение толщины равно 1.

Конструктор класса RotatedRect принимает объект класса Point , объект класса Size и переменную типа double, как показано ниже.

RotatedRect(Point c, Size s, double a)

пример

Следующая программа демонстрирует, как нарисовать эллипс на изображении и отобразить его с помощью окна JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.RotatedRect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingEllipse extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingEllipse obj = new DrawingEllipse();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing Ellipse on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      // Drawing an Ellipse
      Imgproc.ellipse (
         matrix,                          //Matrix obj of the image
         new RotatedRect (                // RotatedRect(Point c, Size s, double a)
            new Point(200, 150),
            new Size(260, 180), 180 
         ),
         new Scalar(0, 0, 255),           //Scalar object for color
         10                               //Thickness of the line
      );
      
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);

      this.matrix = matrix;
      
      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Выполнив вышеуказанную программу, вы получите следующий вывод:

Рисование эллипса

OpenCV — рисование полилиний

Вы можете нарисовать Полилинии на изображении, используя метод polylines () класса imgproc . Ниже приводится синтаксис этого метода.

polylines(img, pts, isClosed, color, thickness)

Этот метод принимает следующие параметры —

  • mat — объект Mat, представляющий изображение, на котором должны быть нарисованы полилинии.

  • pts — объект List, содержащий объекты типа MatOfPoint .

  • isClosed — параметр типа boolean, указывающий, закрыты ли полилинии.

  • скалярскалярный объект, представляющий цвет полилиний. (БГР)

  • толщина — целое число, представляющее толщину полилиний; по умолчанию значение толщины равно 1.

mat — объект Mat, представляющий изображение, на котором должны быть нарисованы полилинии.

pts — объект List, содержащий объекты типа MatOfPoint .

isClosed — параметр типа boolean, указывающий, закрыты ли полилинии.

скалярскалярный объект, представляющий цвет полилиний. (БГР)

толщина — целое число, представляющее толщину полилиний; по умолчанию значение толщины равно 1.

Конструктор класса MatOfPoint принимает объекты класса Point .

MatOfPoint(Point... a)

пример

Следующая программа демонстрирует, как рисовать полилинии на изображении и отображать его с помощью окна JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingPolyLines extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingPolyLines obj = new DrawingPolyLines();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing Polylines on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }      
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      List<MatOfPoint> list = new ArrayList();
      list.add(
         new MatOfPoint (
            new Point(75, 100), new Point(350, 100),
            new Point(75, 150), new Point(350, 150),
            new Point(75, 200), new Point(350, 200),
            new Point(75, 250), new Point(350, 250)
         )
      );
      // Drawing polylines
      Imgproc.polylines (
         matrix,                    // Matrix obj of the image
         list,                      // java.util.List<MatOfPoint> pts
         false,                     // isClosed
         new Scalar(0, 0, 255),     // Scalar object for color
         2                          // Thickness of the line
      );
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);

      this.matrix = matrix;

      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Выполнив вышеуказанную программу, вы получите следующий вывод:

Рисование полилиний

OpenCV — Рисование выпуклых полилиний

Вы можете рисовать выпуклые полилинии на изображении, используя метод fillconvexPoly () класса imgproc . Ниже приводится синтаксис этого метода.

fillConvexPoly(Mat img, MatOfPoint points, Scalar color)

Этот метод принимает следующие параметры —

  • mat — объект Mat, представляющий изображение, на котором должны быть нарисованы выпуклые полилинии.

  • points — объект MatOfPoint, представляющий точки, между которыми должны быть нарисованы выпуклые полилинии.

  • скалярскалярный объект, представляющий цвет выпуклых полилиний. (БГР)

mat — объект Mat, представляющий изображение, на котором должны быть нарисованы выпуклые полилинии.

points — объект MatOfPoint, представляющий точки, между которыми должны быть нарисованы выпуклые полилинии.

скалярскалярный объект, представляющий цвет выпуклых полилиний. (БГР)

Конструктор класса MatOfPoint принимает объекты класса Point .

MatOfPoint(Point... a)

пример

Следующая программа демонстрирует, как рисовать выпуклые полилинии на изображении и отображать его с помощью окна JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class FillConvexPoly extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      FillConvexPoly obj = new FillConvexPoly();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      //Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing convex Polylines (fill) on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      MatOfPoint matOfPoint = new MatOfPoint (
         new Point(75, 100), new Point(350, 100),
         new Point(75, 150), new Point(350, 150),
         new Point(75, 200), new Point(350, 200),
         new Point(75, 250), new Point(350, 250)
      ); 
      // Drawing polylines
      Imgproc.fillConvexPoly (
         matrix,                       // Matrix obj of the image
         matOfPoint,                   // java.util.List<MatOfPoint> pts
         new Scalar(0, 0, 255)         // Scalar object for color
      );
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      this.matrix = matrix;
            
      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   } 
   public static void main(String args[]) {
      launch(args);
   }
}

Выполнив вышеуказанную программу, вы получите следующий вывод:

Рисование выпуклых полилиний

OpenCV — рисование линий со стрелками

Вы можете нарисовать линию со стрелкой на изображении, используя метод arrowedLine () класса imgproc . Ниже приводится синтаксис этого метода —

arrowedLine(Mat img, Point pt1, Point pt2, Scalar color)

Этот метод принимает следующие параметры —

  • mat — объект Mat, представляющий изображение, на котором должна быть нарисована линия со стрелкой.

  • pt1 и pt2 — объекты двух точек, представляющие точки, между которыми должна быть проведена линия со стрелкой.

  • scalarСкалярный объект, представляющий цвет линии со стрелкой. (БГР)

mat — объект Mat, представляющий изображение, на котором должна быть нарисована линия со стрелкой.

pt1 и pt2 — объекты двух точек, представляющие точки, между которыми должна быть проведена линия со стрелкой.

scalarСкалярный объект, представляющий цвет линии со стрелкой. (БГР)

пример

Следующая программа демонстрирует, как нарисовать линию со стрелкой на изображении и отобразить ее в окне JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingArrowedLine extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingArrowedLine obj = new DrawingArrowedLine();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing a line on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/Aish.jpg";
      Mat matrix = Imgcodecs.imread(file);

      //Drawing a line
      Imgproc.arrowedLine(
         matrix,                       // Matrix obj of the image
         new Point(10, 200),           // p1
         new Point(590, 200),          // p2
         new Scalar(0, 100, 255)       // Scalar object for color
      );

      // arrowedLine(Mat img, Point pt1, Point pt2, Scalar color)
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      this.matrix = matrix;

      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Выполнив вышеуказанную программу, вы получите следующий вывод:

Рисование линий со стрелками

OpenCV — Добавление текста

Вы можете добавить текст к изображению, используя метод arrowedLine () класса imgproc . Ниже приводится синтаксис этого метода.

putText(img, text, org, fontFace, fontScale, Scalar color, int thickness)

Этот метод принимает следующие параметры —

  • mat — объект Mat, представляющий изображение, к которому должен быть добавлен текст.

  • textстроковая переменная, представляющая текст, который должен быть добавлен.

  • org — объект Point, представляющий текстовую строку в левом нижнем углу изображения.

  • fontFace — переменная типа integer, представляющая тип шрифта.

  • fontScale — переменная типа double, представляющая масштабный коэффициент, который умножается на базовый размер шрифта.

  • scalarСкалярный объект, представляющий цвет текста, который должен быть добавлен. (БГР)

  • толщина — целое число, представляющее толщину линии по умолчанию, значение толщины равно 1.

mat — объект Mat, представляющий изображение, к которому должен быть добавлен текст.

textстроковая переменная, представляющая текст, который должен быть добавлен.

org — объект Point, представляющий текстовую строку в левом нижнем углу изображения.

fontFace — переменная типа integer, представляющая тип шрифта.

fontScale — переменная типа double, представляющая масштабный коэффициент, который умножается на базовый размер шрифта.

scalarСкалярный объект, представляющий цвет текста, который должен быть добавлен. (БГР)

толщина — целое число, представляющее толщину линии по умолчанию, значение толщины равно 1.

пример

Следующая программа демонстрирует, как добавить текст к изображению и отобразить его с помощью окна JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class AddingTextToImage extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      AddingTextToImage obj = new AddingTextToImage();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Adding text to an image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      // Adding Text
      Imgproc.putText (
         matrix,                          // Matrix obj of the image
         "Ravivarma's Painting",          // Text to be added
         new Point(10, 50),               // point
         Core.FONT_HERSHEY_SIMPLEX ,      // front face
         1,                               // front scale
         new Scalar(0, 0, 0),             // Scalar object for color
         4                                // Thickness
      );
      
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      this.matrix = matrix;

      //Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Выполнив вышеуказанную программу, вы получите следующий вывод:

Добавление текста

OpenCV — Blur (Усреднение)

Размытие (сглаживание) — это обычно используемая операция обработки изображения для уменьшения шума изображения. Этот процесс удаляет высокочастотный контент, например края, с изображения и делает его гладким.

В общем, размытие достигается путем свертки (каждый элемент изображения добавляется к его локальным соседям, взвешенным ядром) изображения через ядро ​​фильтра нижних частот.

Blur (Усреднение)

Во время этой операции изображение сворачивается с помощью блочного фильтра (нормализуется). В этом процессе центральный элемент изображения заменяется средним значением всех пикселей в области ядра.

Вы можете выполнить эту операцию над изображением, используя метод blur () класса imgproc . Ниже приводится синтаксис этого метода —

blur(src, dst, ksize, anchor, borderType)

Этот метод принимает следующие параметры —

  • src — Объект Mat, представляющий источник (входное изображение) для этой операции.

  • dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

  • ksize — объект Size, представляющий размер ядра.

  • якорь — переменная типа integer, представляющая точку привязки.

  • borderType — переменная типа integer, представляющая тип границы, которая будет использоваться для вывода.

src — Объект Mat, представляющий источник (входное изображение) для этой операции.

dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

ksize — объект Size, представляющий размер ядра.

якорь — переменная типа integer, представляющая точку привязки.

borderType — переменная типа integer, представляющая тип границы, которая будет использоваться для вывода.

пример

Следующая программа демонстрирует, как выполнить операцию усреднения (размытия) изображения.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class BlurTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating the Size and Point objects
      Size size = new Size(45, 45);
      Point point = new Point(20, 30);

      // Applying Blur effect on the Image
      Imgproc.blur(src, dst, size, point, Core.BORDER_DEFAULT);

      // blur(Mat src, Mat dst, Size ksize, Point anchor, int borderType)
      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap9/blur.jpg", dst);
      System.out.println("Image processed");
   }
}

Предположим, что ниже указано входное изображение sample.jpg, указанное в вышеуказанной программе.

Образец изображения

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Blur (Усреднение)

OpenCV — Gaussian Blur

В режиме размытия по Гауссу изображение свернуто с гауссовым фильтром вместо рамочного фильтра. Фильтр Гаусса представляет собой фильтр нижних частот, который удаляет высокочастотные составляющие.

Вы можете выполнить эту операцию над изображением, используя метод Gaussianblur () класса imgproc . Ниже приводится синтаксис этого метода —

GaussianBlur(src, dst, ksize, sigmaX)

Этот метод принимает следующие параметры —

  • src — Объект Mat, представляющий источник (входное изображение) для этой операции.

  • dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

  • ksize — объект Size, представляющий размер ядра.

  • sigmaX — переменная типа double, представляющая стандартное отклонение ядра Гаусса в направлении X.

src — Объект Mat, представляющий источник (входное изображение) для этой операции.

dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

ksize — объект Size, представляющий размер ядра.

sigmaX — переменная типа double, представляющая стандартное отклонение ядра Гаусса в направлении X.

пример

Следующая программа демонстрирует, как выполнить операцию размытия по Гауссу на изображении.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class GaussianTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();
    
      // Applying GaussianBlur on the Image
      Imgproc.GaussianBlur(src, dst, new Size(45, 45), 0);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap9/Gaussian.jpg", dst);
      System.out.println("Image Processed");
   }
}

Предположим, что ниже указано входное изображение sample.jpg, указанное в вышеуказанной программе.

Образец изображения

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Gaussian Blur

OpenCV — Median Blur

Операция медианного размытия аналогична другим методам усреднения. Здесь центральный элемент изображения заменяется медианой всех пикселей в области ядра. Эта операция обрабатывает края при удалении шума.

Вы можете выполнить эту операцию над изображением, используя метод medianBlur () класса imgproc . Ниже приводится синтаксис этого метода —

medianBlur(src, dst, ksize)

Этот метод принимает следующие параметры —

  • src — Объект Mat, представляющий источник (входное изображение) для этой операции.

  • dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

  • ksize — объект Size, представляющий размер ядра.

src — Объект Mat, представляющий источник (входное изображение) для этой операции.

dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

ksize — объект Size, представляющий размер ядра.

пример

Следующая программа демонстрирует, как выполнить операцию медианного размытия изображения.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class MedianBlurTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying MedianBlur on the Image
      Imgproc.medianBlur(src, dst, 15);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap9/median.jpg", dst);

      System.out.println("Image Processed");
   }
}

Предположим, что ниже указано входное изображение sample.jpg, указанное в вышеуказанной программе.

Образец изображения

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Срединное пятно

OpenCV — двусторонний фильтр

Фильтрация изображений позволяет применять к изображению различные эффекты. В этой главе и последующих трех главах мы собираемся обсудить различные операции фильтрации, такие как двусторонний фильтр, коробочный фильтр, блочный фильтр SQR и фильтр2D.

Двусторонний фильтр

Операция «Двусторонний фильтр» применяет двустороннее изображение к фильтру. Вы можете выполнить эту операцию над изображением, используя метод medianBlur () класса imgproc . Ниже приводится синтаксис этого метода.

bilateralFilter(src, dst, d, sigmaColor, sigmaSpace, borderType)

Этот метод принимает следующие параметры —

  • src — Объект Mat, представляющий источник (входное изображение) для этой операции.

  • dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

  • d — переменная типа integer, представляющая диаметр окрестности пикселя.

  • sigmaColor — переменная типа integer, представляющая сигма фильтра в цветовом пространстве.

  • sigmaSpace — переменная типа integer, представляющая сигма фильтра в координатном пространстве.

  • borderType — Целочисленный объект, представляющий тип используемой границы.

src — Объект Mat, представляющий источник (входное изображение) для этой операции.

dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

d — переменная типа integer, представляющая диаметр окрестности пикселя.

sigmaColor — переменная типа integer, представляющая сигма фильтра в цветовом пространстве.

sigmaSpace — переменная типа integer, представляющая сигма фильтра в координатном пространстве.

borderType — Целочисленный объект, представляющий тип используемой границы.

пример

Следующая программа демонстрирует, как выполнить операцию двустороннего фильтра на изображении.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class BilateralFilter {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap11/filter_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying Bilateral filter on the Image
      Imgproc.bilateralFilter(src, dst, 15, 80, 80, Core.BORDER_DEFAULT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap11/bilateralfilter.jpg", dst);

      System.out.println("Image Processed");
   }
}

Предположим, что следующим является входное изображение filter_input.jpg, указанное в вышеуказанной программе.

Фильтр ввода

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Выход двустороннего фильтра

OpenCV — Box Filter

Операция Box Filter аналогична операции усреднения размытия; это применяет двустороннее изображение к фильтру. Здесь вы можете выбрать, будет ли поле нормализовано или нет.

Вы можете выполнить эту операцию над изображением, используя метод boxFilter () класса imgproc . Ниже приводится синтаксис этого метода —

boxFilter(src, dst, ddepth, ksize, anchor, normalize, borderType)

Этот метод принимает следующие параметры —

  • src — Объект Mat, представляющий источник (входное изображение) для этой операции.

  • dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

  • ddepth — переменная типа integer, представляющая глубину выходного изображения.

  • ksize — объект Size, представляющий размер размытого ядра.

  • якорь — переменная типа integer, представляющая точку привязки.

  • Normalize — переменная типа boolean, определяющая, должно ли ядро ​​быть нормализовано.

  • borderType — Целочисленный объект, представляющий тип используемой границы.

src — Объект Mat, представляющий источник (входное изображение) для этой операции.

dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

ddepth — переменная типа integer, представляющая глубину выходного изображения.

ksize — объект Size, представляющий размер размытого ядра.

якорь — переменная типа integer, представляющая точку привязки.

Normalize — переменная типа boolean, определяющая, должно ли ядро ​​быть нормализовано.

borderType — Целочисленный объект, представляющий тип используемой границы.

пример

Следующая программа демонстрирует, как выполнить операцию Box Filter на изображении.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class BoxFilterTest {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file = "E:/OpenCV/chap11/filter_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating the objects for Size and Point
      Size size = new Size(45, 45);
      Point point = Point(-1, -1);

      // Applying Box Filter effect on the Image
      Imgproc.boxFilter(src, dst, 50, size, point, true, Core.BORDER_DEFAULT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap11/boxfilterjpg", dst);

      System.out.println("Image Processed");
   }
}

Предположим, что следующим является входное изображение filter_input.jpg, указанное в вышеуказанной программе.

Фильтр ввода

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Фильтр коробки

OpenCV — SQRBox Filter

Вы можете выполнить операцию SQRBox Filter над изображением, используя метод boxFilter () класса imgproc . Ниже приводится синтаксис этого метода —

sqrBoxFilter(src, dst, ddepth, ksize)

Этот метод принимает следующие параметры —

  • src — Объект Mat, представляющий источник (входное изображение) для этой операции.

  • dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

  • ddepth — переменная типа integer, представляющая глубину выходного изображения.

  • ksize — объект Size, представляющий размер размытого ядра.

src — Объект Mat, представляющий источник (входное изображение) для этой операции.

dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

ddepth — переменная типа integer, представляющая глубину выходного изображения.

ksize — объект Size, представляющий размер размытого ядра.

пример

Следующая программа демонстрирует, как выполнить операцию фильтра Sqrbox для данного изображения.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class SqrBoxFilterTest {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap11/filter_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying Box Filter effect on the Image
      Imgproc.sqrBoxFilter(src, dst, -1, new Size(1, 1));
     
      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap11/sqrboxfilter.jpg", dst);

      System.out.println("Image Processed");
   } 
}

Предположим, что следующим является входное изображение filter_input.jpg, указанное в вышеуказанной программе.

Фильтр ввода

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

SQRBox Filter

OpenCV — Filter2D

Операция Filter2D сворачивает образ с ядром. Вы можете выполнить эту операцию над изображением, используя метод Filter2D () класса imgproc . Ниже приводится синтаксис этого метода —

filter2D(src, dst, ddepth, kernel)

Этот метод принимает следующие параметры —

  • src — Объект Mat, представляющий источник (входное изображение) для этой операции.

  • dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

  • ddepth — переменная типа integer, представляющая глубину выходного изображения.

  • kernel — объект Mat, представляющий ядро ​​свертки.

src — Объект Mat, представляющий источник (входное изображение) для этой операции.

dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

ddepth — переменная типа integer, представляющая глубину выходного изображения.

kernel — объект Mat, представляющий ядро ​​свертки.

пример

Следующая программа демонстрирует, как выполнить операцию Filter2D над изображением.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Filter2D {
   public static void main( String[] args ) {
      //Loading the OpenCV core library  
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      //Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap11/filter_input.jpg";
      Mat src = Imgcodecs.imread(file);

      //Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating kernel matrix
      Mat kernel = Mat.ones(2,2, CvType.CV_32F);
      
      for(int i = 0; i<kernel.rows(); i++) {
         for(int j = 0; j<kernel.cols(); j++) {
            double[] m = kernel.get(i, j);

            for(int k = 1; k<m.length; k++) {
               m[k] = m[k]/(2 * 2);
            }
            kernel.put(i,j, m);
         }
      }
      Imgproc.filter2D(src, dst, -1, kernel);
      Imgcodecs.imwrite("E:/OpenCV/chap11/filter2d.jpg", dst);
      System.out.println("Image Processed");
   }
}

Предположим, что следующим является входное изображение filter_input.jpg, указанное в вышеуказанной программе.

Фильтр ввода

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Filter2D

OpenCV — Дилатация

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

На основе данного входного изображения разработан «структурный элемент». Это может быть сделано в любой из двух процедур. Они направлены на устранение шума и устранение недостатков, чтобы сделать изображение четким.

расширение

Эта процедура следует за сверткой с некоторым ядром определенной формы, такой как квадрат или круг. Это ядро ​​имеет опорную точку, которая обозначает его центр.

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

Например, размер объекта в белом оттенке или ярком оттенке увеличивается, в то время как размер объекта в черном оттенке или темном оттенке уменьшается.

Вы можете выполнить операцию расширения изображения, используя метод dlate () класса imgproc . Ниже приводится синтаксис этого метода.

dilate(src, dst, kernel)

Этот метод принимает следующие параметры —

  • src — Объект Mat, представляющий источник (входное изображение) для этой операции.

  • dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

  • kernel — объект Mat, представляющий ядро.

src — Объект Mat, представляющий источник (входное изображение) для этой операции.

dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

kernel — объект Mat, представляющий ядро.

пример

Вы можете подготовить матрицу ядра, используя метод getStructuringElement () . Этот метод принимает целое число, представляющее тип morph_rect и объект типа Size .

Imgproc.getStructuringElement(int shape, Size ksize);

Следующая программа демонстрирует, как выполнить операцию расширения на данном изображении.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DilateTest {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Preparing the kernel matrix object 
      Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, 
         new  Size((2*2) + 1, (2*2)+1));

      // Applying dilate on the Image
      Imgproc.dilate(src, dst, kernel);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap10/Dilation.jpg", dst);

      System.out.println("Image Processed");
   } 
}

вход

Предположим, что ниже указано входное изображение sample.jpg, указанное в вышеуказанной программе.

Образец изображения

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

расширение

OpenCV — Эрозия

Эрозия довольно похожа на процесс расширения. Но вычисленное здесь значение пикселя является минимальным, а не максимальным при расширении. Изображение заменяется под точкой привязки с этим минимальным значением пикселя.

При этой процедуре области темных областей увеличиваются в размерах, а яркие области уменьшаются. Например, размер объекта в темном или черном оттенке увеличивается, в то время как уменьшается в белом или ярком оттенке.

пример

Вы можете выполнить эту операцию над изображением, используя метод erode () класса imgproc . Ниже приводится синтаксис этого метода —

erode(src, dst, kernel)

Этот метод принимает следующие параметры —

  • src — Объект Mat, представляющий источник (входное изображение) для этой операции.

  • dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

  • kernel — объект Mat, представляющий ядро.

src — Объект Mat, представляющий источник (входное изображение) для этой операции.

dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

kernel — объект Mat, представляющий ядро.

Вы можете подготовить матрицу ядра, используя метод getStructuringElement () . Этот метод принимает целое число, представляющее тип morph_rect и объект типа Size .

Imgproc.getStructuringElement(int shape, Size ksize);

Следующая программа демонстрирует, как выполнить операцию эрозии на данном изображении.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class ErodeTest {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Preparing the kernel matrix object
      Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, 
         new  Size((2*2) + 1, (2*2)+1));

      // Applying erode on the Image
      Imgproc.erode(src, dst, kernel);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap10/Erosion.jpg", dst);

      System.out.println("Image processed");
   }
}

Предположим, что ниже указано входное изображение sample.jpg, указанное в вышеуказанной программе.

Образец изображения

Выход

При выполнении программы вы получите следующий вывод:

Image Loaded

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

размывание

OpenCV — морфологические операции

В предыдущих главах мы обсуждали процесс эрозии и расширения . В дополнение к этим двум, OpenCV имеет больше морфологических преобразований. MorphologyEx () метода класса Imgproc используется для выполнения этих операций с данным изображением.

Ниже приводится синтаксис этого метода —

morphologyEx(src, dst, op, kernel)

Этот метод принимает следующие параметры —

  • src — Объект класса Mat, представляющий исходное (входное) изображение.

  • dst — объект класса Mat, представляющий целевое (выходное) изображение.

  • op — целое число, представляющее тип морфологической операции.

  • ядро — матрица ядра.

src — Объект класса Mat, представляющий исходное (входное) изображение.

dst — объект класса Mat, представляющий целевое (выходное) изображение.

op — целое число, представляющее тип морфологической операции.

ядро — матрица ядра.

пример

Следующая программа демонстрирует, как применить морфологическую операцию «цилиндр» к изображению с помощью библиотеки OpenCV.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class MorphologyExTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap12/morph_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating kernel matrix
      Mat kernel = Mat.ones(5,5, CvType.CV_32F);

      // Applying Blur effect on the Image 
      Imgproc.morphologyEx(src, dst, Imgproc.MORPH_TOPHAT, kernel);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap12/morph_tophat.jpg", dst);

      System.out.println("Image Processed");
   } 
}

Предположим, что следующим является входное изображение morph_input.jpg, указанное в вышеуказанной программе.

Morph Input

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Morph Output

Больше операций

В дополнение к морфологической операции TOPHAT , продемонстрированной в предыдущем примере , OpenCV обслуживает различные другие типы морфологий. Все эти типы представлены предопределенными статическими полями (фиксированными значениями) класса Imgproc .

Вы можете выбрать нужный тип морфологии, передав соответствующее предопределенное значение параметру op метода morphologyEx () .

// Applying Blur effect on the Image
Imgproc.morphologyEx(src, dst, Imgproc.MORPH_TOPHAT , kernel);

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

Операция и описание Выход
MORPH_BLACKHAT MORPH_BLACKHAT
MORPH_CLOSE MORPH_CLOSE
MORPH_CROSS MORPH_CROSS
MORPH_DILATE MORPH_DILATE
MORPH_ELLIPSE MORPH_ELLIPSE
MORPH_ERODE MORPH_ERODE
MORPH_GRADIENT MORPH_GRADIENT
MORPH_OPEN MORPH_OPEN
MORPH_RECT MORPH_RECT
MORPH_TOPHAT MORPH_TOPHAT

OpenCV — Пирамиды изображений

Пирамида — это операция над изображением, где

  • Входное изображение первоначально сглаживается с использованием определенного сглаживающего фильтра (например, гауссов, лапласиан), а затем сглаженное изображение подвергается субдискретизации.

  • Этот процесс повторяется несколько раз.

Входное изображение первоначально сглаживается с использованием определенного сглаживающего фильтра (например, гауссов, лапласиан), а затем сглаженное изображение подвергается субдискретизации.

Этот процесс повторяется несколько раз.

Во время операции пирамиды гладкость изображения увеличивается, а разрешение (размер) уменьшается.

Пирамида вверх

В «Пирамиде вверх» изображение сначала дискретизируется, а затем размывается. Вы можете выполнить операцию Pyramid Up над изображением, используя метод pyrUP () класса imgproc . Ниже приводится синтаксис этого метода —

pyrUp(src, dst, dstsize, borderType)

Этот метод принимает следующие параметры —

  • src — Объект класса Mat, представляющий исходное (входное) изображение.

  • mat — Объект класса Mat, представляющий целевое (выходное) изображение.

  • размер — объект класса Size, представляющий размер, до которого изображение должно быть увеличено или уменьшено.

  • borderType — переменная целочисленного типа, представляющая тип используемой границы.

src — Объект класса Mat, представляющий исходное (входное) изображение.

mat — Объект класса Mat, представляющий целевое (выходное) изображение.

размер — объект класса Size, представляющий размер, до которого изображение должно быть увеличено или уменьшено.

borderType — переменная целочисленного типа, представляющая тип используемой границы.

пример

Следующая программа демонстрирует, как выполнить операцию «Пирамида вверх» на изображении.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class PyramidUp {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap13/pyramid_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying pyrUp on the Image
      Imgproc.pyrUp(src, dst, new Size(src.cols()*2,  src.rows()*2), Core.BORDER_DEFAULT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap13/pyrUp_output.jpg", dst);

      System.out.println("Image Processed");
   }
}

Предположим, что следующим является входное изображение pyramid_input.jpg, указанное в вышеуказанной программе.

Ввод пирамиды

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Выход пирамиды вверх

Пирамида вниз

В «Пирамиде вниз» изображение сначала размыто, а затем уменьшено. Вы можете выполнить операцию Pyramid Down над изображением, используя метод pyrDown () класса imgproc . Ниже приводится синтаксис этого метода —

pyrDown(src, dst, dstsize, borderType)

Этот метод принимает следующие параметры —

  • src — Объект класса Mat, представляющий исходное (входное) изображение.

  • mat — Объект класса Mat, представляющий целевое (выходное) изображение.

  • размер — объект класса Size, представляющий размер, до которого изображение должно быть увеличено или уменьшено.

  • borderType — переменная целочисленного типа, представляющая тип используемой границы.

src — Объект класса Mat, представляющий исходное (входное) изображение.

mat — Объект класса Mat, представляющий целевое (выходное) изображение.

размер — объект класса Size, представляющий размер, до которого изображение должно быть увеличено или уменьшено.

borderType — переменная целочисленного типа, представляющая тип используемой границы.

пример

Следующая программа демонстрирует, как выполнить операцию «Пирамида вниз» на изображении.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class PyramidDown {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap13/pyramid_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying pyrDown on the Image
      Imgproc.pyrDown(src, dst, new Size(src.cols()/2,  src.rows()/2),
         Core.BORDER_DEFAULT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap13/pyrDown_output.jpg", dst);

      System.out.println("Image Processed");
   } 
}

Предположим, что следующим является входное изображение pyramid_input.jpg, указанное в вышеуказанной программе.

Ввод пирамиды

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Выход пирамиды вниз

Фильтрация среднего сдвига

В операции пирамиды «Среднее смещение» выполняется начальный этап сегментации среднего смещения изображения.

Вы можете выполнить пирамидную среднюю фильтрацию сдвига изображения, используя метод pyrDown () класса imgproc . Ниже приводится синтаксис этого метода.

pyrMeanShiftFiltering(src, dst, sp, sr)

Этот метод принимает следующие параметры —

  • src — Объект класса Mat, представляющий исходное (входное) изображение.

  • mat — Объект класса Mat, представляющий целевое (выходное) изображение.

  • sp — переменная типа double, представляющая радиус пространственного окна.

  • sr — переменная типа double, представляющая радиус цветного окна.

src — Объект класса Mat, представляющий исходное (входное) изображение.

mat — Объект класса Mat, представляющий целевое (выходное) изображение.

sp — переменная типа double, представляющая радиус пространственного окна.

sr — переменная типа double, представляющая радиус цветного окна.

пример

Следующая программа демонстрирует, как выполнить операцию фильтрации среднего смещения для данного изображения.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class PyramidMeanShift {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap13/pyramid_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying meanShifting on the Image
      Imgproc.pyrMeanShiftFiltering(src, dst, 200, 300);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap13/meanShift_output.jpg", dst);
      
      System.out.println("Image Processed");
   } 
}

Предположим, что следующим является входное изображение pyramid_input.jpg, указанное в вышеуказанной программе.

Ввод пирамиды

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Фильтрация среднего сдвига

OpenCV — простой порог

Thresholding — это метод сегментации изображений, в общем он используется для создания бинарных изображений. Thresholding бывает двух типов, а именно: простой порог и адаптивный порог.

Простой порог

В простой операции порогового значения пикселям, значения которых превышают указанное пороговое значение, присваивается стандартное значение.

Вы можете выполнить простую пороговую операцию над изображением, используя метод threshold () класса Imgproc. Ниже приведен синтаксис этого метода.

threshold(src, dst, thresh, maxval, type)

Этот метод принимает следующие параметры —

  • src — Объект класса Mat, представляющий исходное (входное) изображение.

  • dst — Объект класса Mat, представляющий целевое (выходное) изображение.

  • thresh — переменная типа double, представляющая пороговое значение.

  • maxval — переменная типа double, представляющая значение, которое должно быть задано, если значение пикселя превышает пороговое значение.

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

src — Объект класса Mat, представляющий исходное (входное) изображение.

dst — Объект класса Mat, представляющий целевое (выходное) изображение.

thresh — переменная типа double, представляющая пороговое значение.

maxval — переменная типа double, представляющая значение, которое должно быть задано, если значение пикселя превышает пороговое значение.

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

пример

Следующая программа демонстрирует, как выполнить простую операцию порогового изображения для изображения в OpenCV.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Thresh {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap14/thresh_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();
      Imgproc.threshold(src, dst, 50, 255, Imgproc.THRESH_BINARY);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap14/thresh_trunc.jpg", dst);

      System.out.println("Image Processed");
   }
}

Предположим, что следующим является входное изображение thresh_input.jpg, указанное в вышеуказанной программе.

Вклад Молот

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Молотить выход

Другие виды простых порогов

В дополнение к операции THRESH_BINARY, продемонстрированной в предыдущем примере, OpenCV обслуживает различные другие типы пороговых операций. Все эти типы представлены предопределенными статическими полями (фиксированными значениями) класса Imgproc .

Вы можете выбрать нужный тип пороговой операции, передав соответствующее предопределенное значение параметру с именем type для метода threshold () .

Imgproc.threshold(src, dst, 50, 255, Imgproc.THRESH_BINARY );

Ниже приведены значения, представляющие различные типы пороговых операций и их соответствующие выходы.

Операция и описание Выход
THRESH_BINARY THRESH_BINARY
THRESH_BINARY_INV THRESH_BINARY_INV
THRESH_TRUNC THRESH_TRUNC
THRESH_TOZERO THRESH_TOZERO
THRESH_TOZERO_INV THRESH_TOZERO_INV

OpenCV — адаптивный порог

В простом пороговом значении пороговое значение является глобальным, т. Е. Оно одинаково для всех пикселей изображения. Адаптивный порог — это метод, в котором пороговое значение рассчитывается для меньших регионов, и, следовательно, будут разные пороговые значения для разных регионов.

В OpenCV вы можете выполнить адаптивную пороговую операцию над изображением, используя метод adaptiveThreshold () класса Imgproc . Ниже приводится синтаксис этого метода.

adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C)

Этот метод принимает следующие параметры —

  • src — Объект класса Mat, представляющий исходное (входное) изображение.

  • dst — Объект класса Mat, представляющий целевое (выходное) изображение.

  • maxValue — переменная типа double, представляющая значение, которое должно быть задано, если значение пикселя превышает пороговое значение.

  • adaptiveMethod — переменная типа integer, представляющая тип адаптивного метода, который будет использоваться. Это будет одно из следующих двух значений

    • ADAPTIVE_THRESH_MEAN_C — пороговое значение является средним значением окрестности.

    • ADAPTIVE_THRESH_GAUSSIAN_C — пороговое значение представляет собой взвешенную сумму значений окрестностей, где веса представляют собой гауссово окно.

  • thresholdType — переменная целочисленного типа, представляющая тип используемого порога.

  • blockSize — переменная целочисленного типа, представляющая размер пиксельного соседства, используемого для вычисления порогового значения.

  • C — переменная типа double, представляющая константу, используемую в обоих методах (вычитается из среднего или взвешенного среднего).

src — Объект класса Mat, представляющий исходное (входное) изображение.

dst — Объект класса Mat, представляющий целевое (выходное) изображение.

maxValue — переменная типа double, представляющая значение, которое должно быть задано, если значение пикселя превышает пороговое значение.

adaptiveMethod — переменная типа integer, представляющая тип адаптивного метода, который будет использоваться. Это будет одно из следующих двух значений

ADAPTIVE_THRESH_MEAN_C — пороговое значение является средним значением окрестности.

ADAPTIVE_THRESH_GAUSSIAN_C — пороговое значение представляет собой взвешенную сумму значений окрестностей, где веса представляют собой гауссово окно.

thresholdType — переменная целочисленного типа, представляющая тип используемого порога.

blockSize — переменная целочисленного типа, представляющая размер пиксельного соседства, используемого для вычисления порогового значения.

C — переменная типа double, представляющая константу, используемую в обоих методах (вычитается из среднего или взвешенного среднего).

пример

Следующая программа демонстрирует, как выполнить адаптивную пороговую операцию над изображением в OpenCV. Здесь мы выбираем адаптивный порог типа двоичный и ADAPTIVE_THRESH_MEAN_C для порогового метода.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class AdaptiveThresh {
   public static void main(String args[]) throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap14/thresh_input.jpg";
      
      // Reading the image
      Mat src = Imgcodecs.imread(file,0);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      Imgproc.adaptiveThreshold(src, dst, 125, Imgproc.ADAPTIVE_THRESH_MEAN_C,
         Imgproc.THRESH_BINARY, 11, 12);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap14/Adaptivemean_thresh_binary.jpg", dst);

      System.out.println("Image Processed");
   } 
}

Предположим, что следующим является входное изображение thresh_input.jpg, указанное в вышеуказанной программе.

Вклад Молот

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Адаптивный пороговый выход

Другие типы адаптивного порога

В дополнение к ADAPTIVE_THRESH_MEAN_C в качестве адаптивного метода и THRESH_BINARY в качестве типа порога, как показано в предыдущем примере, мы можем выбрать больше комбинаций этих двух значений.

Imgproc.adaptiveThreshold(src, dst, 125, Imgproc.ADAPTIVE_THRESH_MEAN_C, 
   Imgproc.THRESH_BINARY , 11, 12);

Ниже приведены значения, представляющие различные комбинации значений для параметров adaptiveMethod и thresholdType и их соответствующих выходных данных.

adaptiveMethod / thresholdType ADAPTIVE_THRESH_MEAN_C ADAPTIVE_THRESH_GAUSSIAN_C:
THRESH_BINARY ADAPTIVE_THRESH_BINARY ADAPTIVE_THRESH_GAUSSIAN_BINARY
THRESH_BINARY_INV ADAPTIVE_THRESH_BINARY_INV ADAPTIVE_THRESH_GAUSSIAN_BINARY_INV

OpenCV — Добавление границ

Эта глава научит вас, как жаба граничит с изображением.

Метод copyMakeBorder ()

Вы можете добавить различные границы к изображению, используя метод copyMakeBorder () класса с именем Core, который принадлежит пакету org.opencv.core. ниже приводится синтаксис этого метода.

copyMakeBorder(src, dst, top, bottom, left, right, borderType)

Этот метод принимает следующие параметры —

  • src — Объект класса Mat, представляющий исходное (входное) изображение.

  • dst — Объект класса Mat, представляющий целевое (выходное) изображение.

  • top — переменная типа integer типа integer, представляющая длину границы в верхней части изображения.

  • bottom — Переменная integer типа integer, представляющая длину границы в нижней части изображения.

  • left — переменная целого типа type integer, представляющая длину границы слева от изображения.

  • right — переменная целого типа type integer, представляющая длину границы справа от изображения.

  • borderType — переменная типа integer, представляющая тип границы, которая должна использоваться.

src — Объект класса Mat, представляющий исходное (входное) изображение.

dst — Объект класса Mat, представляющий целевое (выходное) изображение.

top — переменная типа integer типа integer, представляющая длину границы в верхней части изображения.

bottom — Переменная integer типа integer, представляющая длину границы в нижней части изображения.

left — переменная целого типа type integer, представляющая длину границы слева от изображения.

right — переменная целого типа type integer, представляющая длину границы справа от изображения.

borderType — переменная типа integer, представляющая тип границы, которая должна использоваться.

пример

Следующая программа — пример, демонстрирующий, как добавить границу к данному изображению.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

public class AddingBorder {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
     
      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap15/input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();
   
      Core.copyMakeBorder(src, dst, 20, 20, 20, 20, Core.BORDER_CONSTANT);
      Imgcodecs.imwrite("E:/OpenCV/chap15/border_constant.jpg", dst);

      System.out.println("Image Processed");
   }
}

Предположим, что следующим является входное изображение thresh_input.jpg, указанное в вышеуказанной программе.

Вклад Молот

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Добавление вывода границ

Другие типы границ

В дополнение к типу границы, BORDER_CONSTANT, продемонстрированному в предыдущем примере, OpenCV обслуживает различные другие типы границ. Все эти типы представлены предопределенными статическими полями (фиксированными значениями) класса Core.

Вы можете выбрать нужный тип пороговой операции, передав соответствующее предопределенное значение параметру borderType метода copyMakeBorder () .

Core.copyMakeBorder(src, dst, 20, 20, 20, 20, Core.BORDER_CONSTANT );

Ниже приведены значения, представляющие различные типы операций с границами и их соответствующие выходные данные.

Операция и описание Выход
BORDER_CONSTANT BORDER_CONSTANT
BORDER_ISOLATED BORDER_ISOLATED
BORDER_DEFAULT BORDER_DEFAULT
BORDER_REFLECT BORDER_REFLECT
BORDER_REFLECT_101 BORDER_REFLECT_101
BORDER_REFLECT101 BORDER_REFLECT101
BORDER_REPLICATE BORDER_REPLICATE
BORDER_WRAP BORDER_WRAP

OpenCV — Собел Оператор

Используя операцию sobel , вы можете обнаружить края изображения в горизонтальном и вертикальном направлениях. Вы можете применить операцию sobel к изображению, используя метод sobel () . Ниже приводится синтаксис этого метода —

Sobel(src, dst, ddepth, dx, dy)

Этот метод принимает следующие параметры —

  • src — Объект класса Mat, представляющий исходное (входное) изображение.

  • dst — Объект класса Mat, представляющий целевое (выходное) изображение.

  • ddepth — целочисленная переменная, представляющая глубину изображения (-1)

  • dx — целочисленная переменная, представляющая x-производную. (0 или 1)

  • dy — целочисленная переменная, представляющая производную y. (0 или 1)

src — Объект класса Mat, представляющий исходное (входное) изображение.

dst — Объект класса Mat, представляющий целевое (выходное) изображение.

ddepth — целочисленная переменная, представляющая глубину изображения (-1)

dx — целочисленная переменная, представляющая x-производную. (0 или 1)

dy — целочисленная переменная, представляющая производную y. (0 или 1)

пример

Следующая программа демонстрирует, как выполнить операцию Собеля на заданном изображении.

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class SobelTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap16/sobel_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying sobel on the Image
      Imgproc.Sobel(src, dst, -1, 1, 1);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap16/sobel_output.jpg", dst);

      System.out.println("Image processed");
   }
}

Предположим, что следующим является входное изображение sobel_input.jpg, указанное в вышеуказанной программе.

Окно ввода

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Собел Выход

Трезвый Варианты

Передав различные значения последним в параметры (dx и dy) (среди 0 и 1), вы получите разные выходные данные —

// Applying sobel on the Image
Imgproc.Sobel(src, dst, -1, 1, 1 );

В следующей таблице перечислены различные значения переменных dx и dy метода Sobel () и их соответствующие выходные данные.

Х-производное Y-производное Выход
0 1 Собель 01
1 0 Собель 10
1 1 Собель 11

OpenCV — оператор Шарр

Шарр также используется для обнаружения вторых производных изображения в горизонтальном и вертикальном направлениях. Вы можете выполнить операцию scharr для изображения, используя метод scharr () . Ниже приводится синтаксис этого метода —

Scharr(src, dst, ddepth, dx, dy)

Этот метод принимает следующие параметры —

  • src — Объект класса Mat, представляющий исходное (входное) изображение.

  • dst — Объект класса Mat, представляющий целевое (выходное) изображение.

  • ddepth — целочисленная переменная, представляющая глубину изображения (-1)

  • dx — целочисленная переменная, представляющая x-производную. (0 или 1)

  • dy — целочисленная переменная, представляющая производную y. (0 или 1)

src — Объект класса Mat, представляющий исходное (входное) изображение.

dst — Объект класса Mat, представляющий целевое (выходное) изображение.

ddepth — целочисленная переменная, представляющая глубину изображения (-1)

dx — целочисленная переменная, представляющая x-производную. (0 или 1)

dy — целочисленная переменная, представляющая производную y. (0 или 1)

пример

Следующая программа демонстрирует, как применить scharr к данному изображению.

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class ScharrTest {

   public static void main( String[] args ) {

      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap16/sobel_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying Box Filter effect on the Image
      Imgproc.Scharr(src, dst, Imgproc.CV_SCHARR, 0, 1);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap16/scharr_output.jpg", dst);

      System.out.println("Image processed");
   }
}

Предположим, что следующим является входное изображение scharr_input.jpg, указанное в вышеуказанной программе.

Окно ввода

Выход

Выполнив его, вы получите следующий вывод —

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Scharr Output

Больше производных scharr

При передаче различных значений последним параметрам (dx и dy) (среди 0 и 1) вы получите разные выходные данные —

// Applying scharr on the Image
Imgproc.Scharr(src, dst, -1, 1, 1 );

Ниже приведена таблица, в которой перечислены различные значения переменных dx и dy метода scharr () и их соответствующие выходные данные.

Х-производное Y-производное Выход
0 1 Шарр 01
1 0 Шарр 10

OpenCV — Лапласово преобразование

Оператор Лапласа также является производным оператором, который используется для поиска ребер в изображении. Это производная маска второго порядка. В этой маске у нас есть еще две классификации: одна — положительный оператор Лапласа, а другая — отрицательный оператор Лапласа.

В отличие от других операторов, Лапласиан не вынимал ребра в каком-либо конкретном направлении, но вынимал ребра в следующей классификации.

  • Внутренние края
  • Внешние края

Вы можете выполнить операцию преобразования Лапласа на изображении, используя метод Laplacian () класса imgproc , ниже приведен синтаксис этого метода.

Laplacian(src, dst, ddepth)

Этот метод принимает следующие параметры —

  • src — Объект Mat, представляющий источник (входное изображение) для этой операции.

  • dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

  • ddepth — переменная типа integer, представляющая глубину целевого изображения.

src — Объект Mat, представляющий источник (входное изображение) для этой операции.

dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

ddepth — переменная типа integer, представляющая глубину целевого изображения.

пример

Следующая программа демонстрирует, как выполнить операцию преобразования Лапласа для данного изображения.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class LaplacianTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

      //Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap18/laplacian_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying GaussianBlur on the Image
      Imgproc.Laplacian(src, dst, 10);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap18/laplacian.jpg", dst);

      System.out.println("Image Processed");
   }
}

Предположим, что следующим является входное изображение laplacian_input.jpg, указанное в вышеуказанной программе.

Лапласский вход

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Лапласский выход

OpenCV — преобразование расстояния

Оператор преобразования расстояния обычно принимает двоичные изображения в качестве входных данных. В этой операции интенсивность уровней серого в точках внутри областей переднего плана изменяется, чтобы дистанцировать их соответствующие расстояния от ближайшего значения 0 (границы).

Вы можете применить дистанционное преобразование в OpenCV, используя метод distanceTransform () . Ниже приводится синтаксис этого метода.

distanceTransform(src, dst, distanceType, maskSize)

Этот метод принимает следующие параметры —

  • src — Объект класса Mat, представляющий исходное (входное) изображение.

  • dst — Объект класса Mat, представляющий целевое (выходное) изображение.

  • distanceType — переменная типа integer, представляющая тип применяемого преобразования расстояния.

  • maskSize — переменная целочисленного типа, представляющая размер маски, которая будет использоваться.

src — Объект класса Mat, представляющий исходное (входное) изображение.

dst — Объект класса Mat, представляющий целевое (выходное) изображение.

distanceType — переменная типа integer, представляющая тип применяемого преобразования расстояния.

maskSize — переменная целочисленного типа, представляющая размер маски, которая будет использоваться.

пример

Следующая программа демонстрирует, как выполнить операцию трансформации расстояния для данного изображения.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DistanceTransform {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap19/input.jpg";
      Mat src = Imgcodecs.imread(file,0);

      // Creating an empty matrix to store the results
      Mat dst = new Mat();
      Mat binary = new Mat();

      // Converting the grayscale image to binary image
      Imgproc.threshold(src, binary, 100, 255, Imgproc.THRESH_BINARY);

      // Applying distance transform
      Imgproc.distanceTransform(mat, dst, Imgproc.DIST_C, 3);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap19/distnceTransform.jpg", dst);

      System.out.println("Image Processed");
   }
}

Предположим, что ниже указано входное изображение input.jpg, указанное в вышеуказанной программе.

Входное преобразование расстояния

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Выход с преобразованием расстояния

Типы операций трансформации расстояния

В дополнение к типу операции расстояния DIST_C, продемонстрированному в предыдущем примере, OpenCV обслуживает различные другие типы операций преобразования расстояния. Все эти типы представлены предопределенными статическими полями (фиксированными значениями) класса Imgproc.

Вы можете выбрать нужный тип операции преобразования расстояния, передав соответствующее предопределенное значение параметру distanceType метода distanceTransform () .

// Applying distance transform 
Imgproc.distanceTransform(mat, dst, Imgproc.DIST_C , 3);

Ниже приведены значения, представляющие различные типы операций distanceTransform и их соответствующие выходные данные.

Операция и описание Выход
DIST_C DIST_C
DIST_L1 DIST_L1
DIST_L2 DIST_L2
DIST_LABEL_PIXEL DIST_LABEL_PIXEL
DIST_MASK_3 DIST_MASK_3

OpenCV — Использование камеры

В этой главе мы узнаем, как использовать OpenCV для захвата кадров с помощью системной камеры. Класс VideoCapture пакета org.opencv.videoio содержит классы и методы для захвата видео с помощью камеры. Давайте пойдем шаг за шагом и узнаем, как захватывать кадры —

Шаг 1: Загрузите собственную библиотеку OpenCV

При написании кода Java с использованием библиотеки OpenCV первый шаг, который вам нужно сделать, это загрузить собственную библиотеку OpenCV с помощью loadLibrary () . Загрузите собственную библиотеку OpenCV, как показано ниже.

// Loading the core library 
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Шаг 2. Создание класса захвата видео

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

// Instantiating the VideoCapture class (camera:: 0) 
VideoCapture capture = new VideoCapture(0);

Шаг 3: Чтение кадров

Вы можете прочитать кадры с камеры, используя метод read () класса VideoCapture . Этот метод принимает объект класса Mat для хранения прочитанного кадра.

// Reading the next video frame from the camera 
Mat matrix = new Mat(); 
capture.read(matrix);

пример

Следующая программа демонстрирует, как захватить кадр с помощью камеры и отобразить его с помощью окна JavaFX. Это также сохраняет захваченный кадр.

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;

import java.io.FileNotFoundException;
import java.io.IOException;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

public class CameraSnapshotJavaFX extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws FileNotFoundException, IOException {
      // Capturing the snapshot from the camera
      CameraSnapshotJavaFX obj = new CameraSnapshotJavaFX();
      WritableImage writableImage = obj.capureSnapShot();

      // Saving the image
      obj.saveImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Capturing an image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage capureSnapShot() {
      WritableImage WritableImage = null;

      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the VideoCapture class (camera:: 0)
      VideoCapture capture = new VideoCapture(0);

      // Reading the next video frame from the camera
      Mat matrix = new Mat();
      capture.read(matrix);

      // If camera is opened
      if( capture.isOpened()) {
         // If there is next video frame
         if (capture.read(matrix)) {
            // Creating BuffredImage from the matrix
            BufferedImage image = new BufferedImage(matrix.width(), 
               matrix.height(), BufferedImage.TYPE_3BYTE_BGR);
            
            WritableRaster raster = image.getRaster();
            DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
            byte[] data = dataBuffer.getData();
            matrix.get(0, 0, data);
            this.matrix = matrix;
            
            // Creating the Writable Image
            WritableImage = SwingFXUtils.toFXImage(image, null);
         }
      }
      return WritableImage;
   }
   public void saveImage() {
      // Saving the Image
      String file = "E:/OpenCV/chap22/sanpshot.jpg";

      // Instantiating the imgcodecs class
      Imgcodecs imageCodecs = new Imgcodecs();

      // Saving it again 
      imageCodecs.imwrite(file, matrix);
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Выход

При выполнении программы вы получите следующий вывод.

Захват кадра с помощью камеры

Если вы откроете указанный путь, вы сможете наблюдать тот же кадр, который сохраняется в виде файла jpg.

OpenCV — Распознавание лиц на картинке

Класс VideoCapture пакета org.opencv.videoio содержит классы и методы для захвата видео с помощью системной камеры. Давайте пойдем шаг за шагом и узнаем, как это сделать.

Шаг 1: Загрузите собственную библиотеку OpenCV

При написании кода Java с использованием библиотеки OpenCV первый шаг, который вам нужно сделать, это загрузить собственную библиотеку OpenCV с помощью loadLibrary () . Загрузите собственную библиотеку OpenCV, как показано ниже.

// Loading the core library 
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Шаг 2: создание класса CascadeClassifier

Класс CascadeClassifier пакета org.opencv.objdetect используется для загрузки файла классификатора. Создайте экземпляр этого класса, передав XML- файл lbpcascade_frontalface.xml, как показано ниже.

// Instantiating the CascadeClassifier 
String xmlFile = "E:/OpenCV/facedetect/lbpcascade_frontalface.xml"; 
CascadeClassifier classifier = new CascadeClassifier(xmlFile);

Шаг 3: Определить лица

Вы можете обнаружить лица на изображении, используя метод detectMultiScale () класса с именем CascadeClassifier . Этот метод принимает объект класса Mat, содержащий входное изображение, и объект класса MatOfRect для хранения обнаруженных лиц.

// Detecting the face in the snap 
MatOfRect faceDetections = new MatOfRect(); 
classifier.detectMultiScale(src, faceDetections);

пример

Следующая программа демонстрирует, как обнаружить лица на изображении.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
  
public class FaceDetectionImage {
   public static void main (String[] args) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap23/facedetection_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Instantiating the CascadeClassifier
      String xmlFile = "E:/OpenCV/facedetect/lbpcascade_frontalface.xml";
      CascadeClassifier classifier = new CascadeClassifier(xmlFile);

      // Detecting the face in the snap
      MatOfRect faceDetections = new MatOfRect();
      classifier.detectMultiScale(src, faceDetections);
      System.out.println(String.format("Detected %s faces", 
         faceDetections.toArray().length));

      // Drawing boxes
      for (Rect rect : faceDetections.toArray()) {
         Imgproc.rectangle(
            src,                                               // where to draw the box
            new Point(rect.x, rect.y),                            // bottom left
            new Point(rect.x + rect.width, rect.y + rect.height), // top right
            new Scalar(0, 0, 255),
            3                                                     // RGB colour
         );
      }

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap23/facedetect_output1.jpg", src);

      System.out.println("Image Processed");
   }
}

Предположим, что следующим является входное изображение facedetection_input.jpg, указанное в вышеуказанной программе.

Ввод FaceDetection

Выход

При выполнении программы вы получите следующий вывод:

Detected 3 faces 
Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Выход FaceDetection

OpenCV — распознавание лиц с помощью камеры

Следующая программа демонстрирует, как распознавать лица с помощью системной камеры и отображать ее с помощью окна JavaFX.

пример

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;

import java.io.FileNotFoundException;
import java.io.IOException;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.videoio.VideoCapture;

public class faceDetectionJavaFXX extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws FileNotFoundException, IOException {
      // Capturing the snapshot from the camera
      faceDetectionJavaFXX obj = new faceDetectionJavaFXX();
      WritableImage writableImage = obj.capureFrame();

      // Saving the image
      obj.saveImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Capturing an image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage capureFrame() {
      WritableImage writableImage = null;

      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the VideoCapture class (camera:: 0)
      VideoCapture capture = new VideoCapture(0);

      // Reading the next video frame from the camera
      Mat matrix = new Mat();
      capture.read(matrix);

      // If camera is opened
      if(!capture.isOpened()) {
         System.out.println("camera not detected");
      } else
         System.out.println("Camera detected ");
           
      // If there is next video frame
      if (capture.read(matrix)) {
         /////// Detecting the face in the snap /////
         String file = "E:/OpenCV/facedetect/lbpcascade_frontalface.xml";
         CascadeClassifier classifier = new CascadeClassifier(file);

         MatOfRect faceDetections = new MatOfRect();
         classifier.detectMultiScale(matrix, faceDetections);
         System.out.println(String.format("Detected %s faces",
            faceDetections.toArray().length));

         // Drawing boxes
         for (Rect rect : faceDetections.toArray()) {
            Imgproc.rectangle(
               matrix,                                   //where to draw the box
               new Point(rect.x, rect.y),                            //bottom left
               new Point(rect.x + rect.width, rect.y + rect.height), //top right
               new Scalar(0, 0, 255)                                 //RGB colour
            );
         }
         // Creating BuffredImage from the matrix
         BufferedImage image = new BufferedImage(matrix.width(), matrix.height(),
            BufferedImage.TYPE_3BYTE_BGR);
         
         WritableRaster raster = image.getRaster();
         DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
         byte[] data = dataBuffer.getData();
         matrix.get(0, 0, data);

         this.matrix = matrix;
           
         // Creating the Writable Image
         writableImage = SwingFXUtils.toFXImage(image, null);
      }
      return writableImage;
   }
   public void saveImage() {
      // Saving the Image
      String file = "E:/OpenCV/chap23/facedetected.jpg";

      // Instantiating the imagecodecs class
      Imgcodecs imageCodecs = new Imgcodecs();

      // Saving it again
      imageCodecs.imwrite(file, matrix);
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Выход

При выполнении программы вы получите следующий вывод.

Обнаружение лица с помощью камеры

Если вы откроете указанный путь, вы увидите тот же моментальный снимок, сохраненный как изображение jpg .

OpenCV — аффинный перевод

Вы можете выполнить аффинный перевод изображения, используя метод warpAffine () класса imgproc. Ниже приводится синтаксис этого метода —

Imgproc.warpAffine(src, dst, tranformMatrix , size);

Этот метод принимает следующие параметры —

  • src — Объект Mat, представляющий источник (входное изображение) для этой операции.

  • dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

  • tranformMatrix — объект Mat, представляющий матрицу преобразования.

  • размер — переменная типа integer, представляющая размер выходного изображения.

src — Объект Mat, представляющий источник (входное изображение) для этой операции.

dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

tranformMatrix — объект Mat, представляющий матрицу преобразования.

размер — переменная типа integer, представляющая размер выходного изображения.

пример

Следующая программа демонстрирует, как применить аффинную операцию к данному изображению.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class AffineTranslation {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap24/transform_input.jpg";
      Mat src = Imgcodecs.imread(file);

      //Creating an empty matrix to store the result
      Mat dst = new Mat();

      Point p1 = new Point( 0,0 );
      Point p2 = new Point( src.cols() - 1, 0 );
      Point p3 = new Point( 0, src.rows() - 1 );
      Point p4 = new Point( src.cols()*0.0, src.rows()*0.33 );
      Point p5 = new Point( src.cols()*0.85, src.rows()*0.25 );
      Point p6 = new Point( src.cols()*0.15, src.rows()*0.7 );
      
      MatOfPoint2f ma1 = new MatOfPoint2f(p1,p2,p3);
      MatOfPoint2f ma2 = new MatOfPoint2f(p4,p5,p6);

      // Creating the transformation matrix
      Mat tranformMatrix = Imgproc.getAffineTransform(ma1,ma2);

      // Creating object of the class Size
      Size size = new Size(src.cols(), src.cols());

      // Applying Wrap Affine
      Imgproc.warpAffine(src, dst, tranformMatrix, size);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap24/Affinetranslate.jpg", dst);

      System.out.println("Image Processed");
   }
}

Предположим, что следующим является входное изображение transform_input.jpg, указанное в вышеуказанной программе.

Преобразование ввода

Выход

Выполнив его, вы получите следующий вывод —

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Аффинный перевод

OpenCV — Вращение

Вы можете выполнить операцию поворота изображения, используя метод warpAffine () класса imgproc . Ниже приводится синтаксис этого метода —

Imgproc.warpAffine(src, dst, rotationMatrix, size);

Этот метод принимает следующие параметры —

  • src — Объект Mat, представляющий источник (входное изображение) для этой операции.

  • dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

  • вращениеМатрица — объект Mat, представляющий матрицу вращения.

  • размер — переменная типа integer, представляющая размер выходного изображения.

src — Объект Mat, представляющий источник (входное изображение) для этой операции.

dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

вращениеМатрица — объект Mat, представляющий матрицу вращения.

размер — переменная типа integer, представляющая размер выходного изображения.

пример

Следующая программа демонстрирует, как вращать изображение.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Rotation {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap24/transform_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating a Point object
      Point point = new Point(300, 200)

      // Creating the transformation matrix M
      Mat rotationMatrix = Imgproc.getRotationMatrix2D(point, 30, 1);

      // Creating the object of the class Size
      Size size = new Size(src.cols(), src.cols());

      // Rotating the given image
      Imgproc.warpAffine(src, dst, rotationMatrix, size);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap24/rotate_output.jpg", dst);

      System.out.println("Image Processed");
   }
}

Предположим, что следующим является входное изображение transform_input.jpg, указанное в вышеуказанной программе.

Преобразование ввода

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Повернуть вывод

OpenCV — масштабирование

Вы можете выполнить масштабирование изображения, используя метод resize () класса imgproc . Ниже приводится синтаксис этого метода.

resize(Mat src, Mat dst, Size dsize, double fx, double fy, int interpolation)

Этот метод принимает следующие параметры —

  • src — Объект Mat, представляющий источник (входное изображение) для этой операции.

  • dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

  • dsize — объект Size, представляющий размер выходного изображения.

  • fx — переменная типа double, представляющая масштабный коэффициент вдоль горизонтальной оси.

  • fy — переменная типа double, представляющая масштабный коэффициент вдоль вертикальной оси.

  • Интерполяция — целочисленная переменная, представляющая метод интерполяции.

src — Объект Mat, представляющий источник (входное изображение) для этой операции.

dst — объект Mat, представляющий место назначения (выходное изображение) для этой операции.

dsize — объект Size, представляющий размер выходного изображения.

fx — переменная типа double, представляющая масштабный коэффициент вдоль горизонтальной оси.

fy — переменная типа double, представляющая масштабный коэффициент вдоль вертикальной оси.

Интерполяция — целочисленная переменная, представляющая метод интерполяции.

пример

Следующая программа демонстрирует, как применить масштабное преобразование к изображению.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Scaling {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap24/transform_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating the Size object
      Size size = new Size(src.rows()*2, src.rows()*2);

      // Scaling the Image
      Imgproc.resize(src, dst, size, 0, 0, Imgproc.INTER_AREA);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap24/scale_output.jpg", dst);

      System.out.println("Image Processed");
   }
}

Предположим, что ниже приведено входное изображение transform_input.jpg, указанное в вышеуказанной программе (размер — ширина: 300 пикселей и высота: 300 пикселей).

Преобразование ввода

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом (размер — ширина: 600 пикселей и высота: 600 пикселей) —

Масштаб выходного

OpenCV — Цветные карты

В OpenCV вы можете применять различные цветовые карты к изображению, используя метод applyColorMap () класса Imgproc . Ниже приводится синтаксис этого метода —

applyColorMap(Mat src, Mat dst, int colormap)

Он принимает три параметра —

  • src — Объект класса Mat, представляющий исходное (входное) изображение.

  • dst — Объект класса Mat, представляющий целевое (выходное) изображение.

  • colormap — переменная целочисленного типа, представляющая тип применяемой цветовой карты.

src — Объект класса Mat, представляющий исходное (входное) изображение.

dst — Объект класса Mat, представляющий целевое (выходное) изображение.

colormap — переменная целочисленного типа, представляющая тип применяемой цветовой карты.

пример

Следующая программа демонстрирует, как применить цветовую карту к изображению.

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class ColorMapTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap25/color_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying color map to an image
      Imgproc.applyColorMap(src, dst, Imgproc.COLORMAP_HOT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap25/colormap_hot.jpg", dst);
      System.out.println("Image processed");
   }
}

Предположим, что следующим является входное изображение color_input.jpg, указанное в вышеуказанной программе.

Цветовой ввод

Выход

Выполнив вышеуказанную программу, вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Цветовой выход

Больше операций

В дополнение к COLORMAP_HOT, продемонстрированному в предыдущем примере, OpenCV обслуживает различные другие типы цветовых карт. Все эти типы представлены предопределенными статическими полями (фиксированными значениями) класса Imgproc.

Вы можете выбрать тип нужной вам цветовой карты, передав соответствующее предопределенное значение параметру colormap метода applyColorMap () .

Imgproc.applyColorMap(src, dst, Imgproc.COLORMAP_HOT );

Ниже приведены значения, представляющие различные типы цветовых карт и их соответствующие выходные данные.

Операция и описание Выход
COLORMAP_AUTUMN COLORMAP_AUTUMN
COLORMAP_BONE COLORMAP_BONE
COLORMAP_COOL COLORMAP_COOL
COLORMAP_HOT COLORMAP_HOT
COLORMAP_HSV COLORMAP_HSV
COLORMAP_JET COLORMAP_JET
COLORMAP_OCEAN COLORMAP_OCEAN
COLORMAP_PARULA COLORMAP_PARULA
COLORMAP_PINK COLORMAP_PINK
COLORMAP_RAINBOW COLORMAP_RAINBOW
COLORMAP_SPRING COLORMAP_SPRING
COLORMAP_SUMMER COLORMAP_SUMMER
COLORMAP_WINTER COLORMAP_WINTER

OpenCV — обнаружение острых кромок

Canny Edge Detection используется для обнаружения краев на изображении. Он принимает изображение в градациях серого в качестве входных данных и использует многоступенчатый алгоритм.

Вы можете выполнить эту операцию над изображением, используя метод Canny () класса imgproc , ниже приведен синтаксис этого метода.

Canny(image, edges, threshold1, threshold2)

Этот метод принимает следующие параметры —

  • image — Объект Mat, представляющий источник (входное изображение) для этой операции.

  • ребра — объект Mat, представляющий пункт назначения (ребра) для этой операции.

  • threshold1 — переменная типа double, представляющая первый порог для процедуры гистерезиса.

  • threshold2 — переменная типа double, представляющая второй порог для процедуры гистерезиса.

image — Объект Mat, представляющий источник (входное изображение) для этой операции.

ребра — объект Mat, представляющий пункт назначения (ребра) для этой операции.

threshold1 — переменная типа double, представляющая первый порог для процедуры гистерезиса.

threshold2 — переменная типа double, представляющая второй порог для процедуры гистерезиса.

пример

Следующая программа является примером, демонстрирующим, как выполнить операцию Canny Edge Detection для данного изображения.

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class CannyEdgeDetection {
   public static void main(String args[]) throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

      // Reading the Image from the file and storing it in to a Matrix object
      String file = "E:/OpenCV/chap17/canny_input.jpg";

      // Reading the image
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat gray = new Mat();

      // Converting the image from color to Gray
      Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
      Mat edges = new Mat();

      // Detecting the edges
      Imgproc.Canny(gray, edges, 60, 60*3);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap17/canny_output.jpg", edges);
      System.out.println("Image Loaded");
   } 
}

Предположим, что следующим является входное изображение canny_input.jpg, указанное в вышеуказанной программе.

Canny Input

Выход

Выполнив вышеуказанную программу, вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Canny Output

OpenCV — Hough Line Transform

Вы можете определить форму данного изображения, применив технику преобразования Хафа, используя метод HoughLines () класса Imgproc . Ниже приводится синтаксис этого метода.

HoughLines(image, lines, rho, theta, threshold)

Этот метод принимает следующие параметры —

  • image — Объект класса Mat, представляющий исходное (входное) изображение.

  • lines — объект класса Mat, в котором хранится вектор, в котором хранятся параметры (r, Φ) линий.

  • rho — переменная типа double, представляющая разрешение параметра r в пикселях.

  • theta — переменная типа double, представляющая разрешение параметра Φ в радианах.

  • Порог — переменная типа integer, представляющая минимальное количество пересечений для «обнаружения» линии.

image — Объект класса Mat, представляющий исходное (входное) изображение.

lines — объект класса Mat, в котором хранится вектор, в котором хранятся параметры (r, Φ) линий.

rho — переменная типа double, представляющая разрешение параметра r в пикселях.

theta — переменная типа double, представляющая разрешение параметра Φ в радианах.

Порог — переменная типа integer, представляющая минимальное количество пересечений для «обнаружения» линии.

пример

Следующая программа демонстрирует, как обнаружить линии Хафа на заданном изображении.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class HoughlinesTest {
   public static void main(String args[]) throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file = "E:/OpenCV/chap21/hough_input.jpg";

      // Reading the image
      Mat src = Imgcodecs.imread(file,0);

      // Detecting edges of it
      Mat canny = new Mat();
      Imgproc.Canny(src, canny, 50, 200, 3, false);

      // Changing the color of the canny
      Mat cannyColor = new Mat();
      Imgproc.cvtColor(canny, cannyColor, Imgproc.COLOR_GRAY2BGR);

      // Detecting the hough lines from (canny)
      Mat lines = new Mat();
      Imgproc.HoughLines(canny, lines, 1, Math.PI/180, 100);

      System.out.println(lines.rows());
      System.out.println(lines.cols());

      // Drawing lines on the image
      double[] data;
      double rho, theta;
      Point pt1 = new Point();
      Point pt2 = new Point();
      double a, b;
      double x0, y0;
      
      for (int i = 0; i < lines.cols(); i++) {
         data = lines.get(0, i);
         rho = data[0];
         theta = data[1];
         
         a = Math.cos(theta);
         b = Math.sin(theta);
         x0 = a*rho;
         y0 = b*rho;
         
         pt1.x = Math.round(x0 + 1000*(-b));
         pt1.y = Math.round(y0 + 1000*(a));
         pt2.x = Math.round(x0 - 1000*(-b));
         pt2.y = Math.round(y0 - 1000 *(a));
         Imgproc.line(cannyColor, pt1, pt2, new Scalar(0, 0, 255), 6);
      }
      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap21/hough_output.jpg", cannyColor);
          
      System.out.println("Image Processed");
   }
}

Предположим, что следующим является входное изображение hough_input.jpg, указанное в вышеуказанной программе.

Hough Вход

Выход

При выполнении программы вы получите следующий вывод:

143 
1 
Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —

Hough выходной

OpenCV — выравнивание гистограммы

Гистограмма изображения показывает частоту значений интенсивности пикселей. На гистограмме изображения ось X показывает интенсивность уровня серого, а ось Y показывает частоту этих интенсивностей.

Выравнивание гистограммы улучшает контраст изображения, чтобы расширить диапазон интенсивности. Вы можете выровнять гистограмму данного изображения, используя метод equalizeHist () класса Imgproc . Ниже приводится синтаксис этого метода.

equalizeHist(src, dst)

Этот метод принимает следующие параметры —

  • src — Объект класса Mat, представляющий исходное (входное) изображение.

  • dst — Объект класса Mat, представляющий выходные данные. (Изображение получено после выравнивания гистограммы)

src — Объект класса Mat, представляющий исходное (входное) изображение.

dst — Объект класса Mat, представляющий выходные данные. (Изображение получено после выравнивания гистограммы)

пример

Следующая программа демонстрирует, как выровнять гистограмму данного изображения.

import java.util.ArrayList;
import java.util.List;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class HistoTest {
   public static void main (String[] args) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap20/histo_input.jpg";

      // Load the image
      Mat img = Imgcodecs.imread(file);

      // Creating an empty matrix
      Mat equ = new Mat();
      img.copyTo(equ);

      // Applying blur
      Imgproc.blur(equ, equ, new Size(3, 3));

      // Applying color
      Imgproc.cvtColor(equ, equ, Imgproc.COLOR_BGR2YCrCb);
      List<Mat> channels = new ArrayList<Mat>();

      // Splitting the channels
      Core.split(equ, channels);

      // Equalizing the histogram of the image
      Imgproc.equalizeHist(channels.get(0), channels.get(0));
      Core.merge(channels, equ);
      Imgproc.cvtColor(equ, equ, Imgproc.COLOR_YCrCb2BGR);

      Mat gray = new Mat();
      Imgproc.cvtColor(equ, gray, Imgproc.COLOR_BGR2GRAY);
      Mat grayOrig = new Mat();
      Imgproc.cvtColor(img, grayOrig, Imgproc.COLOR_BGR2GRAY);

      Imgcodecs.imwrite("E:/OpenCV/chap20/histo_output.jpg", equ);
      System.out.println("Image Processed");
   }
}

Предположим, что следующим является входное изображение histo_input.jpg, указанное в вышеуказанной программе.

Гисто Ввод

Выход

При выполнении программы вы получите следующий вывод:

Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —