この記事では、参照のための簡単なJavase画像検証コード認識プログラムを共有しています。特定のコンテンツは次のとおりです
まず、写真をサンプリングしてから、サンプルをグレースケールする必要があります。つまり、白黒に変える必要があります。
次に、このクラスを使用してオブジェクトファイルを分析できます。このクラスはそれを実装する方法について非常に明確だと思います。サンプルを左から水平に動かし、適切な位置と一致する場合は、座標を次の位置に調整することです。
このプログラムは3年以上前に書かれていましたが、後で詳細に書かれていませんでした。画像認識は非常に深い分野であり、深い数学的スキルと思考能力が必要です。 Javaプログラムは効率的ではなく、変形または伸びた写真を認識できません。しかし、それはその時代で十分でした。より優れたオープンソースの画像認識コードがある場合は、必ず通信するために書いてください:)
/***ウェブサイト検証コードの分析に適した画像解析エンジン。 *最初に、サンプルをロードする必要があります。パーサーは左から右に水平方向にスキャンし、サンプルで見つかった場合は自動的に記録します。 *もちろん、このプログラムはサンプルには適しておらず、一意ではありません。つまり、識別される画像がスケーリングされるか、座標が変更または変形されます。このプログラムはそのような識別を実行できません。 *写真の色が非常に変化した場合、このプログラムには問題がある可能性があります。もちろん、0,1マトリックスに変換するための標準として標準値を選択できます。 * *サンプルの生産:サンプルをグレースケールモードに変換してください。 2色のみを含めるのが最善です。もちろん、変換しない場合は、変換するお手伝いもします。 * */import java.awt.image; Import java.awt.image.bufferedimage; Import java.io.file; Import java.util.arraylist; Import java.util.list; import javax.imageio.imageio; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ swatcheValues = null; //マトリックスされたプライベートバイト[] []ターゲットコラー。 // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------値[i] = string.valueof(i); } imageParser parse = new ImageParser(files、values); long start = system.currenttimemillis(); try {// image system.out.println(parse.parsevalue( "d:/szxclientapp/res/validatenum")); long sincetime = system.currenttimemillis(); system.out.println( "time sped =" +(sincetime -start)); } catch(Exception e){e.printstacktrace(); }} // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- System.out.println( "サンプルファイルはサンプル値と一致しません!リセットしてください!");戻る; } switches = new ArrayList(filesLength); swatchevalues = new ArrayList(valuesLength); int i = 0; try {for(; i <files.length; i ++){switches.add(imagetomatrix(files [i])); swatchevalues.add(i、values [i]); }} catch(例外e){system.out.println(files [i] + "は解析できない"); e.printstacktrace(); }}} public ImageParser(){super(); if(swatches == null || swatchevalues == null){system.out.println( "サンプルをロードしていない、最初にサンプルをロードしてください!"); }} / ***画像の値を解析する** @param parsefilepath* @return @return return the string* @throws例外* / public string parsevalue(string parsefilepath)スロー{stringbuffer result = new StringBuffer(); TargetColors = imagetomatrix(parsefilepath); // printMatrix(ターゲットコラー); int height = targetcolors.length; int targetWidth =ターゲットコラー[0] .length; int width = 0; iterator it = switches.iterator(); while(it.hasnext()){byte [] [] bytes =(byte [] [])it.next(); int temple = bytes [0] .length; if(templen> width)width = templen; } // system.out.println( "maxwidth =" + width); // system.out.println( "maxheight =" + height); int xtag = 0; while((xtag + width)<targetwidth){cout:{iterator itx = switches.iterator(); int i = 0; while(itx.hasnext()){byte [] [] bytes =(byte [] [])itx.next(); byte [] [] [] temp = splitMatrix(ターゲットコロール、XTAG、0、幅、高さ); // 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(); } // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ @param source * Source matrix * @param bigmatrix * large matrix * @returnそれが存在する場合はtrueを返します */ private static final boolean ismatrixinbigmatrix(byte [] [] source、byte [] [] bigmatrix){if(source == bigmatrix)return true; if(source == null || bigmatrix == null)falseを返します。 if(source.length> bigmatrix.length)falseを返します。 try {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 width = source [0] .length; int x = 0、y = 0; int i = 0、j = 0; int count = 0; int比較=高さ *幅; for(; i <bigmatrix.length -height+1; i ++){for(j = 0; j <bigmatrix [i] .length -width+1; j ++){cout:{x = 0; count = 0; for(int k = i; k <height+i; k ++){y = 0; for(int l = j; l <width + j; l ++){// system.out.println( "bytes [" + x + "] [" + y + "]" // + " +" + source [x] [y] + "、" + "other [" // + k + "] [" + l + "=" + bigmatrix [l]); if((source [x] [y]&bigmatrix [k] [l])== source [x] [y]){count ++; } else break cout; y ++; } x ++; } // system.out.println( "count =" + count); if(count == comparecount)trueを返します。 }}} falseを返します。 } / ***カットマトリックス** @paramソース*ソースマトリックス* @param x* x座標* @param y* y座標* @param width* @param width* @param height* @return cut matrix* / private static final byte [] splitmatrix(int int int x byte [] [] resultbytes = new byte [height] [width]; for(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] + "、" + "results [" // + k + "] [" + l + "=" + resultbytes [k] [l]); }} runts resultbytes; } / ***画像をマトリックス配列に変換** @param filepath*ファイルパス* @return Matrix* @Throws例外*例外はスローされる場合があります* / private byte [] [] [] imageTomatrix(String filepath)Sthrows Exception {//ファイル画像の読み取り画像= Imageio(Filepath); int w = image.getWidth(null); int h = image.getheight(null); bufferedimage src = new bufferedimage(w、h、bufferedimage.type_int_rgb); src.getgraphics()。drawimage(image、0、0、null); byte [] [] colors = new byte [h] [w]; for(int i = 0; i <h; i ++){for(int j = 0; j <w; j ++){int rgb = src.getrgb(j、i); //ピクセルのグレースケール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 = ired + 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(); } return colors; } / ** * print matrix * * @param matrix * / private static final void printmatrix(byte [] [] matrix){for(int i = 0; i <matrix.length; i ++){for(int j = 0; j <matrix [i] .length; j ++){if(matrix [i] aut) else system.out.print( "1"); } system.out.println(); }}}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。