OpenCV - Краткое руководство
OpenCV - это кроссплатформенная библиотека, с помощью которой мы можем разрабатывать в реальном времени computer vision applications. В основном он фокусируется на обработке изображений, захвате и анализе видео, включая такие функции, как обнаружение лиц и обнаружение объектов.
Начнем главу с определения термина «компьютерное зрение».
Компьютерное зрение
Компьютерное зрение можно определить как дисциплину, которая объясняет, как реконструировать, прервать и понять трехмерную сцену из ее двухмерных изображений с точки зрения свойств структуры, присутствующей в сцене. Он занимается моделированием и воспроизведением человеческого зрения с помощью компьютерного программного обеспечения и оборудования.
Компьютерное зрение существенно пересекается со следующими полями -
Image Processing - Он фокусируется на манипулировании изображениями.
Pattern Recognition - В нем объясняются различные методы классификации паттернов.
Photogrammetry - Это связано с получением точных измерений по изображениям.
Компьютерное зрение против обработки изображений
Image processingзанимается преобразованием изображения в изображение. Входом и выходом обработки изображения являются изображения.
Computer visionэто построение явных, содержательных описаний физических объектов на основе их изображений. Результатом компьютерного зрения является описание или интерпретация структур в трехмерной сцене.
Приложения компьютерного зрения
Здесь мы перечислили некоторые из основных областей, в которых широко используется компьютерное зрение.
Применение робототехники
Локализация - автоматическое определение местоположения робота
Navigation
Избегание препятствий
Сборка (врезка, сварка, покраска)
Манипуляции (например, робот-манипулятор PUMA)
Human Robot Interaction (HRI) - Интеллектуальная робототехника для взаимодействия с людьми и обслуживания людей
Применение в медицине
- Классификация и обнаружение (например, классификация поражения или клеток и обнаружение опухоли)
- 2D / 3D сегментация
- 3D-реконструкция человеческого органа (МРТ или УЗИ)
- Робототехническая хирургия под контролем зрения
Приложение для промышленной автоматизации
- Производственный контроль (обнаружение дефектов)
- Assembly
- Считывание штрих-кода и этикеток на упаковке
- Сортировка объектов
- Понимание документа (например, 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 в свою систему. Следуйте инструкциям ниже.
Step 1 - Откройте домашнюю страницу OpenCV нажав следующую ссылку: http://opencv.org/ При нажатии вы увидите его домашнюю страницу, как показано ниже.
Step 2 - Теперь нажмите Downloadsссылка выделена на скриншоте выше. При нажатии вы будете перенаправлены на страницу загрузок OpenCV.
Step 3 - При нажатии выделенной ссылки на скриншоте выше открывается файл с именем opencv-3.1.0.exeбудет загружен. Извлеките этот файл, чтобы создать папкуopencv в вашей системе, как показано на следующем снимке экрана.
Step 4 - Откройте папку OpenCV → build → java. Здесь вы найдете jar-файл OpenCV с именемopencv-310.jar. Сохраните этот файл в отдельной папке для дальнейшего использования.
Установка Eclipse
После загрузки необходимых файлов JAR вы должны встроить эти файлы JAR в среду Eclipse. Вы можете сделать это, установив путь сборки к этим файлам JAR и используяpom.xml.
Установка пути сборки
Ниже приведены шаги по настройке OpenCV в Eclipse.
Step 1- Убедитесь, что в вашей системе установлен Eclipse. Если нет, загрузите и установите Eclipse в свою систему.
Step 2 - Откройте Eclipse, нажмите «Файл», «Создать» и «Открыть новый проект», как показано на следующем снимке экрана.
Step 3 - Выбрав проект, вы получите New Projectволшебник. В этом мастере выберите проект Java и продолжите, нажав кнопкуNext кнопку, как показано на следующем снимке экрана.
Step 4 - Далее вы будете перенаправлены на New Java Project wizard. Создайте новый проект и нажмитеNext, как показано на следующем снимке экрана.
Step 5- После создания нового проекта щелкните его правой кнопкой мыши. ВыбратьBuild Path и нажмите Configure Build Path… как показано на следующем снимке экрана.
Step 6 - При нажатии на Build Path вариант, вы будете перенаправлены на Java Build Path wizard. Щелкните значокAdd External JARs кнопку, как показано на следующем снимке экрана.
Step 7 - Выберите путь, по которому вы сохранили файл opencv-310.jar.
Step 8 - При нажатии на Open на скриншоте выше, эти файлы будут добавлены в вашу библиотеку.
Step 9 - При нажатии OK, вы успешно добавите необходимые файлы JAR в текущий проект и сможете проверить эти добавленные библиотеки, развернув библиотеки, на которые есть ссылки.
Установка пути для собственных библиотек
В дополнение к файлам JAR вам необходимо указать путь к собственным библиотекам (файлам DLL) OpenCV.
Location of DLL files - Откройте папку установки OpenCV и заходим в подпапку build → java. Здесь вы найдете две папкиx64 (64 бит) и x86 (32 бит), которые содержат dll файлы OpenCV.
Откройте соответствующую папку, подходящую для вашей операционной системы, после чего вы увидите dll файл, как показано на следующем снимке экрана.
Теперь установите путь для этого файла, выполнив следующие действия:
Step 1- Еще раз откройте окно JavaBuildPath. Здесь вы можете увидеть добавленный файл JAR иJRE System Library.
Step 2 - При расширении вы получите системные библиотеки и Native library location, как показано на следующем снимке экрана.
Step 3 - Дважды щелкните значок Native library location. Здесь вы можете увидетьNative Library Folder Configuration window как показано ниже.
Здесь нажмите кнопку External Folder… и выберите расположение dll файл в вашей системе.
Для захвата изображения мы используем такие устройства, как камеры и сканеры. Эти устройства записывают числовые значения изображения (например, значения пикселей). OpenCV - это библиотека, которая обрабатывает цифровые изображения, поэтому нам необходимо хранить эти изображения для обработки.
В MatКласс библиотеки OpenCV используется для хранения значений изображения. Он представляет собой n-мерный массив и используется для хранения данных изображения в оттенках серого или цветных изображений, объемов вокселей, векторных полей, облаков точек, тензоров, гистограмм и т. Д.
Этот класс состоит из двух частей данных: header и pointer
Header - Содержит такую информацию, как размер, метод, используемый для хранения, и адрес матрицы (постоянный размер).
Pointer - Сохраняет значения пикселей изображения (продолжает меняться).
Мат Класс
Библиотека OpenCV Java предоставляет этому классу то же имя (Mat) внутри пакета org.opencv.core.
Конструкторы
Класс Mat библиотеки OpenCV Java имеет различные конструкторы, с помощью которых вы можете создать объект Mat.
S.No | Конструкторы и описание |
---|---|
1 | Mat() В большинстве случаев это конструктор по умолчанию без параметров. Мы используем это в конструкторе, чтобы создать пустую матрицу и передать ее другим методам OpenCV. |
2 | Mat(int rows, int cols, int type) Этот конструктор принимает три параметра целочисленного типа, представляющих количество строк и столбцов в 2D-массиве и тип массива (который будет использоваться для хранения данных). |
3 | Mat(int rows, int cols, int type, Scalar s) Включая параметры предыдущего, этот конструктор дополнительно принимает в качестве параметра объект класса Scalar. |
4 | Mat(Size size, int type) Этот конструктор принимает два параметра: объект, представляющий размер матрицы, и целое число, представляющее тип массива, используемого для хранения данных. |
5 | Mat(Size size, int type, Scalar s) Включая параметры предыдущего, этот конструктор дополнительно принимает в качестве параметра объект класса Scalar. |
6 | Mat(long addr) |
7 | Mat(Mat m, Range rowRange) Этот конструктор принимает объект другой матрицы и объект класса Range, представляющий диапазон строк, которые должны быть взяты для создания новой матрицы. |
8 | Mat(Mat m, Range rowRange, Range colRange) Включая параметры предыдущего, этот конструктор дополнительно принимает объект класса. Диапазон, представляющий диапазон столбца. |
9 | Mat(Mat m, Rect roi) Этот конструктор принимает два объекта, один из которых представляет другую матрицу, а другой - RЭгион Oж Iинтерес. |
Note -
Тип массива. Используйте CV_8UC1, ..., CV_64FC4 для создания матриц 1–4 каналов или CV_8UC (n), ..., CV_64FC (n) для создания многоканальных (до каналов CV_CN_MAX) матриц.
Типы матриц представляли различные поля класса CvType который принадлежит пакету org.opencv.core.
Методы и описание
Ниже приведены некоторые методы, предоставляемые классом Mat.
S.No | Методы и описание |
---|---|
1 | Mat col(int x) Этот метод принимает целочисленный параметр, представляющий индекс столбца, и извлекает и возвращает этот столбец. |
2 | Mat row(int y) Этот метод принимает целочисленный параметр, представляющий индекс строки, и извлекает и возвращает эту строку. |
3 | int cols() Этот метод возвращает количество столбцов в матрице. |
4 | int rows() Этот метод возвращает количество строк в матрице. |
5 | Mat setTo(Mat value) Этот метод принимает объект Mat type и устанавливает элементы массива в указанное значение. |
6 | Mat setTo(Scalar s) Этот метод принимает объект Scalar type и устанавливает элементы массива в указанное значение. |
Создание и отображение матрицы
В этом разделе мы собираемся обсудить наш первый пример 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));
Example
Вы можете использовать следующий программный код для создания и отображения простой матрицы на 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 предоставляет методы для чтения и записи изображений.
Example
Вы можете использовать следующий программный код для загрузки и сохранения изображений с помощью библиотеки 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
Если вы откроете указанный путь, вы можете увидеть сохраненное изображение следующим образом:
В Imgcodecs класс пакета org.opencv.imgcodecsпредоставляет методы для чтения и записи изображений. Используя OpenCV, вы можете прочитать изображение и сохранить его в матрице (при необходимости выполнить преобразования в матрице). Позже вы можете записать обработанную матрицу в файл.
В read() метод ImgcodecsКласс используется для чтения изображения с помощью OpenCV. Ниже приводится синтаксис этого метода.
imread(filename)
Он принимает аргумент (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);
пример
Следующий программный код показывает, как можно read an 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
В write() метод ImgcodecsКласс используется для записи изображения с помощью OpenCV. Чтобы написать изображение, повторите первые три шага из предыдущего примера.
Чтобы написать изображение, вам нужно вызвать imwrite() метод Imgcodecs класс.
Ниже приводится синтаксис этого метода.
imwrite(filename, mat)
Этот метод принимает следующие параметры -
filename - А String переменная, представляющая путь для сохранения файла.
mat - А Mat объект, представляющий записываемое изображение.
пример
Следующая программа является примером write an image с помощью программы 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 Java. В дополнение к этому мы также можем отображать загруженные изображения в отдельном окне, используя библиотеки графического интерфейса, такие как AWT / Swings и JavaFX.
Преобразование мата в буферное изображение
Для чтения изображения мы используем метод imread(). Этот метод возвращает считанное изображение в видеMatrix. Но, чтобы использовать этот образ с библиотеками графического интерфейса (AWT / Swings и JavaFX), он должен быть преобразован как объект классаBufferedImage пакета java.awt.image.BufferedImage.
Ниже приведены шаги для преобразования Mat объект OpenCV для BufferedImage объект.
Шаг 1: кодируйте мат в MatOfByte
Прежде всего, вам нужно преобразовать матрицу в матрицу байтов. Сделать это можно с помощью методаimencode() класса Imgcodecs. Ниже приводится синтаксис этого метода.
imencode(ext, image, matOfByte);
Этот метод принимает следующие параметры -
Ext - Параметр String, определяющий формат изображения (.jpg, .png и т. Д.)
image - Объект Mat изображения
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 class и добавьте созданное в буфере изображение в 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);
Example
Следующий программный код показывает, как можно read изображение и display это через окно поворота с использованием библиотеки 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);
Example
Следующий программный код показывает, как read изображение и display это через окно 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() метод и предопределенные поля Imgcodecs класс, вы можете прочитать данное изображение как другой тип.
Параметр flags метода imread () (IMREAD_XXX)
В предыдущих главах мы видели синтаксис imread() метод Imgcodecsкласс. Он принимает строковый аргумент, представляющий местоположение изображения, которое необходимо прочитать.
imread(filename)
В imread() метод имеет другой синтаксис.
imread(filename, int flags)
Этот синтаксис принимает два параметра -
filename - Принимает аргумент (filename), переменная типа String, представляющая путь к файлу, который необходимо прочитать.
flags- Целочисленное значение, представляющее предварительно определенное значение флага. Для каждого значения это считывает данное изображение как определенный тип (цвет шкалы серого и т. Д.)
Ниже приводится таблица, в которой перечислены различные поля, представленные в Imgproc class как значения для этого параметра.
S.No | Поля и описание |
---|---|
1 | IMREAD_COLOR Если для флага установлено это значение, загруженное изображение будет преобразовано в трехканальное цветное изображение 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, а размер изображения уменьшаются до ½, ¼ - го или ⅛ го исходного размера изображений по отношению к полю , используемому. |
6 | IMREAD_REDUCED_GRAYSCALE_2 IMREAD_REDUCED_GRAYSCALE_4 IMREAD_REDUCED_GRAYSCALE_8 Если флаг установлен на это значение, то изображение считывается как полутоновое одноканального изображения, а размер изображения уменьшается до ½, ¼ - го или ⅛ го исходного размера изображения по отношению к полю используется . |
7 | IMREAD_UNCHANGED Если для флага установлено это значение, загруженное изображение возвращается как есть. |
Следующая программа демонстрирует, как читать цветное изображение в оттенках серого и отображать его с помощью окна 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 указанные в вышеуказанной программе.
Выходное изображение
Выполнив программу, вы получите следующий результат.
Следующая программа демонстрирует, как читать цветное изображение как изображение типа BGR и отображать его с помощью окна JavaFX. Здесь мы прочитали изображение, передав флагIMREAD_COLOR к методу imread() вместе со строкой, содержащей путь к цветному изображению.
import java.awt.image.BufferedImage;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;
public class ReadingAsColored extends Application {
@Override
public void start(Stage stage) throws Exception {
WritableImage writableImage = loadAndConvert();
// Setting the image view
ImageView imageView = new ImageView(writableImage);
// Setting the position of the image
imageView.setX(10);
imageView.setY(10);
// setting the fit height and width of the image view
imageView.setFitHeight(400);
imageView.setFitWidth(600);
// Setting the preserve ratio of the image view
imageView.setPreserveRatio(true);
// Creating a Group object
Group root = new Group(imageView);
// Creating a scene object
Scene scene = new Scene(root, 600, 400);
// Setting title to the Stage
stage.setTitle("Reading as colored image");
// Adding scene to the stage
stage.setScene(scene);
// Displaying the contents of the stage
stage.show();
}
public WritableImage loadAndConvert() throws Exception {
// Loading the OpenCV core library
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
String input = "C:/EXAMPLES/OpenCV/sample.jpg";
Mat dst = new Mat();
// Reading the image
Mat src = Imgcodecs.imread(input, Imgcodecs.IMREAD_COLOR);
byte[] data1 = new byte[src.rows() * src.cols() * (int)(src.elemSize())];
src.get(0, 0, data1);
// Creating the buffered image
BufferedImage bufImage = new BufferedImage(src.cols(),src.rows(),
BufferedImage.TYPE_3BYTE_BGR);
// Setting the data elements to the image
bufImage.getRaster().setDataElements(0, 0, src.cols(), src.rows(), data1);
// Creating a WritableImage
WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
System.out.println("Image read");
return writableImage;
}
public static void main(String args[]) throws Exception {
launch(args);
}
}
Входное изображение
Предположим, что следующее - входное изображение sample.jpg указанные в вышеуказанной программе.
Выходное изображение
Выполнив программу, вы получите следующий результат.
В предыдущих главах мы обсуждали, как читать входное изображение как разные типы (двоичное, оттенки серого, BGR и т. Д.). В этой главе мы узнаем, как преобразовать один тип изображения в другой.
Класс с именем Imgproc пакета org.opencv.imgproc предоставляет методы для преобразования изображения из одного цвета в другой.
Преобразование цветных изображений в оттенки серого
Метод с именем cvtColor()используется для преобразования цветных изображений в оттенки серого. Ниже приводится синтаксис этого метода.
cvtColor(Mat src, Mat dst, int code)
Этот метод принимает следующие параметры -
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 указанные в вышеуказанной программе.
Выходное изображение
Выполнив программу, вы получите следующий результат.
Метод под названием 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 в оттенки серого.
Вы можете преобразовать изображение в градациях серого в двоичное, передав код 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 указанные в вышеуказанной программе.
Выходное изображение
Выполнив программу, вы получите следующий результат.
Вы можете использовать тот же метод, который упоминался в предыдущей главе, для преобразования изображения в градациях серого в двоичное изображение. Просто передайте путь для изображения в градациях серого в качестве входных данных для этой программы.
пример
Следующая программа демонстрирует, как читать изображение в оттенках серого как двоичное изображение и отображать его с помощью окна 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 указанные в вышеуказанной программе.
Выходное изображение
Выполнив программу, вы получите следующий результат.
Вы можете рисовать на изображении различные формы, такие как круг, прямоугольник, линия, эллипс, полилинии, выпуклость, полилинии, полилинии, используя соответствующие методы org.opencv.imgproc пакет.
Вы можете нарисовать круг на изображении с помощью метода circle() из imgprocкласс. Ниже приводится синтаксис этого метода -
circle(img, center, radius, color, thickness)
Этот метод принимает следующие параметры -
mat - А Mat объект, представляющий изображение, на котором должен быть нарисован круг.
point - А Point объект, представляющий центр круга.
radius - переменная типа integer представляющий радиус круга.
scalar - А Scalarобъект, представляющий цвет круга. (BGR)
thickness - An 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);
}
}
При выполнении вышеуказанной программы вы получите следующий результат -
Вы можете нарисовать линию на изображении с помощью метода line() из imgprocкласс. Ниже приводится синтаксис этого метода.
line(img, pt1, pt2, color, thickness)
Этот метод принимает следующие параметры -
mat - А Mat объект, представляющий изображение, на котором должна быть проведена линия.
pt1 and pt2 - два Point объекты, представляющие точки, между которыми должна быть проведена линия.
scalar - А Scalarобъект, представляющий цвет круга. (BGR)
thickness- целое число, представляющее толщину линии; по умолчанию значение толщины равно 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);
}
}
При выполнении вышеуказанной программы вы получите следующий результат -
Вы можете нарисовать прямоугольник на изображении с помощью метода rectangle() из imgprocкласс. Ниже приводится синтаксис этого метода -
rectangle(img, pt1, pt2, color, thickness)
Этот метод принимает следующие параметры -
mat - А Mat объект, представляющий изображение, на котором должен быть нарисован прямоугольник.
pt1 and pt2 - два Point объекты, представляющие вершины прямоугольника, который нужно нарисовать.
scalar - А Scalarобъект, представляющий цвет прямоугольника. (BGR)
thickness- целое число, представляющее толщину прямоугольника; по умолчанию значение толщины равно 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);
}
}
При выполнении вышеуказанной программы вы получите следующий результат -
Вы можете нарисовать эллипс на изображении с помощью метода rectangle() из imgprocкласс. Ниже приводится синтаксис этого метода -
ellipse(img, box, color, thickness)
Этот метод принимает следующие параметры -
mat - А Mat объект, представляющий изображение, на котором должен быть нарисован прямоугольник.
box - Объект RotatedRect (в этот прямоугольник рисуется эллипс).
scalar - А Scalarобъект, представляющий цвет прямоугольника. (BGR)
thickness- Целое число, представляющее толщину прямоугольника; по умолчанию значение толщины равно 1.
Конструктор RotatedRect class принимает объект класса 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);
}
}
При выполнении вышеуказанной программы вы получите следующий результат -
Вы можете нарисовать полилинии на изображении с помощью метода polylines() из imgprocкласс. Ниже приводится синтаксис этого метода.
polylines(img, pts, isClosed, color, thickness)
Этот метод принимает следующие параметры -
mat - А Mat объект, представляющий изображение, на котором должны быть нарисованы полилинии.
pts - А List объект, содержащий объекты типа MatOfPoint.
isClosed - Параметр типа boolean, определяющий, при какой погоде закрываются полилинии.
scalar - А Scalarобъект, представляющий цвет полилиний. (BGR)
thickness- Целое число, представляющее толщину полилиний; по умолчанию значение толщины равно 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);
}
}
При выполнении вышеуказанной программы вы получите следующий результат -
На изображении можно нарисовать выпуклые полилинии с помощью метода fillconvexPoly() из imgprocкласс. Ниже приводится синтаксис этого метода.
fillConvexPoly(Mat img, MatOfPoint points, Scalar color)
Этот метод принимает следующие параметры -
mat - А Mat объект, представляющий изображение, на котором должны быть нарисованы выпуклые полилинии.
points - А MatOfPoint объект, представляющий точки, между которыми должны быть проведены выпуклые полилинии.
scalar - А Scalarобъект, представляющий цвет выпуклых полилиний. (BGR)
Конструктор 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);
}
}
При выполнении вышеуказанной программы вы получите следующий результат -
Вы можете нарисовать на изображении линию со стрелкой, используя метод arrowedLine() из imgprocкласс. Ниже приводится синтаксис этого метода -
arrowedLine(Mat img, Point pt1, Point pt2, Scalar color)
Этот метод принимает следующие параметры -
mat - А Mat объект, представляющий изображение, на котором должна быть проведена линия со стрелкой.
pt1 and pt2 - два Point объекты, представляющие точки, между которыми должна быть проведена линия со стрелкой.
scalar - А Scalarобъект, представляющий цвет линии со стрелкой. (BGR)
пример
Следующая программа демонстрирует, как нарисовать линию со стрелкой на изображении и отобразить ее с помощью окна 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);
}
}
При выполнении вышеуказанной программы вы получите следующий результат -
Вы можете добавить текст к изображению с помощью метода arrowedLine() из imgprocкласс. Ниже приводится синтаксис этого метода.
putText(img, text, org, fontFace, fontScale, Scalar color, int thickness)
Этот метод принимает следующие параметры -
mat - А Mat объект, представляющий изображение, к которому должен быть добавлен текст.
text - А string переменная для представления добавляемого текста.
org - А Point объект, представляющий текстовую строку в нижнем левом углу изображения.
fontFace - Переменная целочисленного типа, представляющая тип шрифта.
fontScale - Переменная типа double, представляющая коэффициент масштабирования, умноженный на базовый размер шрифта.
scalar - А Scalarобъект, представляющий цвет текста, который нужно добавить. (BGR)
thickness - Целое число, представляющее толщину линии по умолчанию, значение толщины равно 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);
}
}
При выполнении вышеуказанной программы вы получите следующий результат -
Размытие (сглаживание) - это обычно используемая операция обработки изображения для уменьшения шума изображения. Процесс удаляет высокочастотный контент, например края, из изображения и делает его сглаженным.
В общем, размытие достигается путем свертки (каждый элемент изображения добавляется к своим локальным соседям, взвешиваемым ядром) изображения через ядро фильтра нижних частот.
Размытие (усреднение)
Во время этой операции изображение сворачивается с помощью прямоугольного фильтра (нормализуется). В этом процессе центральный элемент изображения заменяется средним значением всех пикселей в области ядра.
Вы можете выполнить эту операцию с изображением, используя метод blur() из imgprocкласс. Ниже приводится синтаксис этого метода -
blur(src, dst, ksize, anchor, borderType)
Этот метод принимает следующие параметры -
src - А Mat объект, представляющий источник (входное изображение) для этой операции.
dst - А Mat объект, представляющий место назначения (выходное изображение) для этой операции.
ksize - А Size объект, представляющий размер ядра.
anchor - Переменная целочисленного типа, представляющая точку привязки.
borderType - Переменная целочисленного типа, представляющая тип границы, которая будет использоваться для вывода.
пример
Следующая программа демонстрирует, как выполнить операцию усреднения (размытия) изображения.
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
В операции «Размытие по Гауссу» изображение сворачивается с помощью фильтра Гаусса вместо прямоугольного фильтра. Фильтр Гаусса представляет собой фильтр нижних частот, который удаляет высокочастотные составляющие и уменьшает его.
Вы можете выполнить эту операцию с изображением, используя Gaussianblur() метод imgprocкласс. Ниже приводится синтаксис этого метода -
GaussianBlur(src, dst, ksize, sigmaX)
Этот метод принимает следующие параметры -
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
Операция «Медианное размытие» аналогична другим методам усреднения. Здесь центральный элемент изображения заменяется медианой всех пикселей в области ядра. Эта операция обрабатывает края при удалении шума.
Вы можете выполнить эту операцию с изображением, используя medianBlur() метод imgprocкласс. Ниже приводится синтаксис этого метода -
medianBlur(src, dst, ksize)
Этот метод принимает следующие параметры -
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
Фильтрация изображений позволяет применять к изображению различные эффекты. В этой главе и в последующих трех главах мы собираемся обсудить различные операции фильтрации, такие как Двусторонний фильтр, Блочный фильтр, Блочный фильтр SQR и Filter2D.
Двусторонний фильтр
Операция «Двусторонний фильтр» применяет к фильтру двустороннее изображение. Вы можете выполнить эту операцию с изображением, используяmedianBlur() метод imgprocкласс. Ниже приводится синтаксис этого метода.
bilateralFilter(src, dst, d, sigmaColor, sigmaSpace, borderType)
Этот метод принимает следующие параметры -
src - А Mat объект, представляющий источник (входное изображение) для этой операции.
dst - А Mat объект, представляющий место назначения (выходное изображение) для этой операции.
d - Переменная целочисленного типа, представляющая диаметр окрестности пикселя.
sigmaColor - Переменная целочисленного типа, представляющая сигму фильтра в цветовом пространстве.
sigmaSpace - Переменная целочисленного типа, представляющая сигму фильтра в координатном пространстве.
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
Операция блочного фильтра аналогична операции усреднения размытия; он применяет двустороннее изображение к фильтру. Здесь вы можете выбрать, следует ли нормализовать поле или нет.
Вы можете выполнить эту операцию с изображением, используя boxFilter() метод imgprocкласс. Ниже приводится синтаксис этого метода -
boxFilter(src, dst, ddepth, ksize, anchor, normalize, borderType)
Этот метод принимает следующие параметры -
src - А Mat объект, представляющий источник (входное изображение) для этой операции.
dst - А Mat объект, представляющий место назначения (выходное изображение) для этой операции.
ddepth - Переменная целочисленного типа, представляющая глубину выходного изображения.
ksize - А Size объект, представляющий размер размывающего ядра.
anchor - Переменная целочисленного типа, представляющая точку привязки.
Normalize - Переменная типа boolean, определяющая погоду, когда ядро должно быть нормализовано.
borderType - Целочисленный объект, представляющий тип используемой границы.
пример
Следующая программа демонстрирует, как выполнить операцию блочного фильтра с изображением.
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
Вы можете выполнить операцию SQRBox Filter с изображением, используя boxFilter() метод imgprocкласс. Ниже приводится синтаксис этого метода -
sqrBoxFilter(src, dst, ddepth, ksize)
Этот метод принимает следующие параметры -
src - А Mat объект, представляющий источник (входное изображение) для этой операции.
dst - А Mat объект, представляющий место назначения (выходное изображение) для этой операции.
ddepth - Переменная целочисленного типа, представляющая глубину выходного изображения.
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
Операция Filter2D сворачивает изображение с ядром. Вы можете выполнить эту операцию с изображением, используяFilter2D() метод imgprocкласс. Ниже приводится синтаксис этого метода -
filter2D(src, dst, ddepth, kernel)
Этот метод принимает следующие параметры -
src - А Mat объект, представляющий источник (входное изображение) для этой операции.
dst - А Mat объект, представляющий место назначения (выходное изображение) для этой операции.
ddepth - Переменная целочисленного типа, представляющая глубину выходного изображения.
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
Эрозия и расширение - два типа морфологических операций. Как следует из названия, морфологические операции - это набор операций, обрабатывающих изображения в соответствии с их формой.
На основе заданного входного изображения разрабатывается «структурный элемент». Это можно сделать с помощью любой из двух процедур. Они нацелены на удаление шума и устранение недостатков, чтобы изображение было четким.
Расширение
Эта процедура следует за сверткой с некоторым ядром определенной формы, например квадрата или круга. У этого ядра есть точка привязки, которая обозначает его центр.
Это ядро накладывается на изображение, чтобы вычислить максимальное значение в пикселях. После расчета картинка заменяется якорем в центре. При этой процедуре области ярких областей увеличиваются в размере и, следовательно, увеличивается размер изображения.
Например, размер объекта в белом или ярком оттенке увеличивается, а размер объекта в черном или темном оттенке уменьшается.
Вы можете выполнить операцию расширения изображения с помощью dilate() метод imgprocкласс. Ниже приводится синтаксис этого метода.
dilate(src, dst, kernel)
Этот метод принимает следующие параметры -
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
Эрозия - процесс, очень похожий на расширение. Но вычисленное здесь значение пикселя является минимальным, а не максимальным при расширении. Изображение заменяется под точкой привязки с этим минимальным значением пикселя.
При этой процедуре области темных участков увеличиваются в размере, а светлые участки уменьшаются. Например, размер объекта в темном или черном оттенке увеличивается, в то время как он уменьшается в белом или ярком оттенке.
пример
Вы можете выполнить эту операцию с изображением, используя erode() метод imgprocкласс. Ниже приводится синтаксис этого метода -
erode(src, dst, kernel)
Этот метод принимает следующие параметры -
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
В предыдущих главах мы обсуждали процесс erosion и dilation. Помимо этих двух, OpenCV имеет больше морфологических преобразований. ВmorphologyEx() метода класса Imgproc используется для выполнения этих операций с данным изображением.
Ниже приводится синтаксис этого метода -
morphologyEx(src, dst, op, kernel)
Этот метод принимает следующие параметры -
src - Объект класса Mat представляющий исходное (входное) изображение.
dst - объект класса Mat представляющий конечное (выходное) изображение.
op - Целое число, представляющее тип морфологической операции.
kernel - матрица ядра.
пример
Следующая программа демонстрирует, как применять морфологическую операцию. "top-hat" на изображении с использованием библиотеки 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, продемонстрированный в предыдущем example, 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 |
|
Пирамида - это операция над изображением, при которой,
Входное изображение сначала сглаживается с использованием определенного сглаживающего фильтра (например, Гаусса, Лапласа), а затем сглаженное изображение подвергается субдискретизации.
Этот процесс повторяется несколько раз.
Во время работы пирамиды плавность изображения увеличивается, а разрешение (размер) уменьшается.
Пирамида вверх
В Pyramid Up изображение сначала увеличивается, а затем размывается. Вы можете выполнить операцию Pyramid Up на изображении, используяpyrUP() метод imgprocкласс. Ниже приводится синтаксис этого метода -
pyrUp(src, dst, dstsize, borderType)
Этот метод принимает следующие параметры -
src - Объект класса Mat представляющий исходное (входное) изображение.
mat - Объект класса Mat представляющий конечное (выходное) изображение.
size - Объект класса 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 изображение сначала размывается, а затем дискретизируется. Вы можете выполнить операцию Pyramid Down с изображением, используяpyrDown() метод imgprocкласс. Ниже приводится синтаксис этого метода -
pyrDown(src, dst, dstsize, borderType)
Этот метод принимает следующие параметры -
src - Объект класса Mat представляющий исходное (входное) изображение.
mat - Объект класса Mat представляющий конечное (выходное) изображение.
size - Объект класса 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, представляющая радиус цветового окна.
пример
Следующая программа демонстрирует, как выполнить операцию фильтрации среднего сдвига для данного изображения.
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
Пороговая обработка - это метод сегментации изображений, в основном он используется для создания двоичных изображений. Установление пороговых значений бывает двух типов: простое установление пороговых значений и адаптивное установление пороговых значений.
Простой порог
В простой операции определения порога пикселям, значения которых превышают заданное пороговое значение, присваивается стандартное значение.
Вы можете выполнить простую пороговую операцию на изображении, используя метод threshold() из Imgproc class, Ниже приводится синтаксис этого метода.
threshold(src, dst, thresh, maxval, type)
Этот метод принимает следующие параметры -
src - Объект класса Mat представляющий исходное (входное) изображение.
dst - Объект класса Mat представляющий конечное (выходное) изображение.
thresh - Переменная двойного типа, представляющая пороговое значение.
maxval - Переменная типа double, представляющая значение, которое должно быть присвоено, если значение пикселя больше порогового значения.
type - Переменная целочисленного типа, представляющая тип используемого порога.
пример
Следующая программа демонстрирует, как выполнить простую операцию определения порога на изображении в 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 |
|
В simple thresholding, пороговое значение является глобальным, т. е. одинаковым для всех пикселей изображения. Adaptive thresholding - это метод, при котором пороговое значение вычисляется для небольших регионов, и поэтому для разных регионов будут разные пороговые значения.
В OpenCV вы можете выполнить операцию адаптивного порога с изображением, используя метод adaptiveThreshold() из Imgprocкласс. Ниже приводится синтаксис этого метода.
adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C)
Этот метод принимает следующие параметры -
src - Объект класса Mat представляющий исходное (входное) изображение.
dst - Объект класса Mat представляющий конечное (выходное) изображение.
maxValue - Переменная типа double, представляющая значение, которое должно быть присвоено, если значение пикселя больше порогового значения.
adaptiveMethod- Целочисленная переменная, представляющая используемый адаптивный метод. Это будет одно из следующих двух значений
ADAPTIVE_THRESH_MEAN_C - пороговое значение - это среднее значение площади окрестности.
ADAPTIVE_THRESH_GAUSSIAN_C - пороговое значение - это взвешенная сумма значений окрестностей, где веса являются окном Гаусса.
thresholdType - Переменная целочисленного типа, представляющая тип используемого порога.
blockSize - Переменная целочисленного типа, представляющая размер пиксельного окружения, используемого для вычисления порогового значения.
C - Переменная типа double, представляющая константу, используемую в обоих методах (вычтенную из среднего или взвешенного среднего).
пример
Следующая программа демонстрирует, как выполнить операцию адаптивного порога на изображении в OpenCV. Здесь мы выбираем адаптивный порог типаbinary и 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 |
|
|
В этой главе вы узнаете, как сделать границу изображения жабой.
Метод copyMakeBorder ()
Вы можете добавить к изображению различные границы с помощью метода copyMakeBorder() класса Core, который принадлежит пакету org.opencv.core. Ниже приводится синтаксис этого метода.
copyMakeBorder(src, dst, top, bottom, left, right, borderType)
Этот метод принимает следующие параметры -
src - Объект класса Mat представляющий исходное (входное) изображение.
dst - Объект класса Mat представляющий конечное (выходное) изображение.
top - Целочисленная переменная типа integer, представляющая длину границы в верхней части изображения.
bottom - Целочисленная переменная типа integer, представляющая длину границы внизу изображения.
left - Целочисленная переменная типа integer, представляющая длину границы слева от изображения.
right - Целочисленная переменная типа integer, представляющая длину границы справа от изображения.
borderType - Переменная целого типа, представляющая тип границы, которая будет использоваться.
пример
Следующая программа - это пример, демонстрирующий, как добавить границу к данному изображению.
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 |
|
Используя sobel operation, вы можете определять края изображения как по горизонтали, так и по вертикали. Вы можете применить операцию Собела к изображению, используя методsobel(). Ниже приводится синтаксис этого метода -
Sobel(src, dst, ddepth, dx, dy)
Этот метод принимает следующие параметры -
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() и их соответствующие выходы.
X-производная | Y-производная | Вывод |
---|---|---|
0 | 1 |
|
1 | 0 |
|
1 | 1 |
|
Scharr также используется для обнаружения вторых производных изображения в горизонтальном и вертикальном направлениях. Вы можете выполнить операцию scharr с изображением, используя методscharr(). Ниже приводится синтаксис этого метода -
Scharr(src, dst, ddepth, dx, dy)
Этот метод принимает следующие параметры -
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() и их соответствующие выходы.
X-производная | Y-производная | Вывод |
---|---|---|
0 | 1 |
|
1 | 0 |
|
Оператор Лапласа также является производным оператором, который используется для поиска ребер в изображении. Это маска производной второго порядка. В этой маске у нас есть еще две классификации: один - положительный лапласианский оператор, а другой - отрицательный лапласианский оператор.
В отличие от других операторов, лапласиан не удалял ребра в каком-либо конкретном направлении, но убирал ребра в следующей классификации.
- Внутренние края
- Внешние края
Вы можете выполнить Laplacian Transform операция с изображением с помощью Laplacian() метод imgproc class, ниже приведен синтаксис этого метода.
Laplacian(src, dst, ddepth)
Этот метод принимает следующие параметры -
src - А Mat объект, представляющий источник (входное изображение) для этой операции.
dst - А Mat объект, представляющий место назначения (выходное изображение) для этой операции.
ddepth - Переменная целочисленного типа, представляющая глубину целевого изображения.
пример
Следующая программа демонстрирует, как выполнить операцию преобразования Лапласа на данном изображении.
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
В distance transformОператор обычно принимает двоичные изображения в качестве входных данных. В этой операции интенсивности уровней серого для точек внутри областей переднего плана изменяются для удаления их соответствующих расстояний от ближайшего значения 0 (границы).
Вы можете применить преобразование расстояния в OpenCV, используя метод distanceTransform(). Ниже приводится синтаксис этого метода.
distanceTransform(src, dst, distanceType, maskSize)
Этот метод принимает следующие параметры -
src - Объект класса Mat представляющий исходное (входное) изображение.
dst - Объект класса Mat представляющий конечное (выходное) изображение.
distanceType - Переменная целочисленного типа, представляющая тип применяемого преобразования расстояния.
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 для захвата кадров с помощью системной камеры. В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.
В 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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
Следующая программа демонстрирует, как определять лица с помощью системной камеры и отображать их с помощью окна 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 образ.
Вы можете выполнить affine translation на изображении с помощью warpAffine()метод класса imgproc. Ниже приводится синтаксис этого метода -
Imgproc.warpAffine(src, dst, tranformMatrix, size);
Этот метод принимает следующие параметры -
src - А Mat объект, представляющий источник (входное изображение) для этой операции.
dst - А Mat объект, представляющий место назначения (выходное изображение) для этой операции.
tranformMatrix - А Mat объект, представляющий матрицу преобразования.
size - Переменная целочисленного типа, представляющая размер выходного изображения.
пример
Следующая программа демонстрирует, как применить аффинную операцию к данному изображению.
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
Вы можете perform rotation операция с изображением с помощью warpAffine() метод imgprocкласс. Ниже приводится синтаксис этого метода -
Imgproc.warpAffine(src, dst, rotationMatrix, size);
Этот метод принимает следующие параметры -
src - А Mat объект, представляющий источник (входное изображение) для этой операции.
dst - А Mat объект, представляющий место назначения (выходное изображение) для этой операции.
rotationMatrix - А Mat объект, представляющий матрицу вращения.
size - Переменная целочисленного типа, представляющая размер выходного изображения.
пример
Следующая программа демонстрирует, как повернуть изображение.
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
Вы можете выполнить scaling на изображении с помощью 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, представляющая масштабный коэффициент по вертикальной оси.
Interpolation - Целочисленная переменная, представляющая метод интерполяции.
пример
Следующая программа демонстрирует, как применять scale transformation к изображению.
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 вы можете применять разные цветовые карты к изображению, используя метод applyColorMap() класса Imgproc. Ниже приводится синтаксис этого метода -
applyColorMap(Mat src, Mat dst, int colormap)
Он принимает три параметра -
src - Объект класса Mat представляющий исходное (входное) изображение.
dst - Объект класса Mat представляющий конечное (выходное) изображение.
colormap - Переменная целочисленного типа, представляющая тип применяемой цветовой карты.
пример
Следующая программа демонстрирует, как применять color map к изображению.
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 |
|
Canny Edge Detection используется для обнаружения краев изображения. Он принимает в качестве входных данных изображение в градациях серого и использует многоступенчатый алгоритм.
Вы можете выполнить эту операцию с изображением, используя Canny() метод imgproc class, ниже приведен синтаксис этого метода.
Canny(image, edges, threshold1, threshold2)
Этот метод принимает следующие параметры -
image - А Mat объект, представляющий источник (входное изображение) для этой операции.
edges - А 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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
Вы можете определить форму данного изображения, применив Hough Transform technique используя метод HoughLines() из Imgprocкласс. Ниже приводится синтаксис этого метода.
HoughLines(image, lines, rho, theta, threshold)
Этот метод принимает следующие параметры -
image - Объект класса Mat представляющий исходное (входное) изображение.
lines - Объект класса Mat в котором хранится вектор, в котором хранятся параметры (r, Φ) линий.
rho - Переменная типа double, представляющая разрешение параметра r в пикселях.
theta - Переменная типа double, представляющая разрешение параметра Φ в радианах.
threshold - Переменная целочисленного типа, представляющая минимальное количество пересечений для «обнаружения» линии.
пример
Следующая программа демонстрирует, как обнаружить линии Хафа на заданном изображении.
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом:
В histogramизображения показывает частоту значений яркости пикселей. На гистограмме изображения ось X показывает интенсивности уровней серого, а ось Y показывает частоту этих интенсивностей.
Histogram equalizationулучшает контрастность изображения, чтобы расширить диапазон яркости. Вы можете выровнять гистограмму данного изображения с помощью методаequalizeHist() из Imgprocкласс. Ниже приводится синтаксис этого метода.
equalizeHist(src, dst)
Этот метод принимает следующие параметры -
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
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом: