The numbers on the image are identified by the EMGU implementation.
Previous steps:
1. Download the EMGU installation file, my version is 2.4.2.1777. Support for Chinese is available for version 3.0.
2. After installation, fill in the environment variable, and add the EMGU installation path to the bin after the environment variable path value. such as C:\Emgu\emgucv-windows-x86-gpu 2.4.2.1777\bin;
3. Find the required DLLs under bin such as Emgu.CV.dll and Emgu.CV.OCR.dll.
4. The C:\Emgu\emgucv-windows-x86-gpu folder under 2.4.2.1777\bin The Tessdata is assigned to the program run directory.
Note: A C # version of demo is available under the EMGU path after installation for reference
Key code:
Import the required DLLs into your project.
Private Static Tesseract _OCR; // Create a Recognition object
//incoming images for identification Public Static stringorc_ (Bitmap img) {//"" Marked OCR recognition call failed stringRe =""; if(img = =NULL) returnre; Else{Bgr Drawcolor=NewBgr (Color.Blue); Try{Image<BGR, byte> image =NewIMAGE<BGR,byte>(IMG); using(Image<gray,byte> Gray = image. Convert<gray, byte>()) {_OCR. recognize (gray); Tesseract.charactor[] Charactors=_OCR. Getcharactors (); foreach(Tesseract.charactor Cinchcharactors) {image. Draw (C.region, Drawcolor,1); } Re=_OCR. GetText (); } returnre; } Catch(Exception ex) {returnre; } } } //recognition methods such as click button RecognitionPrivate voidBtnxidentification_click (Objectsender, EventArgs e) { Try{_OCR=NewTesseract (@"C:\Emgu\emgucv-windows-x86-gpu 2.4.2.1777\bin\tessdata","Eng", Tesseract.OcrEngineMode.OEM_TESSERACT_CUBE_COMBINED);//method The first parameter can be "" means to call the library through the environment variable, the second parameter represents the font of the file, the third means the recognition method, can see the document and data lookup. _OCR. SetVariable ("tessedit_char_whitelist","0123456789X");//This method indicates that only 1234567890 and x letters are recognized stringresult =""; Bitmap Bitmap=NewBitmap (_emguimage.tobitmap ()); Bitmap= BRIGHTNESSP (Bitmap, Convert.ToInt32 ( This. Textboxx3.text));//Picture Highlighting ProcessBitmap = Kicontrast (Bitmap, Convert.ToInt32 ( This. Textboxx2.text));//Adjust the contrast to This. Picturebox3.image =bitmap; Result=orc_ (bitmap); This. Textboxx1.text =result; _OCR. Dispose (); } Catch(Exception Exception) {MessageBox.Show (Exception. Message); } } /// <summary> ///Increase image Brightness/// </summary> /// <param name= "a" ></param> /// <param name= "V" ></param> /// <returns></returns> Public StaticBitmap BRIGHTNESSP (Bitmap A,intv) {System.Drawing.Imaging.BitmapData Bmpdata= A.lockbits (NewRectangle (0,0, A.width, A.height), System.Drawing.Imaging.ImageLockMode.ReadWrite, SYSTEM.DRAWING.IMAGING.PIXELFORMAT.FORMAT24BPPRGB); intbytes = A.width * A.height *3; IntPtr ptr=Bmpdata.scan0; intStride =Bmpdata.stride; unsafe { byte* p = (byte*) ptr; inttemp; for(intj =0; J < A.height; J + +) { for(inti =0; I < A.width *3; i++, p++) {Temp= (int) (p[0] +v); Temp= (Temp >255) ?255: Temp <0?0: temp; p[0] = (byte) temp; } P+ = Stride-a.width *3; }} a.unlockbits (Bmpdata); returnA; } ///<summary> ///Image Contrast Adjustment///</summary> ///<param name= "B" >Original Diagram</param> ///<param name= "degree" >contrast Ratio [ -100, +]</param> ///<returns></returns> Public StaticBitmap Kicontrast (Bitmap B,intdegree) { if(b = =NULL) { return NULL; } if(Degree <- -) degree =- -; if(Degree > -) degree = -; Try { DoublePixel =0; DoubleContrast = (100.0+ degree)/100.0; Contrast*=contrast; intwidth =B.width; intHeight =B.height; BitmapData Data= B.lockbits (NewRectangle (0,0, width, height), imagelockmode.readwrite, Pixelformat.format24bpprgb); unsafe { byte* p = (byte*) data. Scan0; intoffset = data. Stride-width *3; for(inty =0; Y < height; y++) { for(intx =0; x < width; X + +) { //handles the contrast of pixels at a specified position for(inti =0; I <3; i++) {pixel= ((P/255.0-0.5) * Contrast +0.5) *255; if(Pixel <0) pixel =0; if(Pixel >255) pixel =255; P= (byte) pixel; } //Ip + =3; } //xp + =offset; } //y} b.unlockbits (data); returnb; } Catch(Exception ex) {return NULL; } }
Oem_tesseract_only,//Run tesseract Only-fastest runs only tesseract-fastest
Oem_cube_only,//Run cube only-better accuracy, but slower only run cubes-better precision, but slower
oem_tesseract_cube_combined,//Run both and combine results-best accuracy operation and results combined-best accuracy
Oem_default//Specify this mode is when calling init_* () is specified, when calling init_* ()
Share C # to identify numbers on a picture