Tinjauan OpenCV
Sebagai kerangka kerja visi komputer open source yang kuat, OpenCV berisi lebih dari 500 implementasi algoritma, dan masih meningkat. Versi terbarunya telah diperbarui menjadi 3.2. SDK -nya mendukung pengembangan platform Android dan Java, dan hampir dapat memenuhi persyaratan pemrosesan gambar yang umum. Ini harus menjadi kerangka pemrosesan gambar pertama untuk programmer Java dan Android. Konfigurasi menggunakan OpenCV di Java sangat sederhana, dan dapat dikatakan bahwa itu hampir nol konfigurasi tanpa kesopanan.
1: Konfigurasi
Untuk mengonfigurasi pengenalan paket JAR yang berhubungan dengan OpenCV, Anda harus terlebih dahulu mengunduh versi pengekspresikan sendiri dari OpenCV. Alamat unduhan adalah: http://opencv.org/opencv-3-2.html
Kemudian tarik ke bagian bawah halaman web dan unduh Paket Pengembangan Dekompresi Windows
Setelah mengunduh, klik dua kali untuk membuka ritsleting jalur build dan temukan yang berikut:
Klik dua kali untuk membuka folder Java.
Ada toples yang secara langsung diimpor ke proyek baru di Eclipse, dan kemudian menyalin file DLL di x64 ke dalam direktori Java JDK Bin dan JRE/bin yang digunakan dalam gerhana. Lingkungan dikonfigurasi, sederhana! Struktur proyek akhir yang dikonfigurasi:
Dua: Memuat gambar dan operasi piksel
Baca gambar--, lakukan dalam satu kalimat
Mat src = imgcodecs.imread (imagefilePath); if (src.empty ()) kembali;
Konversi objek mat menjadi objek bufferedimage
Public BufferedImage Conver2Image (Mat mat) {int width = mat.cols (); int tinggi = mat.rows (); int redup = mat.channels (); int [] piksel = int baru [lebar*tinggi]; byte [] rgbdata = byte baru [lebar*tinggi*redup]; Mat.get (0, 0, rgbdata); BufferedImage Image = BufferedImage Baru (Lebar, Tinggi, BufferedImage.type_int_ARGB); INT INDEX = 0; int r = 0, g = 0, b = 0; untuk (int baris = 0; baris <tinggi; baris ++) {untuk (int col = 0; col <width; col ++) {if (dims == 3) {index = baris*lebar*DIMS+col*dims; b = rgbData [indeks] & 0xff; g = rgbData [indeks+1] & 0xff; r = rgbData [indeks+2] & 0xff; piksel [baris*lebar+col] = ((255 & 0xff) << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | b & 0xff; } if (DIMS == 1) {index = baris*Lebar + col; b = rgbData [indeks] & 0xff; piksel [baris*lebar+col] = ((255 & 0xff) << 24) | ((b & 0xff) << 16) | ((b & 0xff) << 8) | b & 0xff; }}} setRGB (gambar, 0, 0, lebar, tinggi, piksel); mengembalikan gambar;}Konversi objek buferedimage menjadi objek mat
Public Mat Convert2mat (BufferedImage Image) {int width = image.getWidth (); int height = image.getHeight (); Mat SRC = mat baru (ukuran baru (lebar, tinggi), cvtype.cv_8uc3); int [] piksel = int baru [lebar*tinggi]; byte [] rgbdata = byte baru [lebar*tinggi*3]; getRGB (gambar, 0, 0, lebar, tinggi, piksel); int index = 0, c = 0; int r = 0, g = 0, b = 0; untuk (int baris = 0; baris <tinggi; baris ++) {untuk (int col = 0; col <width; col ++) {index = baris*lebar+col; c = piksel [indeks]; r = (C & 0XFF0000) >> 16; g = (C & 0XFF00) >> 8; B = C & 0XFF; indeks = baris*lebar*3 + col*3; rgbdata [index] = (byte) b; rgbdata [indeks+1] = (byte) g; rgbdata [indeks+2] = (byte) r; }} src.put (0, 0, rgbdata); kembalikan src;}Secara khusus, urutan saluran RGB dari bufferedImage dan Mat berbeda. Sebaliknya, urutan ketiga saluran dalam objek MAT adalah BGR dan RGB dalam bufferedImage.
Baca semua piksel dari mat (di mana gambar adalah data tipe mat)
int width = image.cols (); int height = image.rows (); int dims = image.channels (); byte [] data = byte baru [lebar*tinggi*DIMS]; gambar.get (0, 0, data);
Melintasi Operasi Pixel dan Menghemat Perubahan
int index = 0; int r = 0, g = 0, b = 0; untuk (int baris = 0; baris <tinggi; baris ++) {untuk (int col = 0; col <width*redup; col+= redup) {index = baris*lebar*dims+col; b = data [indeks] & 0xff; g = data [indeks+1] & 0xff; r = data [indeks+2] & 0xff; r = 255 - r; g = 255 - g; b = 255 - b; data [indeks] = (byte) b; data [indeks+1] = (byte) g; data [indeks+2] = (byte) r; }} image.put (0, 0, data);Simpan Objek Mat sebagai File Gambar - Dapat dilakukan dalam satu kalimat
Imgcodecs.imwrite (filepath, src);
Kode OpenCV berjalan dan menguji
Sesuaikan tingkat terang dan kegelapan - kurangi kecerahan
Sesuaikan tingkat terang dan kegelapan - peningkatan kecerahan
Gaussian Blur
Mengasah
gradien
GRAYSCALE
Kode Java lengkap untuk efek di atas adalah sebagai berikut:
Paket com.gloomyfish.opencvdemo; impor org.opencv.core.core; impor org.opencv.core.cvtype; impor org.opencv.core.mat; impor org.opencv.core. gambar) {int width = image.cols (); int height = image.rows (); int dims = image.channels (); byte [] data = byte baru [lebar*tinggi*redup]; Image.get (0, 0, data); INT INDEX = 0; int r = 0, g = 0, b = 0; untuk (int row = 0; baris <tinggi; baris ++) {untuk (int col = 0; col <width*redup; col+= redup) {index = baris*lebar*redup+col; b = data [indeks] & 0xff; g = data [indeks+1] & 0xff; r = data [indeks+2] & 0xff; r = 255 - r; g = 255 - g; b = 255 - b; data [indeks] = (byte) b; data [indeks+1] = (byte) g; data [indeks+2] = (byte) r; }} image.put (0, 0, data); gambar kembali; } Kecerahan MAT Public (Gambar MAT) {// Kecerahan Tingkatkan Mat dst = NEW MAT (); Mat black = mat.zeros (image.size (), image.type ()); Core.addweighted (Image, 1.2, Black, 0,5, 0, DST); mengembalikan dst; } public mat darkness (gambar mat) {// kecerahan penurunan mat dst = new mat (); Mat black = mat.zeros (image.size (), image.type ()); Core.addweighted (gambar, 0,5, hitam, 0,5, 0, dst); mengembalikan dst; } public mat grey (gambar mat) {// grayscale mat grey = new mat (); Imgproc.cvtcolor (gambar, abu -abu, imgproc.color_bgr2gray); kembali abu -abu; } public mat -sharpen (gambar mat) {// sharpen mat dst = new mat (); float [] sharper = float baru [] {0, -1, 0, -1, 5, -1, 0, -1, 0}; MAT Operator = MAT baru (3, 3, cvtype.cv_32fc1); operator.put (0, 0, sharper); Imgproc.filter2d (gambar, dst, -1, operator); mengembalikan dst; } public mat blur (gambar mat) {// Gaussian fuzzy mat dst = new mat (); IMGPROC.AussianBlur (Image, DST, Ukuran Baru (15, 15), 0); mengembalikan dst; } gradien public mat (gambar mat) {// gradient mat grad_x = new mat (); Mat grad_y = mat baru (); Mats abs_grad_x = mat baru (); Mats abs_grad_y = mat baru (); Imgproc.sobel (gambar, grad_x, cvtype.cv_32f, 1, 0); Imgproc.sobel (gambar, 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, lulusan); mengembalikan lulusan; }}Dapat dikatakan sangat sederhana. Selain itu, OpenCV untuk Java mendukung berbagai pemrosesan gambar termasuk operasi morfologis, analisis gambar biner, deteksi dan pengakuan fitur gambar, pencocokan templat, fungsi terkait histogram, dll. Algoritma pembelajaran mesin umum dan metode analisis gambar. Dapat dikatakan sebagai salah satu SDK pemrosesan gambar yang paling kuat dan platform pengembangan. Saya akan terus menjelajahi dan berbagi!
Memberi perhatian khusus
Sebelum menelepon, pastikan untuk menambahkan kalimat ini
System.LoadLibrary (core.native_library_name);
Tujuannya adalah untuk memuat dukungan DLL yang terkait dengan API OpenCV, yang tidak akan berjalan dengan benar tanpa itu. Kode dan implementasi fungsi di atas didasarkan pada JDK8 64-bit dan OpenCV versi 3.2.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.