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/ При нажатии вы увидите его домашнюю страницу, как показано ниже.
Шаг 2 — Теперь нажмите на ссылку « Загрузки», выделенную на скриншоте выше. При нажатии вы будете перенаправлены на страницу загрузок OpenCV.
Шаг 3 — При нажатии на выделенную ссылку на приведенном выше снимке экрана будет загружен файл с именем opencv-3.1.0.exe . Извлеките этот файл, чтобы создать папку opencv в вашей системе, как показано на следующем снимке экрана.
Шаг 4 — Откройте папку OpenCV → build → java . Здесь вы найдете jar-файл OpenCV с именем opencv-310.jar . Сохраните этот файл в отдельной папке для дальнейшего использования.
Установка Затмения
После загрузки необходимых файлов JAR вы должны внедрить эти файлы JAR в свою среду Eclipse. Вы можете сделать это, установив Build Path для этих файлов JAR и используя pom.xml .
Установка пути сборки
Ниже приведены шаги по настройке OpenCV в Eclipse.
Шаг 1 — Убедитесь, что вы установили Eclipse в вашей системе. Если нет, загрузите и установите Eclipse в своей системе.
Шаг 2. Откройте Eclipse, нажмите «Файл», «Новый» и откройте новый проект, как показано на следующем снимке экрана.
Шаг 3 — При выборе проекта вы получите мастер New Project . В этом мастере выберите проект Java и нажмите кнопку « Далее» , как показано на следующем снимке экрана.
Шаг 4. В дальнейшем вы будете перенаправлены в мастер New Java Project . Создайте новый проект и нажмите « Далее» , как показано на следующем снимке экрана.
Шаг 5 — После создания нового проекта, щелкните по нему правой кнопкой мыши. Выберите Build Path и нажмите Configure Build Path…, как показано на следующем снимке экрана.
Шаг 6 — Нажав на опцию Build Path , вы будете перенаправлены к мастеру Java Build Path . Нажмите кнопку Add External JARs , как показано на следующем снимке экрана.
Шаг 7 — Выберите путь, по которому вы сохранили файл opencv-310.jar .
Шаг 8 — При нажатии кнопки « Открыть» на приведенном выше снимке экрана эти файлы будут добавлены в вашу библиотеку.
Шаг 9 — Нажав OK , вы успешно добавите необходимые JAR-файлы в текущий проект, и вы можете проверить эти добавленные библиотеки, развернув Ссылочные библиотеки.
Установка пути для собственных библиотек
В дополнение к JAR-файлам вам нужно указать путь к собственным библиотекам (DLL-файлам) OpenCV.
Расположение файлов DLL — Откройте папку установки OpenCV и перейдите в подпапку build → java . Здесь вы найдете две папки x64 (64-битная) и x86 (32-битная), которые содержат DLL- файлы OpenCV.
Откройте соответствующую папку, подходящую для вашей операционной системы, затем вы увидите файл dll , как показано на следующем снимке экрана.
Теперь также установите путь для этого файла, выполнив шаги, указанные ниже —
Шаг 1 — еще раз откройте окно JavaBuildPath. Здесь вы можете увидеть добавленный файл JAR и Системную библиотеку 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
Если вы откроете указанный путь, вы можете наблюдать сохраненное изображение следующим образом —
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
Кроме того, вы можете увидеть окно, отображающее загруженное изображение, как показано ниже:
Отображение изображения с использованием 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
Кроме того, вы можете увидеть окно, отображающее загруженное изображение, как показано ниже:
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, указанное в вышеуказанной программе.
Выходное изображение
При выполнении программы вы получите следующий вывод.
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, указанное в вышеуказанной программе.
Выходное изображение
При выполнении программы вы получите следующий вывод.
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, указанное в вышеуказанной программе.
Выходное изображение
При выполнении программы вы получите следующий вывод.
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, указанное в вышеуказанной программе.
Выходное изображение
При выполнении программы вы получите следующий вывод.
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —
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, указанное в вышеуказанной программе.
Выход
При выполнении программы вы получите следующий вывод:
Image Processed
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —
Больше операций
В дополнение к морфологической операции TOPHAT , продемонстрированной в предыдущем примере , OpenCV обслуживает различные другие типы морфологий. Все эти типы представлены предопределенными статическими полями (фиксированными значениями) класса Imgproc .
Вы можете выбрать нужный тип морфологии, передав соответствующее предопределенное значение параметру op метода morphologyEx () .
// Applying Blur effect on the Image Imgproc.morphologyEx(src, dst, Imgproc.MORPH_TOPHAT , kernel);
Ниже приведены значения, представляющие тип морфологических операций и их соответствующие результаты.
Операция и описание | Выход |
---|---|
MORPH_BLACKHAT | |
MORPH_CLOSE | |
MORPH_CROSS | |
MORPH_DILATE | |
MORPH_ELLIPSE | |
MORPH_ERODE | |
MORPH_GRADIENT | |
MORPH_OPEN | |
MORPH_RECT | |
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_INV | |
THRESH_TRUNC | |
THRESH_TOZERO | |
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 | ||
THRESH_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_ISOLATED | |
BORDER_DEFAULT | |
BORDER_REFLECT | |
BORDER_REFLECT_101 | |
BORDER_REFLECT101 | |
BORDER_REPLICATE | |
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 | |
1 | 0 | |
1 | 1 |
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
При передаче различных значений последним параметрам (dx и dy) (среди 0 и 1) вы получите разные выходные данные —
// Applying scharr on the Image Imgproc.Scharr(src, dst, -1, 1, 1 );
Ниже приведена таблица, в которой перечислены различные значения переменных dx и dy метода scharr () и их соответствующие выходные данные.
Х-производное | Y-производное | Выход |
---|---|---|
0 | 1 | |
1 | 0 |
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_L1 | |
DIST_L2 | |
DIST_LABEL_PIXEL | |
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, указанное в вышеуказанной программе.
Выход
При выполнении программы вы получите следующий вывод:
Detected 3 faces Image Processed
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —
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_BONE | |
COLORMAP_COOL | |
COLORMAP_HOT | |
COLORMAP_HSV | |
COLORMAP_JET | |
COLORMAP_OCEAN | |
COLORMAP_PARULA | |
COLORMAP_PINK | |
COLORMAP_RAINBOW | |
COLORMAP_SPRING | |
COLORMAP_SUMMER | |
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, указанное в вышеуказанной программе.
Выход
Выполнив вышеуказанную программу, вы получите следующий вывод:
Image Processed
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —
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, указанное в вышеуказанной программе.
Выход
При выполнении программы вы получите следующий вывод:
143 1 Image Processed
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом —