์๋
ํ์ธ์, ์ ๋ ์ฌ๊ธฐ ์ด๋ณด์์
๋๋ค.
๋จผ์ ์ด๋ฏธ์ง์์ ๋จ์ด์ ๊ฐ ๋ฌธ์์ ์ง์ฌ๊ฐํ์ ๊ทธ๋ ค์ผํฉ๋๋ค.
์ด์ ๋ฒ์ ์ tesseract์์ ๋๋ ์ฐ๋ฆฌ๊ฐ
foreach (word.CharList์ tesnet2.Character c)
e.Graphics.DrawRectangle ..........
ํ์ง๋ง ์ง๊ธ์ Tesseract 3.02๋ก C # winform์์ ์์ ํ๊ณ ์์ต๋๋ค.
TesseractEngine a = new TesseractEngine (@ "./ tessdata", "eng", EngineMode.TesseractAndCube);
Tesseract.Page page1 = a.Process (์ด๋ฏธ์ง);
foreach (....... 1 ํ์ด์ง)
{
// (๊ฐ ๋ฌธ์์ ๊ฒฝ๊ณ ์์)์์ ์ง์ฌ๊ฐํ์ ๊ทธ๋ฆฝ๋๋ค.
}
์ง๋ฌธ 1 : page1์ ๊ฐ ๋ฌธ์์ ์ก์ธ์คํ๋ ๋ฐฉ๋ฒ.
PageIteratorLevel๊ณผ ๊ฐ์ ๋ง์ ๋ฐฉ๋ฒ์ ์๋ํ๊ณ ์ฒซ ๋ฒ์งธ ์ค, ์ฒซ ๋ฒ์งธ ๋จ์ด ๋๋ ์ฒซ ๋ฒ์งธ ๋ธ๋ก๊ณผ ๊ฐ์ ํ์ด์ง์ ์ผ๋ถ๋ฅผ ์ป์์ง๋ง ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๊ธ์, ๋๋ page1์ HOCRtext ๊ฒฐ๊ณผ ํ
์คํธ์์ word, line, block๊ณผ ๊ฐ์ ๊ฐ ์์์ Bounding box์ ๊ฐ์ด ์์์ ์ ์ ์์ต๋๋ค.
์ง๋ฌธ 2 : ๊ฐ ์์์ ๊ฒฝ๊ณ ์์ ๊ฐ์ ์ป๋ ๋ฐฉ๋ฒ. (๋ถ์ธ ๋ง ๋ฐํํ๋ "TryGetBoundingBox"๋ฉ์๋๋ฅผ ํ๋๋ง ์ฐพ์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ณตํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ ๋ฅผ ์ ๊ณตํ๋ฏ๋ก ์ ๊ณต๋ ์ฝ์ ์ํ์ ํ์ธํ์ญ์์ค. ๊ทธ๋ฌ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ์๋ํฉ๋๋ค.
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));
}
์ผ๋ฐ์ ์ธ ๊ฒฐ๊ณผ ๊ณ์ธต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ธ๋ก-> Para-> TextLine-> Word-> Symbol
์ฆ, ๊ฒฐ๊ณผ ์ธํธ๋ ๋ง์ ๋ธ๋ก์ ํฌํจ ํ ์ ์์ผ๋ฉฐ ์ฐจ๋ก๋ก ๋ง์ ๋จ๋ฝ์ ํฌํจ ํ ์ ์์ต๋๋ค.
์์ ๊ฐ์ด TryGetBoundingBox
๋ฉ์๋๋ out ๋งค๊ฐ ๋ณ์์ ๊ฒฝ๊ณ๋ฅผ ๋ฐํํฉ๋๋ค. Dictionary.TryGetValue
์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
์๋ ์ฐฐ์ค,
๋น์ ์ด ์ํ๊ณ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋๋์ด ๋ฌผ๊ฑด์ ์ต์ํ์ง ์๋ค. ์์ ๊ทธ๋ฆผ์ด๋ ํ ์คํธ ๊ทธ๋ฆผ์์ ํ์ํ ํ ์คํธ๋ฅผ ์ป์ ์ ์์ง๋ง ์ค์ ๊ทธ๋ฆผ์์๋ ์ป์ ์ ์๋ค.
์ฌ์ง์์ BIB #๋ฅผ ์ถ์ถํ๋ ๋ฐฉ๋ฒ.
์ ์ฒด ์ฌ์ง์์ BIB # ์์ญ์ ์ธ์ํ๋ ๋ฐฉ๋ฒ.
๊ฐ์ฌ.
opencv๋ฅผ ์ฌ์ฉํ์ฌ ์์ญ์ ์ฐพ๊ณ ์๋ฆ ๋๋ค. .net์ผ๋ก ๋ฒ์ญํ๊ธฐ ์ด๋ ต์ง ์์ Python์ผ๋ก ์์ฑ๋ ๋ฐ๋ชจ๋ฅผ ๊ฐ์ง ์ฌ๋์ด ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
1 ๋ถ๊ธฐ ๋ต๋ณ :
๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ณตํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ ๋ฅผ ์ ๊ณตํ๋ฏ๋ก ์ ๊ณต๋ ์ฝ์ ์ํ์ ํ์ธํ์ญ์์ค. ๊ทธ๋ฌ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ์๋ํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๊ฒฐ๊ณผ ๊ณ์ธต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ธ๋ก-> Para-> TextLine-> Word-> Symbol
์ฆ, ๊ฒฐ๊ณผ ์ธํธ๋ ๋ง์ ๋ธ๋ก์ ํฌํจ ํ ์ ์์ผ๋ฉฐ ์ฐจ๋ก๋ก ๋ง์ ๋จ๋ฝ์ ํฌํจ ํ ์ ์์ต๋๋ค.
์ง๋ฌธ 2์ ๋ํ ๋ต๋ณ :
์์ ๊ฐ์ด
TryGetBoundingBox
๋ฉ์๋๋ out ๋งค๊ฐ ๋ณ์์ ๊ฒฝ๊ณ๋ฅผ ๋ฐํํฉ๋๋ค.Dictionary.TryGetValue
์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.