Descripción general de OpenCV
Como un poderoso marco de visión por computadora de código abierto, OpenCV contiene más de 500 implementaciones de algoritmos, y aún está aumentando. Su última versión se ha actualizado a 3.2. Su SDK admite el desarrollo de plataformas Android y Java, y casi puede cumplir con los requisitos comunes de procesamiento de imágenes. Debería convertirse en el primer marco de procesamiento de imágenes para programadores de Java y Android. La configuración del uso de OpenCV en Java es muy simple, y se puede decir que es casi cero configuración sin ninguna cortesía.
1: Configuración
Para configurar la introducción de los paquetes JAR relacionados con OpenCV, primero debe descargar la versión autoextrante de OpenCV. La dirección de descarga es: http://opencv.org/opencv-3-2.html
Luego tire al final de la página web y descargue el paquete de desarrollo de autodecompresión de Windows
Después de descargar, haga doble clic para descomponer la ruta de compilación y encuentre lo siguiente:
Haga doble clic para abrir la carpeta Java.
Hay un frasco que se importa directamente al nuevo proyecto en Eclipse, y luego copia el archivo DLL en X64 en los directorios Java JDK Bin y JRE/BIN utilizados en Eclipse. El entorno está configurado, ¡es simple! La estructura final del proyecto configurada:
Dos: Cargando imágenes y operaciones de píxeles
Lea una imagen, hágalo en una oración
Mat src = imgCodecs.imread (ImageFilePath); if (src.Empty ()) return;
Convertir objeto MAT a objeto BufferedImage
Public BufferedImage Conver2Image (Mat Mat) {int width = mat.cols (); int hight = mat.rows (); int dims = mat.channels (); int [] píxeles = new int [width*altura]; byte [] rgbData = nuevo byte [ancho*altura*dims]; mat.get (0, 0, rgbData); Bufferedimage imagen = nueva bufferedimage (ancho, altura, bufferedimage.type_int_argb); int index = 0; int r = 0, g = 0, b = 0; for (int row = 0; fila <hight; row ++) {for (int col = 0; col <width; col ++) {if (dims == 3) {index = row*width*dims+col*dims; b = rgbData [índice] & 0xff; g = rgbData [índice+1] & 0xff; r = rgbData [índice+2] y 0xff; píxeles [fila*ancho+col] = ((255 y 0xff) << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | b & 0xff; } if (dims == 1) {index = fila*ancho + col; b = rgbData [índice] & 0xff; píxeles [fila*ancho+col] = ((255 y 0xff) << 24) | ((B & 0xff) << 16) | ((B & 0xff) << 8) | b & 0xff; }}} setrgb (imagen, 0, 0, ancho, altura, píxeles); imagen de retorno;}Convertir el objeto BufferedImage en objeto MAT
public Mat Convert2Mat (Imagen de BufferedImage) {int width = image.getWidth (); int hight = image.getheight (); Mat src = nueva mat (nuevo tamaño (ancho, altura), cvtype.cv_8uc3); int [] píxeles = new int [width*altura]; byte [] rgbData = nuevo byte [ancho*altura*3]; getrgb (imagen, 0, 0, ancho, altura, píxeles); int index = 0, c = 0; int r = 0, g = 0, b = 0; for (int row = 0; fila <hight; row ++) {for (int col = 0; col <width; col ++) {index = row*width+col; c = píxeles [índice]; r = (c & 0xff0000) >> 16; g = (c & 0xff00) >> 8; b = c & 0xff; índice = fila*ancho*3 + col*3; rgbData [index] = (byte) b; rgbData [índice+1] = (byte) g; rgbData [índice+2] = (byte) r; }} src.put (0, 0, rgbData); devolver src;}En particular, el orden del canal RGB de BufferedImage y MAT es diferente. Por el contrario, el orden de los tres canales en el objeto MAT es BGR y RGB en BufferedImage.
Lea todos los píxeles de MAT (donde la imagen es datos de tipo MAT)
int width = image.cols (); int hight = image.rows (); int dims = image.channels (); byte [] data = new byte [width*tight*dims]; image.get (0, 0, data);
Atravesar operaciones de píxeles y ahorrar cambios
int index = 0; int r = 0, g = 0, b = 0; para (int fila = 0; fila <altura; fila ++) {for (int col = 0; col <width*dims; col+= dims) {index = fila*width*dims+col; b = datos [índice] y 0xff; g = datos [índice+1] y 0xff; r = datos [índice+2] y 0xff; r = 255 - r; g = 255 - g; b = 255 - b; datos [índice] = (byte) b; datos [índice+1] = (byte) g; datos [índice+2] = (byte) r; }} image.put (0, 0, datos);Guardar objeto Mat como archivo de imagen: se puede hacer en una oración
Imgcodecs.imwrite (FilePath, SRC);
Código OpenCV en ejecución y prueba
Ajuste el grado de luz y oscuridad: reduzca el brillo
Ajuste el grado de luz y oscuridad - aumento del brillo
Desenfoque gaussiano
Afilar
gradiente
Escala de grises
El código Java completo para los efectos anteriores es el siguiente:
paquete com.gloomyfish.opencvdemo; import org.opencv.core.core; import org.opencv.core.cvtype; import org.opencv.core.mat; import org.opencv.core.size; import orgencv.imgproc.imgproc; public class ImageFilter imagen) {int width = image.cols (); int hight = image.rows (); int dims = image.channels (); byte [] data = new Byte [ancho*altura*dims]; image.get (0, 0, datos); int index = 0; int r = 0, g = 0, b = 0; for (int row = 0; fila <hight; row ++) {for (int col = 0; col <width*dims; col+= dims) {index = fila*ancho*dims+col; b = datos [índice] y 0xff; g = datos [índice+1] y 0xff; r = datos [índice+2] y 0xff; r = 255 - r; g = 255 - g; b = 255 - b; datos [índice] = (byte) b; datos [índice+1] = (byte) g; datos [índice+2] = (byte) r; }} image.put (0, 0, datos); imagen de retorno; } brillo de Mat Public (imagen MAT) {// aumento de brillo Mat dst = new Mat (); Mat Black = mat.zeros (image.size (), image.type ()); Core.addweeting (imagen, 1.2, negro, 0.5, 0, dst); devolver dst; } public Mat Darkness (Mat Image) {// Brillo disminuir Mat dst = new Mat (); Mat Black = mat.zeros (image.size (), image.type ()); Core.addweight (imagen, 0.5, negro, 0.5, 0, dst); devolver dst; } public Mat Gray (Mat Image) {// Grayscale Mat Gray = new Mat (); Imgproc.cvtcolor (Image, Gray, imgproc.color_bgr2gray); regresar gris; } public Mat Sharken (Mat Image) {// afilar Mat dst = new Mat (); float [] Sharper = new Float [] {0, -1, 0, -1, 5, -1, 0, -1, 0}; Operador MAT = nuevo MAT (3, 3, cvtype.cv_32fc1); operador.put (0, 0, más nítido); Imgproc.filter2d (imagen, dst, -1, operador); devolver dst; } public Mat Blur (Image MAT) {// Gaussian Fuzzy Mat dst = new Mat (); Imgproc.gaussianblur (imagen, dst, nuevo tamaño (15, 15), 0); devolver dst; } Public Mat Gradient (Mat Image) {// Gradiente 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.Addweeting (ABS_GRAD_X, 0.5, ABS_GRAD_Y, 0.5, 10, Gradxy); regresar Gradxy; }}Se puede decir que es tan simple. Además, OpenCV para Java admite varios procesos de imágenes, incluidas operaciones morfológicas, análisis de imágenes binarias, detección y reconocimiento de características de imágenes, coincidencia de plantillas, funciones relacionadas con el histograma, etc. Algoritmos comunes de aprendizaje automático y métodos de análisis de imágenes. Se puede decir que es una de las plataformas de desarrollo y SDK de procesamiento de imágenes más potentes. ¡Continuaré explorando y compartiendo!
Prestar especial atención
Antes de llamar, asegúrese de agregar esta oración
System.LoadLibrary (core.native_library_name);
El propósito es cargar soporte DLL relacionado con la API OPENCV, que no se ejecutará correctamente sin él. La implementación del código y la función anterior se basa en JDK8 64 bits y OpenCV versión 3.2.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.