OpenCV -Übersicht
Als leistungsstarkes Open -Source -Computer -Vision -Framework enthält OpenCV mehr als 500 Algorithmus -Implementierungen und nimmt immer noch zu. Die neueste Version wurde auf 3.2 aktualisiert. Sein SDK unterstützt die Entwicklung von Android- und Java -Plattformen und kann die allgemeinen Bildverarbeitungsanforderungen fast erfüllen. Es sollte das erste Bildverarbeitungsrahmen für Java- und Android -Programmierer sein. Die Konfiguration der Verwendung von OpenCV in Java ist sehr einfach, und es kann gesagt werden, dass es fast keine Konfiguration ohne Höflichkeit ist.
1: Konfiguration
Um die Einführung von OpenCV-bezogenen JAR-Paketen zu konfigurieren, müssen Sie zunächst die Self-Tracing-Version von OpenCV herunterladen. Die Download-Adresse lautet: http://opencv.org/opencv-3-2.html
Ziehen Sie dann am Ende der Webseite an und laden Sie das Windows Self-Decompression-Entwicklungspaket herunter
Doppelklicken Sie nach dem Herunterladen, um den Build-Pfad zu entpacken und Folgendes zu finden:
Doppelklicken Sie, um den Java-Ordner zu öffnen.
Es gibt ein Glas, das direkt in das neue Projekt in Eclipse importiert wird, und kopieren die DLL -Datei in X64 in die in Eclipse verwendeten Java JDK -Bin- und JRE/Bin -Verzeichnisse. Die Umgebung ist konfiguriert, sie ist einfach! Die konfigurierte endgültige Projektstruktur:
Zwei: Laden von Bildern und Pixeloperationen laden
Lesen Sie ein Bild-, machen Sie es in einem Satz
Mat src = imgcodecs.imread (ImageFilepath); if (src.emppty ()) return;
MAT -Objekt in das BufferedImage -Objekt konvertieren
public bufferedImage conver2image (mat mat) {int width = mat.cols (); int Höhe = mat.rows (); int dims = mat.channels (); int [] pixels = new int [width*Höhe]; byte [] rgbdata = new Byte [Breite*Höhe*dims]; mat.get (0, 0, rgbdata); Bufferedimage image = new bufferedImage (width, Höhe, bufferedimage.type_int_argb); int index = 0; int r = 0, g = 0, b = 0; for (int row = 0; Zeile <Höhe; Zeile ++) {für (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; pixel [row*width+col] = ((255 & 0xff) << 24) | ((R & 0xff) << 16) | ((G & 0xff) << 8) | B & 0xff; } if (dims == 1) {index = row*width + col; b = rgbdata [index] & 0xff; pixel [row*width+col] = ((255 & 0xff) << 24) | ((B & 0xff) << 16) | ((B & 0xff) << 8) | B & 0xff; }}} setRGB (Bild, 0, 0, Breite, Höhe, Pixel); Image zurückgeben;}Konvertieren Sie das Objekt des BufferedImage in MAT -Objekt
public mat convert2mat (bufferedImage Bild) {int width = image.getWidth (); int height = image.getheight (); MAT SRC = New Mat (neue Größe (Breite, Höhe), CVTYPE.CV_8UC3); int [] pixels = new int [width*Höhe]; byte [] rgbdata = new Byte [Breite*Höhe*3]; getrgb (Bild, 0, 0, Breite, Höhe, Pixel); int index = 0, c = 0; int r = 0, g = 0, b = 0; für (int row = 0; Zeile <Höhe; Zeile ++) {für (int col = 0; col <width; col ++) {index = row*width+col; C = Pixel [Index]; r = (c & 0xff0000) >> 16; g = (c & 0xff00) >> 8; B = C & 0xff; index = row*width*3 + col*3; rgbdata [index] = (byte) b; rgbdata [index+1] = (byte) g; rgbdata [index+2] = (byte) r; }} src.put (0, 0, rgbdata); Return src;}Insbesondere ist die Reihenfolge des RGB -Kanals von BufferedImage und MAT unterschiedlich. Im Gegenteil, die Reihenfolge der drei Kanäle im MAT -Objekt ist BGR und RGB in der Bufferung.
Lesen Sie alle Pixel von MAT (wobei das Bild mit MAT -Typ Daten ist)
int width = image.cols (); int height = image.rows (); int dims = image.channels (); byte [] data = new byte [width*hoch*dims]; Image.get (0, 0, data);
Pixeloperationen durchqueren und Änderungen sparen
int index = 0; int r = 0, g = 0, b = 0; for (int row = 0; Zeile <Höhe; Zeile ++) {for (int col = 0; col <width*dims; col+= dims) {index = row*width*dims+col; B = Daten [Index] & 0xff; g = Daten [Index+1] & 0xff; r = Daten [Index+2] & 0xff; r = 255 - r; g = 255 - g; B = 255 - B; Daten [index] = (byte) b; Daten [index+1] = (byte) g; Daten [index+2] = (byte) r; }} Image.put (0, 0, Daten);Speichern Sie MAT -Objekt als Bilddatei - kann in einem Satz erfolgen
ImgCodecs.imwrite (Filepath, SRC);
OpenCV -Code, das ausgeführt und getestet wird
Passen Sie den Grad an Licht und Dunkelheit an - Reduzieren Sie die Helligkeit
Passen Sie den Grad an Licht und Dunkelheit an - Helligkeit zunehmen
Gaußsche Unschärfe
Schärfen
Gradient
Graustufen
Der vollständige Java -Code für die oben genannten Effekte lautet wie folgt:
Paket com.gloomyfish.opencvdemo; import org.opencv.core.core; import org.opencv.core.cvtype; Bild) {int width = image.cols (); int height = image.rows (); int dims = image.channels (); byte [] data = new Byte [Breite*Höhe*dims]; Image.get (0, 0, Daten); int index = 0; int r = 0, g = 0, b = 0; für (int row = 0; Zeile <Höhe; Zeile ++) {für (int col = 0; col <width*dims; col+= dims) {index = row*width*dims+col; B = Daten [Index] & 0xff; g = Daten [Index+1] & 0xff; r = Daten [Index+2] & 0xff; r = 255 - r; g = 255 - g; B = 255 - B; Daten [index] = (byte) b; Daten [index+1] = (byte) g; Daten [index+2] = (byte) r; }} Image.put (0, 0, Daten); Return Image; } public mat hellness (MAT -Image) {// Helligkeit erhöht mat dst = new Mat (); Mat schwarz = mat.zeros (image.size (), image.type ()); Core.addWeighted (Bild, 1,2, schwarz, 0,5, 0, dst); Rückkehr DST; } public Mat Dunkelheit (MAT -Bild) {// Helligkeit verringern mat dst = new mat (); Mat schwarz = mat.zeros (image.size (), image.type ()); Core.addWeighted (Bild, 0,5, schwarz, 0,5, 0, dst); Rückkehr DST; } public mat Gray (Mat -Bild) {// Graustufe mat Gray = new Mat (); Imgproc.cvtcolor (Bild, grau, imgproc.color_bgr2gray); Gray zurückkehren; } public mat Sharpsen (MAT -Bild) {// Schärfe mat dst = new Mat (); float [] schicker = new float [] {0, -1, 0, -1, 5, -1, 0, -1, 0}; MAT -Operator = neue MAT (3, 3, cvType.cv_32fc1); Operator.put (0, 0, schärfer); Imgproc.filter2d (Bild, DST, -1, Operator); Rückkehr DST; } public mat Blur (MAT Image) {// Gaußsche Fuzzy mat dst = new mat (); Imgproc.gaussianblur (Bild, DST, neue Größe (15, 15), 0); Rückkehr 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 (Bild, Grad_x, cvtype.cv_32f, 1, 0); Imgproc.Sobel (Bild, 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); return gradxy; }}Es kann gesagt werden, dass es so einfach ist. Darüber hinaus unterstützt OpenCV für JAVA verschiedene Bildverarbeitung, einschließlich morphologischer Operationen, Binärbildanalyse, Bildfunktionserkennung und Erkennung, Vorlagenübereinstimmung, Histogramm-bezogenen Funktionen usw. Algorithmen für maschinelle Lernen und Bildanalysemethoden. Es kann gesagt werden, dass es eine der leistungsstärksten SDK- und Entwicklungsplattformen für Bildverarbeitung ist. Ich werde weiterhin erkunden und teilen!
Besondere Aufmerksamkeit achten
Stellen Sie vor dem Anruf diesen Satz hinzu
System.loadLibrary (core.Native_library_name);
Ziel ist es, die DLL -Unterstützung im Zusammenhang mit der OpenCV -API zu laden, die ohne sie nicht korrekt ausgeführt wird. Die obige Code- und Funktionsimplementierung basiert auf JDK8 64-Bit und OpenCV Version 3.2.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.