ภาพรวม OpenCV
ในฐานะที่เป็นเฟรมเวิร์กคอมพิวเตอร์โอเพนซอร์สโอเพนซอร์ส OpenCV มีการใช้งานอัลกอริทึมมากกว่า 500 ครั้งและยังคงเพิ่มขึ้น เวอร์ชันล่าสุดได้รับการอัปเดตเป็น 3.2 SDK รองรับการพัฒนาแพลตฟอร์ม Android และ Java และเกือบจะสามารถปฏิบัติตามข้อกำหนดการประมวลผลภาพทั่วไปได้ มันควรจะกลายเป็นกรอบการประมวลผลภาพแรกสำหรับโปรแกรมเมอร์ Java และ Android การกำหนดค่าของการใช้ OpenCV ใน Java นั้นง่ายมากและอาจกล่าวได้ว่ามันเกือบจะเป็นศูนย์การกำหนดค่าโดยไม่มีความสุภาพใด ๆ
1: การกำหนดค่า
ในการกำหนดค่าการแนะนำแพ็คเกจ JAR ที่เกี่ยวข้องกับ OpENCV คุณต้องดาวน์โหลดเวอร์ชันการสกัดด้วยตนเองของ OpENCV ก่อน ที่อยู่ดาวน์โหลดคือ: http://opencv.org/opencv-3-2.html
จากนั้นดึงไปที่ด้านล่างของหน้าเว็บและดาวน์โหลดแพ็คเกจการพัฒนาตนเองของ Windows Decompression
หลังจากดาวน์โหลดให้ดับเบิลคลิกที่จะคลายรูดบิลด์พา ธ และค้นหาสิ่งต่อไปนี้:
ดับเบิลคลิกเพื่อเปิดโฟลเดอร์ Java
มีขวดที่นำเข้าโดยตรงไปยังโครงการใหม่ใน Eclipse จากนั้นคัดลอกไฟล์ DLL ใน X64 ลงในไดเรกทอรี Java JDK Bin และ JRE/BIN ที่ใช้ใน Eclipse สภาพแวดล้อมได้รับการกำหนดค่ามันง่าย! โครงสร้างโครงการสุดท้ายที่กำหนดค่า:
สอง: การโหลดรูปภาพและการดำเนินการพิกเซล
อ่านภาพ-ทำในประโยคเดียว
mat src = imgcodecs.imread (imageFilePath); ถ้า (src.empty ()) กลับ;
แปลงวัตถุเสื่อเป็นวัตถุบัฟเฟอร์เมจ
Public BufferedImage Conver2Image (Mat Mat) {int width = mat.cols (); ความสูง int = mat.rows (); int dims = mat.channels (); int [] พิกเซล = new int [ความกว้าง*ความสูง]; ไบต์ [] rgbdata = ไบต์ใหม่ [ความกว้าง*ความสูง*dims]; mat.get (0, 0, rgbdata); BufferedImage Image = New BufferedImage (ความกว้าง, ความสูง, bufferedImage.type_int_argb); ดัชนี int = 0; int r = 0, g = 0, b = 0; สำหรับ (int row = 0; row <height; row ++) {สำหรับ (int col = 0; col <width; col ++) {ถ้า (dims == 3) {index = row = row*width*dims+col*dims; b = rgbdata [ดัชนี] & 0xff; g = rgbdata [ดัชนี+1] & 0xff; r = rgbdata [ดัชนี+2] & 0xff; พิกเซล [แถว*ความกว้าง+col] = ((255 & 0xff) << 24) | ((r & 0xff) << 16) | ((G & 0xff) << 8) | b & 0xff; } if (dims == 1) {index = row*width + col; b = rgbdata [ดัชนี] & 0xff; พิกเซล [แถว*ความกว้าง+col] = ((255 & 0xff) << 24) | ((b & 0xff) << 16) | ((b & 0xff) << 8) | b & 0xff; }}} setRgb (ภาพ, 0, 0, ความกว้าง, ความสูง, พิกเซล); ส่งคืนภาพ;}แปลงวัตถุ bufferedImage เป็น mat object
Public Mat Convert2Mat (BufferedImage Image) {int width = image.getWidth (); ความสูง int = image.getheight (); MAT SRC = MAT ใหม่ (ขนาดใหม่ (ความกว้าง, ความสูง), cvtype.cv_8uc3); int [] พิกเซล = new int [ความกว้าง*ความสูง]; ไบต์ [] rgbdata = ไบต์ใหม่ [ความกว้าง*ความสูง*3]; getRGB (ภาพ, 0, 0, ความกว้าง, ความสูง, พิกเซล); INT INDEX = 0, C = 0; int r = 0, g = 0, b = 0; สำหรับ (int row = 0; row <ความสูง; แถว ++) {สำหรับ (int col = 0; col <width; col ++) {index = row*width+col; c = พิกเซล [ดัชนี]; r = (c & 0xff0000) >> 16; g = (c & 0xff00) >> 8; b = c & 0xff; index = row*width*3 + col*3; rgbdata [ดัชนี] = (ไบต์) B; rgbdata [ดัชนี+1] = (ไบต์) g; rgbdata [ดัชนี+2] = (ไบต์) r; }} src.put (0, 0, rgbdata); ส่งคืน src;}โดยเฉพาะอย่างยิ่งลำดับของช่อง RGB ของ bufferedimage และ MAT นั้นแตกต่างกัน ในทางตรงกันข้ามคำสั่งของสามช่องในวัตถุ MAT คือ BGR และ RGB ใน bufferedImage
อ่านพิกเซลทั้งหมดจาก MAT (โดยที่ภาพคือข้อมูลประเภท MAT)
int width = image.cols (); int height = image.rows (); int dims = image.channels (); byte [] data = byte ใหม่ [ความกว้าง*ความสูง*dims]; image.get (0, 0, ข้อมูล);
การดำเนินการผ่านพิกเซลและการเปลี่ยนแปลงการเปลี่ยนแปลง
int index = 0; int r = 0, g = 0, b = 0; สำหรับ (int row = 0; แถว <ความสูง; แถว ++) {สำหรับ (int col = 0; col <width*dims; col+= dims) {index = row*width*dims+col; b = ข้อมูล [ดัชนี] & 0xff; g = data [ดัชนี+1] & 0xff; r = data [ดัชนี+2] & 0xff; r = 255 - r; g = 255 - G; B = 255 - B; ข้อมูล [ดัชนี] = (ไบต์) B; ข้อมูล [ดัชนี+1] = (ไบต์) g; ข้อมูล [ดัชนี+2] = (ไบต์) r; }} image.put (0, 0, data);บันทึกวัตถุ MAT เป็นไฟล์ภาพ - สามารถทำได้ในหนึ่งประโยค
imgcodecs.imwrite (filepath, src);
รหัส OpenCV กำลังทำงานและทดสอบ
ปรับระดับแสงและความมืด - ลดความสว่าง
ปรับระดับแสงและความมืด - ความสว่างเพิ่มขึ้น
เบลอเกาส์
คมชัด
การไล่ระดับสี
สีเทา
รหัส Java ที่สมบูรณ์สำหรับเอฟเฟกต์ข้างต้นมีดังนี้:
แพ็คเกจ com.gloomyfish.opencvdemo; นำเข้า org.opencv.core.core; นำเข้า org.opencv.core.cvtype; นำเข้า org.opencv.core.mat; นำเข้า org.opencv.core.size; นำเข้า image) {int width = image.cols (); ความสูง int = image.rows (); int dims = image.channels (); Byte [] data = byte ใหม่ [ความกว้าง*ความสูง*dims]; image.get (0, 0, ข้อมูล); ดัชนี int = 0; int r = 0, g = 0, b = 0; สำหรับ (int row = 0; row <ความสูง; แถว ++) {สำหรับ (int col = 0; col <width*dims; col+= dims) {index = row*width*dims+col; b = ข้อมูล [ดัชนี] & 0xff; g = data [ดัชนี+1] & 0xff; r = data [ดัชนี+2] & 0xff; r = 255 - r; g = 255 - G; B = 255 - B; ข้อมูล [ดัชนี] = (ไบต์) B; ข้อมูล [ดัชนี+1] = (ไบต์) g; ข้อมูล [ดัชนี+2] = (ไบต์) r; }} image.put (0, 0, data); ภาพกลับ; } ความสว่างของเสื่อสาธารณะ (ภาพเสื่อ) {// ความสว่างเพิ่ม MAT DST = MAT ใหม่ (); mat black = mat.zeros (image.size (), image.type ()); core.addweighted (ภาพ, 1.2, ดำ, 0.5, 0, dst); กลับ DST; } Public Mat Darkness (ภาพ MAT) {// ความสว่างลดลง MAT DST = MAT ใหม่ (); mat black = mat.zeros (image.size (), image.type ()); core.addweighted (ภาพ, 0.5, ดำ, 0.5, 0, dst); กลับ DST; } Public Mat Grey (Mat Image) {// สีเทาเสื่อเกรย์สีเทา = mat ใหม่ (); imgproc.cvtcolor (รูปภาพ, สีเทา, imgproc.color_bgr2gray); กลับสีเทา; } เสื่อสาธารณะคมชัด (ภาพเสื่อ) {// sharpen mat dst = mat ใหม่ (); float [] sharper = new float [] {0, -1, 0, -1, 5, -1, 0, -1, 0}; ตัวดำเนินการ MAT = MAT ใหม่ (3, 3, cvtype.cv_32fc1); operator.put (0, 0, sarper); imgproc.filter2d (รูปภาพ, dst, -1, ผู้ดำเนินการ); กลับ DST; } Public Mat Blur (Mat Image) {// Gaussian Fuzzy Mat DST = NEW MAT (); imgproc.gaussianblur (รูปภาพ, DST, ขนาดใหม่ (15, 15), 0); กลับ DST; } Public Mat Groadient (ภาพ MAT) {// การไล่ระดับสี MAT Grad_x = MAT ใหม่ (); Mat grad_y = mat ใหม่ (); mat abs_grad_x = mat ใหม่ (); mat abs_grad_y = mat ใหม่ (); imgproc.sobel (รูปภาพ, grad_x, cvtype.cv_32f, 1, 0); imgproc.sobel (รูปภาพ, grad_y, cvtype.cv_32f, 0, 1); core.convertscaleab (grad_x, abs_grad_x); core.convertscaleab (grad_y, abs_grad_y); Grad_x.release (); Grad_y.release (); Mat gradxy = mat ใหม่ (); core.addweighted (abs_grad_x, 0.5, abs_grad_y, 0.5, 10, gradxy); กลับ gradxy; -มันสามารถกล่าวได้ว่าง่ายมาก นอกจากนี้ OpenCV สำหรับ Java ยังสนับสนุนการประมวลผลภาพต่าง ๆ รวมถึงการดำเนินการทางสัณฐานวิทยาการวิเคราะห์ภาพไบนารีการตรวจจับและรับรู้คุณสมบัติของภาพการจับคู่แม่แบบฟังก์ชั่นที่เกี่ยวข้องกับฮิสโตแกรม ฯลฯ อัลกอริทึมการเรียนรู้ของเครื่องจักรส่วนกลางและวิธีการวิเคราะห์ภาพ อาจกล่าวได้ว่าเป็นหนึ่งในการประมวลผลภาพที่ทรงพลังที่สุด SDK และแพลตฟอร์มการพัฒนา ฉันจะสำรวจและแบ่งปันต่อไป!
ให้ความสนใจเป็นพิเศษ
ก่อนโทรตรวจสอบให้แน่ใจว่าได้เพิ่มประโยคนี้
System.loadLibrary (core.native_library_name);
วัตถุประสงค์คือการโหลดการสนับสนุน DLL ที่เกี่ยวข้องกับ OpenCV API ซึ่งจะไม่ทำงานอย่างถูกต้องหากไม่มี การใช้งานรหัสและฟังก์ชั่นข้างต้นขึ้นอยู่กับ JDK8 64 บิตและ OpenCV เวอร์ชัน 3.2
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น