Visão geral do OpenCV
Como uma poderosa estrutura de visão computacional de código aberto, o OpenCV contém mais de 500 implementações de algoritmo e ainda está aumentando. Sua versão mais recente foi atualizada para 3.2. Seu SDK suporta o desenvolvimento das plataformas Android e Java e quase pode atender aos requisitos comuns de processamento de imagens. Deve se tornar a primeira estrutura de processamento de imagem para programadores Java e Android. A configuração do uso do OpenCV em Java é muito simples, e pode -se dizer que é quase zero configuração sem qualquer polidez.
1: Configuração
Para configurar a introdução de pacotes JAR relacionados ao OpenCV, você deve primeiro baixar a versão auto-exclusiva do OpenCV. O endereço de download é: http://opencv.org/opencv-3-2.html
Em seguida, pule para a parte inferior da página da web e faça o download do pacote de desenvolvimento de autodecompressão do Windows
Após o download, clique duas vezes para descompactar o caminho da construção e encontrar o seguinte:
Clique duas vezes para abrir a pasta Java.
Há um frasco que é importado diretamente para o novo projeto no Eclipse e, em seguida, copie o arquivo DLL no X64 nos diretórios Java JDK Bin e JRE/BIN usados no Eclipse. O ambiente está configurado, é simples! A estrutura final do projeto configurada:
Dois: Carregando imagens e operações de pixel
Leia uma imagem--, faça-o em uma frase
Mat src = imgcodec.imread (imagefilepath); if (src.empty ()) retornar;
Converter objeto MAT em objeto bufferImage
public bufferiMage convers2Image (matt) {int width = mat.cols (); int altura = mat.rows (); int dims = mat.channels (); int [] pixels = new int [largura*altura]; byte [] rgbdata = novo byte [largura*altura*dims]; mat.get (0, 0, rgbdata); Imagem bufferedImage = new bufferImage (largura, altura, bufferImage.type_int_argb); int index = 0; int r = 0, g = 0, b = 0; for (int linha = 0; linha <altura; linha ++) {for (int col = 0; col <width; col ++) {if (dims == 3) {index = line*width*dims+col*dims; b = rgbdata [index] & 0xff; g = rgbdata [índice+1] & 0xff; r = rgbdata [índice+2] e 0xff; pixels [linha*largura+col] = ((255 & 0xff) << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | b & 0xff; } if (dims == 1) {index = linha*largura + col; b = rgbdata [index] & 0xff; pixels [linha*largura+col] = ((255 & 0xff) << 24) | ((b & 0xff) << 16) | ((b & 0xff) << 8) | b & 0xff; }}} setRgb (imagem, 0, 0, largura, altura, pixels); imagem de retorno;}Converter objeto bufferiMage em objeto MAT
public mat convert2mat (imagem bufferImage) {int width = image.getWidth (); int height = image.getHeight (); Mat src = novo MAT (novo tamanho (largura, altura), cvtype.cv_8uc3); int [] pixels = new int [largura*altura]; byte [] rgbdata = novo byte [largura*altura*3]; getrgb (imagem, 0, 0, largura, altura, pixels); int index = 0, c = 0; int r = 0, g = 0, b = 0; for (int linha = 0; linha <altura; linha ++) {for (int col = 0; col <width; col ++) {index = linha*largura+col; c = pixels [índice]; r = (c & 0xff0000) >> 16; g = (c & 0xff00) >> 8; b = c & 0xff; índice = linha*largura*3 + col*3; rgbdata [index] = (byte) b; rgbdata [índice+1] = (byte) g; rgbdata [índice+2] = (byte) r; }} src.put (0, 0, rgbdata); Retornar Src;}Em particular, a ordem do canal RGB do BufferEdImage e da MAT é diferente. Pelo contrário, a ordem dos três canais no objeto MAT é BGR e RGB no bufferImage.
Leia todos os pixels do MAT (onde a imagem é dados do tipo MAT)
int width = image.cols (); int height = image.rows (); int dims = image.channels (); byte [] dados = novo byte [largura*altura*dims]; image.get (0, 0, dados);
Atravessar operações de pixels e salvar mudanças
int index = 0; int r = 0, g = 0, b = 0; para (int linha = 0; linha <altura; linha ++) {for (int col = 0; col <width*dims; col+= dims) {index = linha*largura*dims+col; b = dados [index] & 0xff; g = dados [índice+1] & 0xff; r = dados [índice+2] & 0xff; r = 255 - r; g = 255 - g; b = 255 - b; dados [index] = (byte) b; dados [índice+1] = (byte) g; dados [índice+2] = (byte) r; }} image.put (0, 0, dados);Salvar objeto Mat como arquivo de imagem - pode ser feito em uma frase
Imgcodec.imwrite (filepath, src);
Código OpenCV em execução e teste
Ajuste o grau de luz e escuridão - reduza o brilho
Ajuste o grau de luz e escuridão - aumento do brilho
Gaussian Blur
Afiado
gradiente
Escala de cinza
O código Java completo para os efeitos acima é o seguinte:
pacote com.gloomyfish.opencvdemo; importar org.opencv.core.core; importar org.opencv.core.cvtype; importação org.opencv.core.mat; importesters.opencv.core.size; import org. imagem) {int width = image.cols (); int height = image.rows (); int dims = image.channels (); byte [] dados = novo byte [largura*altura*dims]; image.get (0, 0, dados); int index = 0; int r = 0, g = 0, b = 0; for (int linha = 0; linha <altura; linha ++) {for (int col = 0; col <width*dims; col+= dims) {index = linha*width*dims+col; b = dados [index] & 0xff; g = dados [índice+1] & 0xff; r = dados [índice+2] & 0xff; r = 255 - r; g = 255 - g; b = 255 - b; dados [index] = (byte) b; dados [índice+1] = (byte) g; dados [índice+2] = (byte) r; }} image.put (0, 0, dados); imagem de retorno; } Brilho público do tapete (imagem Mat) {// Brilho aumenta o tapete dst = new Mat (); Mat preto = mat.zeros (image.size (), image.type ()); Core.Addweighted (imagem, 1,2, preto, 0,5, 0, DST); retornar o horário de verão; } escuridão pública do tapete (imagem da mateira) {// Diminuição do brilho Mat dst = new Mat (); Mat preto = mat.zeros (image.size (), image.type ()); Core.Addweighted (imagem, 0,5, preto, 0,5, 0, DST); retornar o horário de verão; } public Mat Gray (Mat Image) {// GrayScale Mat Gray = new Mat (); Imgproc.cvtcolor (imagem, cinza, imgproc.color_bgr2gray); retornar cinza; } public mat sharnen (Mat Image) {// Sharnen Mat dst = new Mat (); float [] sharper = new float [] {0, -1, 0, -1, 5, -1, 0, -1, 0}; Operador MAT = novo MAT (3, 3, cvtype.cv_32fc1); operator.put (0, 0, mais nítido); Imgproc.filter2d (imagem, dst, -1, operador); retornar o horário de verão; } public Mat Blur (Mat Image) {// gaussiano Fuzzy Mat dst = new Mat (); Imgproc.gaussianblur (imagem, DST, novo tamanho (15, 15), 0); retornar o horário de verão; } 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 (imagem, grad_x, cvtype.cv_32f, 1, 0); Imgproc.sobel (imagem, 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.Addweighted (ABS_GRAD_X, 0.5, ABS_GRAD_Y, 0.5, 10, GRADXY); retornar gradxy; }}Pode -se dizer que é tão simples. Além disso, o OpenCV para Java suporta vários processamentos de imagem, incluindo operações morfológicas, análise de imagem binária, detecção e reconhecimento de recursos, correspondência de modelos, funções relacionadas ao histograma, etc. Algoritmos comuns de aprendizado de máquina e métodos de análise de imagem. Pode -se dizer que é uma das mais poderosas plataformas de SDK de processamento de imagens e desenvolvimento. Vou continuar a explorar e compartilhar!
Preste atenção especial
Antes de ligar, certifique -se de adicionar esta frase
System.LoadLibrary (Core.native_library_name);
O objetivo é carregar o suporte à DLL relacionado à API OpenCV, que não será executada corretamente sem ela. A implementação do código e da função acima é baseada no JDK8 64 bits e no OpenCV versão 3.2.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.