تشترك هذه المقالة في برنامج التعرف على رمز التحقق من صورة Javase بسيط للرجوع إليه. المحتوى المحدد كما يلي
أولاً ، يجب عليك أخذ عينات من الصورة ثم رمادي العينة ، أي تحويلها إلى أبيض وأسود.
ثم يمكنك استخدام هذه الفئة لتحليل ملف الكائن. أعتقد أن هذا الفصل واضح جدًا حول كيفية تنفيذه. هو تحريك العينة أفقياً من اليسار ، وتعديل الإحداثيات إلى الموضع التالي إذا كانت تتطابق مع واحدة مناسبة.
تمت كتابة هذا البرنامج منذ أكثر من 3 سنوات ، ولكن في وقت لاحق لم يتم كتابته بعمق. التعرف على الصور هو مجال عميق للغاية ، والذي يتطلب مهارات رياضية عميقة وقدرة التفكير. برنامج Java غير فعال ولا يمكنه التعرف على الصور المشوهة أو الممتدة. ومع ذلك ، كان يكفي في تلك الحقبة. إذا كان لديك رمز التعرف على الصورة مفتوح المصدر أفضل ، فيرجى التأكد من الكتابة للتواصل :)
/*** محرك تحليل الصور ، مناسب لتحليل رموز التحقق من موقع الويب. * أولاً ، يجب تحميل العينة ، وسيقوم المحلل بالمسح أفقيًا من اليسار إلى اليمين ، وسيقوم بتسجيله تلقائيًا إذا تم العثور عليه في العينة. * بالطبع ، هذا البرنامج غير مناسب للعينات وليس فريدًا ، أي أن الصورة المراد تحديدها يتم تغييرها أو تغيير الإحداثيات أو تشوهها. لا يمكن لهذا البرنامج أداء هذا التعريف. * إذا تغير اللون في الصورة كثيرًا ، فقد يواجه هذا البرنامج مشاكل. بالطبع ، يمكنك اختيار قيمة قياسية كمعيار لتحويلها إلى مصفوفة 0،1. * * إنتاج العينة: يرجى تحويل العينة إلى وضع رمادي. من الأفضل احتواء لونين فقط. بالطبع ، إذا لم تقم بتحويل ، فسوف أساعدك أيضًا في تحويله. * */import java.awt.image ؛ import java.awt.image.bufferedImage ؛ import java.io --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // byte private byte [] [] TargetColors ؛ // -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- القيم [i] = string.valueof (i) ؛ } parseparser parse = new ImageParser (الملفات ، القيم) ؛ بدء طويل = system.currentTimeMillis () ؛ جرب {// تحليل الصورة. long sincetime = system.currentTimeMillis () ؛ System.out.println ("Time Enrend =" + (SINCETIME - start)) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- System.out.println ("لا يتطابق ملف العينة مع قيمة العينة! يرجى إعادة تعيينها!") ؛ يعود؛ } switches = new ArrayList (fileslength) ؛ swatchevalues = new ArrayList (DateLength) ؛ int i = 0 ؛ حاول {for (؛ i <files.length ؛ i ++) {switches.add (ImageTomatrix (files [i])) ؛ swatchevalues.add (i ، القيم [i]) ؛ }} catch (استثناء e) {system.out.println (الملفات [i] + "لا يمكن تحليلها") ؛ E.PrintStackTrace () ؛ }}} public imageParser () {super () ؛ if (swatches == null || swatchevalues == null) {system.out.println ("لم تقم بتحميل العينة ، يرجى تحميل العينة أولاً!") ؛ }} / *** تحليل قيمة الصورة** param parsefilepath* أعط مسار الصورة* return إرجاع السلسلة* @throws استثناء* / public string parsevalue (سلسلة parsefilepath) يلقي استثناء {StringBuffer result = new StringBuffer () ؛ TargetColors = ImageTomatrix (parsefilepath) ؛ // printmatrix (TargetColors) ؛ ارتفاع int = TargetColors.Length ؛ int targetwidth = TargetColors [0] .Length ؛ عرض int = 0 ؛ iterator it = switches.iterator () ؛ بينما (it.hasnext ()) {byte [] [] bytes = (byte [] []) it.next () ؛ int temple = bytes [0] .Length ؛ إذا (templen> العرض) العرض = templen ؛ } // system.out.println ("maxwidth =" + width) ؛ // system.out.println ("maxheight =" + height) ؛ int xtag = 0 ؛ بينما ((xtag + width) <TargetWidth) {cout: {iterator itx = switches.iterator () ؛ int i = 0 ؛ بينما (itx.hasnext ()) {byte [] [] bytes = (byte [] []) itx.next () ؛ byte [] [] temp = splitmatrix (targetcolors ، xtag ، 0 ، width ، height) ؛ // system.out.println (i ++) ؛ if (ismatrixinbigmatrix (bytes ، temp)) {xtag += width ؛ // system.out.println ("New Maxtrix:") ؛ // printmatrix (temp) ؛ result.append (swatchevalues.get (i)) ؛ كوت } i ++ ؛ } xtag ++ ؛ }} return result.toString () ؛ }. bigmatrix * matrix كبير * return return true إذا كان موجودًا */ ismatrixinbigmatrix (البايت [] [] [] [] المصدر ، البايت [] [] bigmatrix) {if (source == bigmatrix) return true ؛ if (source == null || bigmatrix == null) return false ؛ if (source.length> bigmatrix.length) return false ؛ حاول {for (int i = 0 ؛ i <source.length ؛ i ++) {if (source [i] .length> bigmatrix [i] .Length) return false ؛ }} catch (ArrayIndExOutOfBoundSexception e) {return false ؛ } int height = source.length ؛ عرض int = المصدر [0]. الطول ؛ int x = 0 ، y = 0 ؛ int i = 0 ، j = 0 ؛ عدد int = 0 ؛ int المقارنة = الارتفاع * عرض ؛ لـ (؛ i <bigmatrix.length - الارتفاع+1 ؛ i ++) {for (j = 0 ؛ j <bigmatrix [i] .Length - width+1 ؛ j ++) {cout: {x = 0 ؛ العد = 0 ؛ لـ (int k = i ؛ k <height+i ؛ k ++) {y = 0 ؛ لـ (int l = j ؛ l <width + j ؛ l ++) {// system.out.println ("bytes [" + x + "] [" + y + "]" // + "=" + source [x] if ((Source [x] [y] & bigmatrix [k] [l]) == source [x] [y]) {count ++ ؛ } آخر كسر cout ؛ y ++ ؛ } x ++ ؛ } // system.out.println ("count =" + count) ؛ إذا (count == المقارنة) إرجاع true ؛ }}} return false ؛ } / *** cut matrix** param source* source matrix* param x* x coordinates* @param y* y إحداثيات* param عرض* عرض المصفوفة* param الارتفاع* ارتفاع المصفوفة* @Return cut matrix* / private static static by by by by state [] byte [] [] resultBytes = new byte [height] [width] ؛ لـ (int i = y ، k = 0 ؛ i <height+y ؛ i ++ ، k ++) {for (int j = x ، l = 0 ؛ j <width+x ؛ j ++ ، l ++) {resultBytes [k] [l] = source [i] [j] ؛ // system.out.println ("source [" + i + "] [" + j + "]" + "=" + // source [i] [j] + "،" + "resultBytes [" // + k + "] [" + l + "] =" + resultbytes [k] [l]) ؛ }} return resultbytes ؛ } / *** قم بتحويل الصورة إلى صفيف مصفوفة** param filepath* مسار الملف* return إرجاع المصفوفة* athrows استثناء* قد يتم إلقاء استثناء* / خاص بايت [] [] int w = image.getWidth (null) ؛ int h = image.getheight (null) ؛ BufferedImage SRC = جديد bufferedImage (W ، H ، BufferedImage.type_int_rgb) ؛ src.getGraphics (). drawImage (صورة ، 0 ، 0 ، null) ؛ byte [] [] colors = new byte [h] [w] ؛ لـ (int i = 0 ؛ i <h ؛ i ++) {for (int j = 0 ؛ j <w ؛ j ++) {int rgb = src.getrgb (j ، i) ؛ // Grayscale Processing of pixels string sred = Integer.ToHexString (RGB) .SubString (2 ، 4) ؛ String sgreen = integer.toHexString (RGB) .SubString (4 ، 6) ؛ String sblank = integer.toHexString (RGB) .SubString (6 ، 8) ؛ long ired = math.round ((integer.parseint (sred ، 16) * 0.3 + 0.5d)) ؛ Long Green = Math.Round ((integer.parseint (sgreen ، 16) * 0.59 + 0.5d)) ؛ long iblank = math.round ((integer.parseint (sblank ، 16) * 0.11 + 0.5d)) ؛ long al = ireed + green + iblank ؛ // if (al> 127) // system.out.print ("" + "") ؛ // else // system.out.print ("" + "1") ؛ // system.out.print ("" + (tempint> = maxint؟ 0: 1)) ؛ // system.out.println ("tempint =" + tempint) ؛ / * قم بتحويل الصورة إلى 0،1 */ // يمكن تعديل القيمة هنا بالقيمة التي تحتاجها للحكم في الألوان المستقبلية [i] [j] = (byte) (al> 127؟ 0: 1) ؛ } // system.out.println () ؛ } إرجاع الألوان ؛ } / ** * print matrix * * param matrix * / private static void printmatrix (byte [] [] matrix) {for (int i = 0 ؛ i <matrix.length ؛ i ++) {for (int j = 0 ؛ j <matrix [i] .length ؛ else system.out.print ("1") ؛ } system.out.println () ؛ }}}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.