Dot Net ile Tesseract OCR

Tesseract bir OCR kütüphanesidir. OCR ise optik karakter tanıma ifadesinin İngilizce baş harfleri ile ifade edilmektedir. Apache lisansı ile dağıtılmaktadır ve 2006 yılından beri Google sponsorluğu ile C,C++ programlama dili kullanılarak geliştirilmektedir. Bu yazının yazıldığı tarih itibari ile kararlı sürümü 3.04 dür. Kaynak kodlarına github adreslerinden ulaşabilirsiniz, ayrıca diğer platformlar için de gerekli indirme bağlantılarını bulabilirsiniz.

C# ve VB.Net için doğrudan bir destek yoktur, fakat bağımsız geliştiriciler aracılığıyla güncelliğini koruyan Tesseract wrapper’ları bulunmaktadır. Kullanacağımız ise buradaki linkten de ulaşabileceğiniz 6 kişilik bir ekip tarafından geliştirilen wrapper.

Projenize doğrudan import ekmek için NuGet  üzerinden aşağıdaki komutunu kullanabilirsiniz.

PM- Install-Package Tesseract

Tesseract.dll (x64, x86) ve varsayılan olarak İngilizce (eng ile başlayan dosyalar) için dil dosyaları gelecektir. Türkçe için buradaki adresten güncel dil paketlerini indirerek İngilizce dil dosyaları yanına kopyalayabilirsiniz. Buradaki adresten ise C# örnek projesine ulaşabilirsiniz. Burada masaüstü ve web projesi olarak 2 farklı örnek bulabilirsiniz.

Package manager console ile Tesseract’ı kurduğumuzda x64 x86 mimarileri için kütüphaneleri ve  tessdata klasörü ile birlikte varsayılan olarak İngilizce dil dosyalarını yükleyecektir. Türkçe olarak kullanmak içib https://github.com/tesseract-ocr/tessdata adresinden tur.traineddata dosyasını indirerek tessdata klaösrü içerisine atın, eğer kullanmak istediğiniz farklı bir dil varsa o dilin dosyalarınıda indirerek aynı yere kopyalayın.

Şimdi bir sınıf yazalım ve yazacağım metot sayesinde parametre olarak verilen dili ve resim nesnesini string olarak ocr edilmiş halde versin.

using System;
using System.Drawing;
using Tesseract;

namespace mesutpiskin.blog.ocrsample
{
    public enum LANGUAGE
    {
        TURKISH,
        ENGLISH
    }

    public class TesseractOCR
    {
        public static string Doit(Bitmap image, LANGUAGE language)
        {
            string text = "";
            string lng = "eng";
            if (language == LANGUAGE.TURKISH)
                lng = "tur";

            try
            {
                using (var engine = new TesseractEngine(@"./tessdata", lng, EngineMode.Default))
                {
                    using (var img = PixConverter.ToPix(image))
                    {
                        using (var page = engine.Process(img))
                        {

                            using (var iter = page.GetIterator())
                            {
                                iter.Begin();

                                do
                                {
                                    do
                                    {
                                        do
                                        {
                                            do
                                            {


                                                string buffer = iter.GetText(PageIteratorLevel.Word);
                                                if (!(buffer == "" || buffer==null|| buffer == string.Empty || buffer == " "))
                                                {
                                                    text += " " + iter.GetText(PageIteratorLevel.Word);
                                                }


                                                if (iter.IsAtFinalOf(PageIteratorLevel.TextLine, PageIteratorLevel.Word))
                                                {
                                                    if (!(text == " " || text == String.Empty))
                                                    {
                                                        text += " ";
                                                    }

                                                }
                                            } while (iter.Next(PageIteratorLevel.TextLine, PageIteratorLevel.Word));

                                            if (iter.IsAtFinalOf(PageIteratorLevel.Para, PageIteratorLevel.TextLine))
                                            {
                                                if (!(text == "" || text == String.Empty))
                                                {
                                                    text += " ";
                                                }

                                            }
                                        } while (iter.Next(PageIteratorLevel.Para, PageIteratorLevel.TextLine));
                                    } while (iter.Next(PageIteratorLevel.Block, PageIteratorLevel.Para));
                                } while (iter.Next(PageIteratorLevel.Block));
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                text = "";
            }
            return text;
        }
    }
}

.net için tesseract alternatifi bir kaç kütüphane


Microsoft Computer Vision ile OCR işleminin nasıl yapıldığını buradaki yazımdan öğrenebilirsiniz.

Microsoft Cognitive Service, Computer Vision API ile OCR