OPENCV Présentation
En tant que puissant cadre de vision de l'ordinateur open source, OpenCV contient plus de 500 implémentations d'algorithmes et augmente toujours. Sa dernière version a été mise à jour à 3.2. Son SDK prend en charge le développement des plates-formes Android et Java et peut presque répondre aux exigences de traitement d'images courantes. Il devrait devenir le premier cadre de traitement d'image pour les programmeurs Java et Android. La configuration de l'utilisation d'OpenCV dans Java est très simple, et on peut dire qu'il s'agit de la configuration presque nulle sans aucune politesse.
1: configuration
Pour configurer l'introduction de packages JAR liés à OpenCV, vous devez d'abord télécharger la version auto-extraite d'OpenCV. L'adresse de téléchargement est: http://opencv.org/opencv-3-2.html
Ensuite, tirez au bas de la page Web et téléchargez le package de développement de la décompression de Windows
Après téléchargement, double-cliquez pour décompresser le chemin de construction et trouvez ce qui suit:
Double-cliquez pour ouvrir le dossier Java.
Il y a un pot qui est directement importé dans le nouveau projet dans Eclipse, puis copier le fichier DLL dans X64 dans les répertoires Java JDK Bin et JRE / bin utilisés dans Eclipse. L'environnement est configuré, c'est simple! La structure du projet final configurée:
Deux: Chargement des images et des opérations de pixels
Lisez une image -, faites-le en une phrase
Mat src = imgcodecs.imRead (imageFilePath); if (src.Empty ()) return;
Convertir l'objet MAT en objet BufferedImage
Public BufferedImage Conver2Image (Mat Mat) {int width = mat.cols (); int height = mat.Rows (); int dims = mat.Channels (); int [] pixels = new int [largeur * hauteur]; octet [] rgbdata = nouveau octet [largeur * hauteur * dims]; Mat.get (0, 0, rgbdata); BufferedImage Image = new BufferedImage (largeur, hauteur, bufferedImage.type_int_argb); int index = 0; int r = 0, g = 0, b = 0; for (int row = 0; row <hight; 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 [ligne * largeur + col] = ((255 & 0xff) << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | B & 0xff; } if (dims == 1) {index = row * width + col; b = rgbdata [index] & 0xff; pixels [ligne * largeur + col] = ((255 & 0xff) << 24) | ((b & 0xff) << 16) | ((b & 0xff) << 8) | B & 0xff; }}} setRGB (image, 0, 0, largeur, hauteur, pixels); Retour image;}Convertir l'objet BufferedImage en objet MAT
Mat public convert2mat (image de tampon) {int width = image.getWidth (); int height = image.getheight (); Mat src = nouveau mat (nouvelle taille (largeur, hauteur), cvtype.cv_8uc3); int [] pixels = new int [largeur * hauteur]; octet [] rgbdata = nouveau octet [largeur * hauteur * 3]; getRGB (image, 0, 0, largeur, hauteur, pixels); int index = 0, c = 0; int r = 0, g = 0, b = 0; for (int row = 0; row <hight; row ++) {for (int col = 0; col <width; col ++) {index = row * width + col; c = pixels [index]; r = (c & 0xff0000) >> 16; g = (c & 0xff00) >> 8; b = c & 0xff; index = ligne * largeur * 3 + col * 3; rgbdata [index] = (octet) b; rgbdata [index + 1] = (byte) g; rgbdata [index + 2] = (byte) r; }} src.put (0, 0, rgbdata); retourner src;}En particulier, l'ordre du canal RVB de BufferedImage et MAT est différent. Au contraire, l'ordre des trois canaux de l'objet MAT est BGR et RVB dans le tampon.
Lisez tous les pixels de MAT (où l'image est des données de type MAT)
int width = image.cols (); int height = image.Rows (); int dims = image.Channels (); byte [] data = new octet [width * height * dims]; image.get (0, 0, data);
Traverser les opérations de pixels et les changements d'économie
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 = données [index] & 0xff; g = données [index + 1] & 0xff; r = data [index + 2] & 0xff; r = 255 - r; g = 255 - g; b = 255 - b; données [index] = (byte) b; données [index + 1] = (byte) g; données [index + 2] = (byte) r; }} image.put (0, 0, data);Enregistrer l'objet MAT comme fichier image - peut être fait en une phrase
ImgCodecs.imwrite (filepath, src);
CODE OPENCV EXACLIER ET TEST
Ajustez le degré de lumière et l'obscurité - réduire la luminosité
Ajuster le degré de lumière et d'obscurité - augmentation de la luminosité
Blur gaussien
Aiguiser
pente
Niveaux de gris
Le code Java complet pour les effets ci-dessus est le suivant:
Package com.gloomyfish.opecvdemo; import org.opecv.core.core; import org.opecvv.core.cvtype; import org.opecv.core.mat; import org.openv.core.Size; import org.opencv.imgproc.imgproc; Mat d'image public {/ ** - dans le traitement de la couleur de la Color-* / Public ImageFilters {/ ** - dans le traitement de la couleur. image) {int width = image.cols (); int height = image.Rows (); int dims = image.Channels (); octet [] data = nouveau octet [largeur * hauteur * dims]; image.get (0, 0, données); int index = 0; int r = 0, g = 0, b = 0; for (int row = 0; row <hight; row ++) {for (int col = 0; col <width * dims; col + = dims) {index = row * width * dims + col; b = données [index] & 0xff; g = données [index + 1] & 0xff; r = data [index + 2] & 0xff; r = 255 - r; g = 255 - g; b = 255 - b; données [index] = (byte) b; données [index + 1] = (byte) g; données [index + 2] = (byte) r; }} image.put (0, 0, data); Image de retour; } la luminosité du tapis public (image de tapis) {// Augmentation de la luminosité DST = new Mat (); Mat noir = mat.zeros (image.size (), image.type ()); Core.Addweled (image, 1,2, noir, 0,5, 0, DST); retour dst; } Public Mat Darkness (Mat Image) {// La luminosité diminution du mat dst = new Mat (); Mat noir = mat.zeros (image.size (), image.type ()); Core.Addweled (image, 0,5, noir, 0,5, 0, DST); retour dst; } public Mat Gray (Image de mat) {// Grayscale Mat Gray = new Mat (); Imgproc.cvtcolor (image, gris, imgpro.color_bgr2Gray); retour gris; } public MAT Sharpen (Mat Image) {// Sharpen Mat dst = new Mat (); float [] sharper = new float [] {0, -1, 0, -1, 5, -1, 0, -1, 0}; Mat Operator = new Mat (3, 3, cvtype.cv_32fc1); Operator.put (0, 0, Sharper); Imgproc.filter2d (image, dst, -1, opérateur); retour dst; } public Mat Blur (Mat Image) {// Gaussian Fuzzy Mat dst = new Mat (); IMGPROC.GAUSSIANBLUR (image, DST, nouvelle taille (15, 15), 0); retour dst; } public Mat Gradient (Mat Image) {// Gradient 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.Addweeed (ABS_GRAD_X, 0,5, ABS_GRAD_Y, 0,5, 10, GradXy); retour GradXy; }}On peut dire qu'il est si simple. De plus, OpenCV pour Java prend en charge divers traitements d'image, notamment les opérations morphologiques, l'analyse d'image binaire, la détection et la reconnaissance des fonctionnalités d'image, la correspondance du modèle, les fonctions liées à l'histogramme, etc. Algorithmes d'apprentissage automatique communs et méthodes d'analyse d'image. On peut dire que l'une des plates-formes SDK et de développement de traitement d'image les plus puissantes. Je continuerai d'explorer et de partager!
Accorder une attention particulière
Avant d'appeler, assurez-vous d'ajouter cette phrase
System.LoadLibrary (core.native_library_name);
Le but est de charger la prise en charge de la DLL liée à l'API OpenCV, qui ne s'exécutera pas correctement sans lui. L'implémentation de code et de fonction ci-dessus est basée sur JDK8 64 bits et OpenCV version 3.2.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.