نظرة عامة OpenCV
كإطار عمل قوي مفتوح المصدر للكمبيوتر ، يحتوي OpenCV على أكثر من 500 تطبيق خوارزمية ، ولا يزال يتزايد. تم تحديث أحدث إصدار لها إلى 3.2. تدعم SDK تطوير منصات Android و Java ، ويمكن أن تلبي متطلبات معالجة الصور المشتركة تقريبًا. يجب أن يصبح أول إطار معالجة الصور لمبرمجي Java و Android. يعد تكوين استخدام OpenCV في Java أمرًا بسيطًا للغاية ، ويمكن القول إنه تكوين صفر تقريبًا دون أي دببة.
1: التكوين
لتكوين مقدمة حزم الجرة المرتبطة بـ OpenCV ، يجب عليك أولاً تنزيل إصدار الاستخلاص الذاتي من OpenCV. عنوان التنزيل هو: http://opencv.org/opencv-3-2.html
ثم اسحب إلى أسفل صفحة الويب وقم بتنزيل حزمة تطوير ضغط Windows ذاتية
بعد التنزيل ، انقر نقرًا مزدوجًا لفصل مسار البناء والعثور على ما يلي:
انقر نقرًا مزدوجًا لفتح مجلد Java.
هناك جرة يتم استيرادها مباشرة إلى المشروع الجديد في Eclipse ، ثم نسخ ملف DLL في X64 إلى أدلة Java JDK Bin و JRE/BIN المستخدمة في Eclipse. تم تكوين البيئة ، إنها بسيطة! هيكل المشروع النهائي المكون:
الثاني: تحميل الصور وعمليات البكسل
اقرأ صورة-، افعلها في جملة واحدة
MAT SRC = IMGCODECS.IMREAD (ImageFilePath) ؛ if (src.empty ()) return ؛
تحويل كائن حصيرة إلى كائن bufferedimage
public bufferedImage Conver2Image (mat mat) {int width = mat.cols () ؛ ارتفاع int = mat.rows () ؛ int dims = mat.channels () ؛ int [] pixels = new int [width*height] ؛ byte [] rgbdata = new byte [width*height*dims] ؛ mat.get (0 ، 0 ، rgbdata) ؛ صورة bufferedImage = جديد bufferedImage (العرض ، الارتفاع ، bufferedImage.type_int_argb) ؛ int index = 0 ؛ int r = 0 ، g = 0 ، b = 0 ؛ لـ (int row = 0 ؛ row <height ؛ 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 ؛ وحدات البكسل [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 ؛ وحدات البكسل [ROW*WIDTH+COL] = ((255 & 0xff) << 24) | ((b & 0xff) << 16) | ((b & 0xff) << 8) | b & 0xff ؛ }}} setrgb (صورة ، 0 ، 0 ، العرض ، الارتفاع ، وحدات البكسل) ؛ إرجاع صورة ؛}تحويل كائن BufferedImage إلى كائن MAT
حصيرة عامة convert2mat (صورة bufferedImage) {int width = image.getWidth () ؛ ارتفاع int = image.getheight () ؛ MAT SRC = New MAT (حجم جديد (العرض ، الارتفاع) ، cvtype.cv_8uc3) ؛ int [] pixels = new int [width*height] ؛ byte [] rgbdata = new byte [width*height*3] ؛ getRGB (صورة ، 0 ، 0 ، العرض ، الارتفاع ، وحدات البكسل) ؛ int index = 0 ، c = 0 ؛ int r = 0 ، g = 0 ، b = 0 ؛ لـ (int row = 0 ؛ row <height ؛ row ++) {for (int col = 0 ؛ col <width ؛ col ++) {index = row*width+col ؛ C = وحدات البكسل [الفهرس] ؛ r = (C & 0xFF0000) >> 16 ؛ g = (C & 0xFF00) >> 8 ؛ B = C & 0xff ؛ الفهرس = الصف*العرض*3 + col*3 ؛ rgbdata [index] = (byte) b ؛ rgbdata [index+1] = (byte) g ؛ rgbdata [index+2] = (byte) 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 = new byte [width*height*dims] ؛ image.get (0 ، 0 ، data) ؛
اجتياز عمليات البيكسل وتوفير التغييرات
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 = البيانات [الفهرس] & 0xff ؛ g = البيانات [index+1] & 0xff ؛ r = البيانات [الفهرس+2] & 0xFF ؛ ص = 255 - ص ؛ ز = 255 - ز ؛ ب = 255 - ب ؛ البيانات [الفهرس] = (بايت) ب ؛ البيانات [الفهرس+1] = (بايت) G ؛ البيانات [الفهرس+2] = (بايت) ص ؛ }} image.put (0 ، 0 ، data) ؛حفظ كائن MAT كملف صورة - يمكن القيام به في جملة واحدة
imgcodecs.imwrite (FilePath ، SRC) ؛
رمز OpenCV تشغيل واختبار
اضبط درجة الضوء والظلام - تقليل السطوع
اضبط درجة الضوء والظلام - زيادة السطوع
طمس غاوسي
شحذ
التدرج
رمادي
رمز Java الكامل للتأثيرات المذكورة أعلاه هو كما يلي:
package com.gloomyfish.opencvdemo ؛ import org.opencv.core Image) {int width = image.cols () ؛ ارتفاع int = image.rows () ؛ int dims = image.channels () ؛ byte [] data = new byte [width*height*dims] ؛ Image.get (0 ، 0 ، Data) ؛ int index = 0 ؛ int r = 0 ، g = 0 ، b = 0 ؛ لـ (int row = 0 ؛ row <height ؛ row ++) {for (int col = 0 ؛ col <width*dims ؛ col+= dims) {index = row*width*dims+col ؛ B = البيانات [الفهرس] & 0xff ؛ g = البيانات [index+1] & 0xff ؛ r = البيانات [الفهرس+2] & 0xFF ؛ ص = 255 - ص ؛ ز = 255 - ز ؛ ب = 255 - ب ؛ البيانات [الفهرس] = (بايت) ب ؛ البيانات [الفهرس+1] = (بايت) G ؛ البيانات [الفهرس+2] = (بايت) ص ؛ }} image.put (0 ، 0 ، data) ؛ إرجاع الصورة ؛ } سطوع حصيرة عام (صورة حصيرة) {// زيادة السطوع mat dst = new mat () ؛ MAT Black = mat.zeros (image.size () ، image.type ()) ؛ Core.Addweighted (Image ، 1.2 ، Black ، 0.5 ، 0 ، DST) ؛ إرجاع DST ؛ } mat public darkness (mat image) {// brightness mat dst = new mat () ؛ MAT Black = mat.zeros (image.size () ، image.type ()) ؛ core.Addweighted (صورة ، 0.5 ، أسود ، 0.5 ، 0 ، DST) ؛ إرجاع DST ؛ } MAT GRAY (صورة حصيرة) {// grayscale mat gray = new mat () ؛ imgproc.cvtcolor (Image ، Gray ، imgproc.color_bgr2gray) ؛ إرجاع رمادي. } حصيرة عامة شحذ (صورة حصيرة) {// 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) ؛ المشغل. imgproc.filter2d (الصورة ، dst ، -1 ، المشغل) ؛ إرجاع DST ؛ } public mat blur (mat image) {// gaussian fuzzy mat dst = new mat () ؛ imgproc.gaussianblur (صورة ، ديست ، حجم جديد (15 ، 15) ، 0) ؛ إرجاع DST ؛ } public mat bradient (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.addweighted (abs_grad_x ، 0.5 ، abs_grad_y ، 0.5 ، 10 ، gradxy) ؛ عودة Gradxy. }}يمكن أن يقال أن تكون بسيطة جدا. بالإضافة إلى ذلك ، يدعم OpenCV for Java العديد من معالجة الصور بما في ذلك العمليات المورفولوجية ، وتحليل الصور الثنائية ، واكتشاف ميزة الصور والتعرف عليها ، ومطابقة القالب ، والوظائف ذات الصلة الرسم البياني ، وما إلى ذلك. خوارزميات التعلم الآلي الشائعة وطرق تحليل الصور. يمكن القول أن واحدة من أقوى SDK معالجة الصور ومنصات التطوير. سأستمر في استكشاف ومشاركة!
إيلاء اهتمام خاص
قبل الاتصال ، تأكد من إضافة هذه الجملة
System.LoadLibrary (core.native_library_name) ؛
والغرض من ذلك هو تحميل دعم DLL المتعلق بـ OpenCV API ، والتي لن تعمل بشكل صحيح بدونه. يعتمد تنفيذ الرمز والتنفيذ الوظيفي أعلاه على الإصدار 3.2 JDK8 64-BIT و OPENCV.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.