Tesseract: рд╕реА # рдЯреЗрд╕реНрд╕реЗрдХреНрдЯ 3.02 рдореИрдВ рдЫрд╡рд┐ рд╕реЗ рд╢рдмреНрдж рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рд┐рддреНрд░ рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪреВрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдЬрдире░ 2014  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: charlesw/tesseract

рдирдорд╕реНрддреЗ, рдореИрдВ рдпрд╣рд╛рдБ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рд╣реВрдБред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдЫрд╡рд┐ рд╕реЗ рд╢рдмреНрдж рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдкрд░ рдЖрдпрдд рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЯреЗрд╕реНрд╕реЗрдХреНрдЯ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рд┐рддреНрд░ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ

foreach (tessnet2.Character c in word.CharList)
рдИ.рдЧреНрд░рд╛рдлрд┐рдХреНрд╕редрдЖрдпрддрд╛рдХрд╛рд░ рдбреНрд░рд╛ ............

demo

рд▓реЗрдХрд┐рди, рдЕрдм рдореИрдВ Tesseract 3.02 рдХреЗ рд╕рд╛рде C# winform рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

TesseractEngine a = new TesseractEngine(@./tessdata", "eng", EngineMode.TesseractAndCube);
Tesseract.Page page1 = a.Process(image);
foreach (....... рдкреЗрдЬ 1 рдореЗрдВ)
{
// рд╕реЗ рдЖрдпрдд рдмрдирд╛рдПрдВ (рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХрд╛ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕)
}

рдкреНрд░рд╢реНрди рез: рдореИрдВ рдкреЗрдЬ рез рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рд┐рддреНрд░ рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдБрдЪрддрд╛ рд╣реВрдБред

рдореИрдВ PageIteratorLevel рдЬреИрд╕реЗ рдХрдИ рддрд░реАрдХреЛрдВ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдкреГрд╖реНрда рдХрд╛ рдХреБрдЫ рд╣рд┐рд╕реНрд╕рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐, рдкрд╣рд▓рд╛ рд╢рдмреНрдж рдпрд╛ рдкрд╣рд▓рд╛ рдмреНрд▓реЙрдХ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдирдХрд╛ рдкрд╣рд▓рд╛ рд╡рд░реНрдг рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред
рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдкреГрд╖реНрда 1 рд╕реЗ HOCRtext рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкрд╛рда рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдЬреИрд╕реЗ рд╢рдмреНрдж, рд░реЗрдЦрд╛, рдмреНрд▓реЙрдХ рдореЗрдВ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХрд╛ рдорд╛рди рд╣реЛрддрд╛ рд╣реИред

рдкреНрд░рд╢реНрди 2: рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХрд╛ рдореВрд▓реНрдп рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВред (рдореБрдЭреЗ рдХреЗрд╡рд▓ 1 рд╡рд┐рдзрд┐ "TryGetBoundingBox" рдорд┐рд▓реА рдЬреЛ рдХреЗрд╡рд▓ рдмреВрд▓рд┐рдпрди рд▓реМрдЯрд╛рддреА рд╣реИред

рдЬреА рд╢реБрдХреНрд░рд┐рдпрд╛ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

Q1 рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░:

рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХрдВрд╕реЛрд▓ рдирдореВрдирд╛ рджреЗрдЦреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рдореНрди рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

using (var iter = page.GetIterator()) {
    do {
        do {
            do {
                if (iter.IsAtBeginningOf(PageIteratorLevel.Block)) {
                    // do whatever you need to do when a block (top most level result) is encountered.
                }
                if (iter.IsAtBeginningOf(PageIteratorLevel.Para)) {
                    // do whatever you need to do when a paragraph is encountered.
                }
                if (iter.IsAtBeginningOf(PageIteratorLevel.TextLine)) {
                    // do whatever you need to do when a line of text is encountered is encountered.
                }                                               
                if (iter.IsAtBeginningOf(PageIteratorLevel.Word)) {
                    // do whatever you need to do when a word is encountered is encountered.
                }

                // get bounding box for symbol
                Rect symbolBounds;
                if(iter.TryGetBoundingBox(PageIteratorLevel.Symbol, out symbolBounds)) {
                    // do whatever you want with bounding box for the symbol
                }
            } while(iter.Next(PageIteratorLevel.Word, PageIteratorLevel.Block));
        } while (iter.Next(PageIteratorLevel.TextLine, PageIteratorLevel.Word));
    } while (iter.Next(PageIteratorLevel.Para, PageIteratorLevel.TextLine));
}

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдгрд╛рдо рдкрджрд╛рдиреБрдХреНрд░рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

рдмреНрд▓реЙрдХ -> рдкреИрд░рд╛ -> рдЯреЗрдХреНрд╕реНрдЯрд▓рд╛рдЗрди -> рд╢рдмреНрдж -> рдкреНрд░рддреАрдХ

рдпрд╛рдиреА рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдореЗрдВ рдХрдИ рдмреНрд▓реЙрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдмрджрд▓реЗ рдореЗрдВ рдХрдИ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдЖрджрд┐ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░рд╢реНрди 2 рдХрд╛ рдЙрддреНрддрд░:

рдКрдкрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ TryGetBoundingBox рд╡рд┐рдзрд┐ рдПрдХ рдЖрдЙрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╕реАрдорд╛ рд▓реМрдЯрд╛рддреА рд╣реИред рдмрд╣реБрдд рдХреБрдЫ Dictionary.TryGetValue рд╣реИред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Q1 рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░:

рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХрдВрд╕реЛрд▓ рдирдореВрдирд╛ рджреЗрдЦреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рдореНрди рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

using (var iter = page.GetIterator()) {
    do {
        do {
            do {
                if (iter.IsAtBeginningOf(PageIteratorLevel.Block)) {
                    // do whatever you need to do when a block (top most level result) is encountered.
                }
                if (iter.IsAtBeginningOf(PageIteratorLevel.Para)) {
                    // do whatever you need to do when a paragraph is encountered.
                }
                if (iter.IsAtBeginningOf(PageIteratorLevel.TextLine)) {
                    // do whatever you need to do when a line of text is encountered is encountered.
                }                                               
                if (iter.IsAtBeginningOf(PageIteratorLevel.Word)) {
                    // do whatever you need to do when a word is encountered is encountered.
                }

                // get bounding box for symbol
                Rect symbolBounds;
                if(iter.TryGetBoundingBox(PageIteratorLevel.Symbol, out symbolBounds)) {
                    // do whatever you want with bounding box for the symbol
                }
            } while(iter.Next(PageIteratorLevel.Word, PageIteratorLevel.Block));
        } while (iter.Next(PageIteratorLevel.TextLine, PageIteratorLevel.Word));
    } while (iter.Next(PageIteratorLevel.Para, PageIteratorLevel.TextLine));
}

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдгрд╛рдо рдкрджрд╛рдиреБрдХреНрд░рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

рдмреНрд▓реЙрдХ -> рдкреИрд░рд╛ -> рдЯреЗрдХреНрд╕реНрдЯрд▓рд╛рдЗрди -> рд╢рдмреНрдж -> рдкреНрд░рддреАрдХ

рдпрд╛рдиреА рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдореЗрдВ рдХрдИ рдмреНрд▓реЙрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдмрджрд▓реЗ рдореЗрдВ рдХрдИ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдЖрджрд┐ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░рд╢реНрди 2 рдХрд╛ рдЙрддреНрддрд░:

рдКрдкрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ TryGetBoundingBox рд╡рд┐рдзрд┐ рдПрдХ рдЖрдЙрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╕реАрдорд╛ рд▓реМрдЯрд╛рддреА рд╣реИред рдмрд╣реБрдд рдХреБрдЫ Dictionary.TryGetValue рд╣реИред

рд╣рд╛рдп рдЪрд╛рд░реНрд▓реНрд╕,

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕ рд╕рд╛рдорд╛рди рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдВ, рдореИрдВ рдПрдХ рдЫреЛрдЯреА рддрд╕реНрд╡реАрд░ рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд┐рддреНрд░ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдкрд╛рда рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд╕реНрд╡реАрд░ рд╕реЗ рдирд╣реАрдВ:

  1. рдХрд┐рд╕реА рдлреЛрдЯреЛрдЧреНрд░рд╛рдл рд╕реЗ BIB# рдХреИрд╕реЗ рдирд┐рдХрд╛рд▓реЗрдВред
    NotWorking

  2. рд╕рдВрдкреВрд░реНрдг рдлрд╝реЛрдЯреЛрдЧреНрд░рд╛рдлрд╝ рд╕реЗ рдХрд┐рд╕реА BIB# рдХреНрд╖реЗрддреНрд░ рдХреА рдкрд╣рдЪрд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВред
    H1764

рдзрдиреНрдпрд╡рд╛рджред

рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдХреНрд░реЙрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП opencv рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдкрд╛рдЗрдерди рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдбреЗрдореЛ рдХреЗ рд╕рд╛рде рдПрдХ рд▓рдбрд╝рдХрд╛ рд╣реИ рдЬрд┐рд╕реЗ .net рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

nguyenq picture nguyenq  ┬╖  25рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fhbiii picture fhbiii  ┬╖  25рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hh23485 picture hh23485  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

goodtogood picture goodtogood  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

masterisk picture masterisk  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ