Обзор OpenCV
Как мощная структура компьютерного зрения с открытым исходным кодом, OpenCV содержит более 500 реализаций алгоритма и все еще увеличивается. Его последняя версия была обновлена до 3.2. Его SDK поддерживает разработку платформ Android и Java и может почти соответствовать общим требованиям обработки изображений. Это должно стать первой структурой обработки изображений для программистов Java и Android. Конфигурация использования OpenCV в Java очень проста, и можно сказать, что это почти нулевая конфигурация без какой -либо вежливости.
1: конфигурация
Чтобы настроить введение пакетов JAR, связанных с OPENCV, сначала необходимо загрузить версию OpenCV. Адрес загрузки: http://opencv.org/opencv-3-2.html
Затем перейдите к нижней части веб-страницы и загрузите пакет разработки самообменки Windows
После загрузки дважды щелкните, чтобы расслабиться по разрастанию пути сборки и найдите следующее:
Дважды щелкните, чтобы открыть папку Java.
Существует банка, которая прямо импортируется в новый проект в Eclipse, а затем скопируйте файл DLL в x64 в каталоги Java JDK и JRE/Bin, используемые в Eclipse. Среда настроена, это просто! Настроенная окончательная структура проекта:
Два: загрузка изображений и пиксельных операций
Прочитайте изображение-сделайте это в одном предложении
Mat src = imgcodecs.imread (imagefilepath); if (src.empty ()) return;
Преобразовать объект MAT в объект BuffereMage
public BufferedImage conver2image (mat Mat) {int width = mat.cols (); int height = mat.rows (); int dims = mat.channels (); int [] pixels = new int [ширина*высота]; Byte [] rgbdata = новый байт [ширина*высота*dims]; mat.get (0, 0, rgbdata); BufferedImage Image = new BufferedImage (ширина, высота, bufferedimage.type_int_argb); int index = 0; int r = 0, g = 0, b = 0; for (int row = 0; row <height; row ++) {for (int col = 0; col <width; col ++) {if (dims == 3) {index = row*width*dims+col*dims; b = rgbdata [index] & 0xff; g = rgbdata [index+1] & 0xff; r = rgbdata [index+2] & 0xff; Pixels [ряд*ширина+col] = ((255 & 0xff) << 24) | ((r & 0xff) << 16) | ((G & 0xff) << 8) | b & 0xff; } if (dims == 1) {index = row*width + col; b = rgbdata [index] & 0xff; Pixels [ряд*ширина+col] = ((255 & 0xff) << 24) | ((B & 0xff) << 16) | ((B & 0xff) << 8) | b & 0xff; }}} setrgb (изображение, 0, 0, ширина, высота, пиксели); вернуть изображение;}Преобразовать объект BufferedImage в объект MAT
public Mat Convert2mat (BufferedImage Image) {int width = image.getWidth (); int height = image.getheight (); Mat src = новый мат (новый размер (ширина, высота), cvtype.cv_8uc3); int [] pixels = new int [ширина*высота]; Byte [] rgbdata = новый байт [ширина*высота*3]; getrgb (изображение, 0, 0, ширина, высота, пиксели); int index = 0, c = 0; int r = 0, g = 0, b = 0; for (int row = 0; row <height; row ++) {for (int col = 0; col <width; col ++) {index = row*width+col; c = пиксели [индекс]; r = (C & 0xff0000) >> 16; G = (C & 0xff00) >> 8; b = c & 0xff; index = ряд*ширина*3 + col*3; rgbdata [index] = (байт) b; rgbdata [index+1] = (byte) g; rgbdata [index+2] = (byte) r; }} src.put (0, 0, rgbdata); вернуть src;}В частности, порядок канала RGB BufferedImage и Mat отличается. Напротив, порядок трех каналов в объекте MAT составляет BGR и RGB в BuffereMage.
Прочитайте все пиксели из MAT (где изображение является данных типа MAT)
int width = image.cols (); int height = image.rows (); int dims = image.channels (); byte [] data = new Byte [ширина*высота*dims]; image.get (0, 0, data);
Переселение пиксельных операций и сохранения изменений
int index = 0; int r = 0, g = 0, b = 0; for (int row = 0; row <height; row ++) {for (int col = 0; col <width*dims; col+= dims) {index = row*width*dims+col; b = data [index] & 0xff; g = data [index+1] & 0xff; r = data [index+2] & 0xff; r = 255 - r; G = 255 - G; b = 255 - b; данные [index] = (байт) b; Данные [Индекс+1] = (байт) g; данные [index+2] = (byte) r; }} image.put (0, 0, data);Сохранить объект MAT как файл изображения - можно сделать в одном предложении
Imgcodecs.imwrite (filepath, src);
Запуск и тестирование OpenCV
Отрегулируйте степень света и темноты - уменьшить яркость
Отрегулировать степень света и темноты - увеличение яркости
Гауссовый размытие
Заострить
градиент
Серого
Полный код Java для вышеуказанных эффектов заключается в следующем:
Пакет com.gloomyfish.opencvdemo; import org.opencv.core.core; import org.opencv.core.cvtype; import org.opencv.core.mat; import org.opencv.core.size; import org.opencv.imgproc.imgproc; Image) {int width = image.cols (); int height = image.rows (); int dims = image.channels (); byte [] data = new Byte [ширина*высота*dims]; image.get (0, 0, data); int index = 0; int r = 0, g = 0, b = 0; for (int row = 0; row <height; row ++) {for (int col = 0; col <width*dims; col+= dims) {index = row*width*dims+col; b = data [index] & 0xff; g = data [index+1] & 0xff; r = data [index+2] & 0xff; r = 255 - r; G = 255 - G; b = 255 - b; данные [index] = (байт) b; Данные [Индекс+1] = (байт) g; данные [index+2] = (byte) r; }} image.put (0, 0, data); вернуть изображение; } public Mat Bright (Mat Image) {// Яркость увеличивает mat dst = new Mat (); Mat black = mat.zeros (image.size (), image.type ()); Core.Adddeweened (изображение, 1,2, черное, 0,5, 0, DST); вернуть DST; } public Mat тьма (Mat Image) {// Яркость уменьшает mat dst = new Mat (); Mat black = mat.zeros (image.size (), image.type ()); Core.AddDeweleSeed (изображение, 0,5, черное, 0,5, 0, DST); вернуть DST; } public Mat Grey (Mat Image) {// GreyScale Mat Grey = new Mat (); Imgproc.cvtcolor (Image, Grey, imgproc.color_bgr2gray); вернуть серый; } public Mat Sharpen (mat image) {// shrup mat dst = new Mat (); float [] sharper = new Float [] {0, -1, 0, -1, 5, -1, 0, -1, 0}; Mat Operator = новый Mat (3, 3, cvtype.cv_32fc1); operator.put (0, 0, острее); Imgproc.filter2d (Image, DST, -1, оператор); вернуть DST; } public Mat Blur (Mat Image) {// Гауссовый нечеткий мат dst = new Mat (); Imgproc.gaussianblur (Image, DST, новый размер (15, 15), 0); вернуть DST; } public Mat Gradient (mat image) {// градиент mat grad_x = new Mat (); Mat grad_y = new Mat (); Mat abs_grad_x = new Mat (); Mat abs_grad_y = new Mat (); Imgproc.sobel (image, grad_x, cvtype.cv_32f, 1, 0); Imgproc.sobel (image, grad_y, cvtype.cv_32f, 0, 1); Core.convertscaleabs (grad_x, abs_grad_x); Core.convertscaleabs (grad_y, abs_grad_y); grad_x.release (); grad_y.release (); Mat gradxy = new Mat (); Core.AddDi -Weealsed (ABS_GRAD_X, 0,5, ABS_GRAD_Y, 0,5, 10, Gradxy); вернуть Gradxy; }}Можно сказать, что это так просто. Кроме того, OpenCV для Java поддерживает различные обработки изображений, включая морфологические операции, анализ двоичных изображений, обнаружение и распознавание изображений, сопоставление шаблонов, функции, связанные с гистограммой и т. Д. Общие алгоритмы машинного обучения и методы анализа изображений. Можно сказать, что он является одним из самых мощных SDK -обработки изображений и платформ разработки. Я буду продолжать исследовать и поделиться!
Обратите особое внимание
Прежде чем звонить, обязательно добавьте это предложение
System.loadlibrary (core.native_library_name);
Цель состоит в том, чтобы загрузить поддержку DLL, связанную с API OpenCV, который не будет работать правильно без него. Вышеуказанная реализация кода и функции основана на 64-битной и OpenCV версии 3.2.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.