Makale Özeti

Bu makalemde sizlere Microsoft Document Imaging uygulamasının API'sini kullanarak basit bir OCR uygulamasını nasıl yazabileceğinizden bahsedeceğim. Bu uygulamayı yazarken kullanacağımız API'nin çeşitli metodlarını da inceleyeceğiz.

Makale

Merhabalar,
 
Bu makalemde sizlere Microsoft Document Imaging uygulamasının API'sini kullanarak basit bir OCR uygulamasını nasıl yazabileceğinizden bahsedeceğim. Bu uygulamayı yazarken kullanacağımız API'nin çeşitli metodlarını da inceleyeceğiz.
 
Microsoft Office Document Imaging Microsoft Office 2003 ve sonraki sürümlerinde yer alan ve kısayolu Başlat menüsündeki Office program klasörü altındaki Tools klasöründe bulunan bir uygulamadır. Microsoft Office Document Scanning ile taranmış dökümanların editlenmesi, yeni döküman taranması, taranan dökümanların Word dosyasına çevrilmesi ve döküman içinde metin arama gibi birçok işlemi yapan bir uygulamadır.
 
OCR ingilizce Optical Character Recognition teriminin kısaltmasıdır. Türkçe'ye ise Optik Karakter Tanıma olarak çevirmek uygun olacaktır. OCR çalışma prensibi olarak Örüntü Tanıma (pattern recognition), yapay zeka gibi gelişmiş teknolojilerin bileşkesidir, Image Processing başlığı altında da incelenmektedir. Temelde bilgisayar ortamında bulunmayan genellikle tarayıcı veya fotoğraf makinası gibi bir cihazla resim formatına çevrilmiş yazıların (print çıktısı, el yazısı, daktilo ile yazılmış, basılı yayın organı) resimlerinin bilgisayarda düzenlenebilecek metin dosyaları haline çevrilmesi, sayısallaştırılması olarak tanımlanabilir. Bilgisayar ortamında bahsettiğimiz bu geniş alanın dışında kimi sitelerde bulunan güvenlik resimlerinin kırılması da bu yönteme dayanmaktadır. Bunun bilgisayar ortamından farklı olan örneklerini inceleyeceksek en güzel örneklerinden biri yoldan geçen araçların plakalarının tanımlanmasıdır. Bu uygulama kimi otoparklarda veya EDS gibi sistemlerde kullanılmaktadır. Bir diğer örnek ise kartvizitlerin taranarak Outlook'a aktarıldığı uygulamalar olarak gösterilebilir.

Makaledeki örnek uygulamada bir resim dosyasından resimdeki yazıyı okuyup, form üzerindeki RichTextBox'a yazdıracağız. İlk olarak yapmamız gereken yeni bir proje oluşturup, referans ekleme ekranının COM sekmesindeki Microsoft Office Document Imaging 12.0 Type Library'i projemize referans olarak ekleyelim:

Ardından da uygulama formunu aşağıdaki gibi dizayn edelim:

"..." butonuna tıklayıp, yazısını almak istediğimiz resmi seçeceğiz. Ardından da "Get Text" butonuna tıklayarak dosya yolunu formdaki textbox'a yazdırdığımız resimdeki yazıyı richtextbox'a aktaracağız. Uygulamanın kodu aşağıdaki gibi:

public partial class Form1 : Form
{
        MODI.Document insDocument;
       
public Form1()
        {
            InitializeComponent();
            insDocument = new MODI.Document();
        }

        private void btnGetImage_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
           
if (openFileDialog1.FileName != "")
            {
                txtImagePath.Text = openFileDialog1.FileName;
            }
        }

        private void btnGetText_Click(object sender, EventArgs e)
        {
           
insDocument.Create(txtImagePath.Text);
            insDocument.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
           
foreach (MODI.Image insImage in insDocument.Images)
            {
                MODI.Layout insLayout = insImage.Layout;
                txtImageText.Text = insLayout.Text;
            }
           
insDocument.Close(false);
        }
    }

İlk olarak formun constructor'ında MODI.Document nesnesinin bir instance'ını aldık. btnGetText butonunun click event'inde ise ilk önce instance'ını aldığımız MODI.Document nesnesinin (insDocument) Create metodunu yazısını okuyacağımız resmin yolunu vererek çağırdık. Ardından da resimdeki karakter tanıma işlemini yapacak olan OCR metodunu aşağıdaki parametrelerini vererek çağırıyoruz:

LangId: Karakter tanıma işleminin yapılacağı dilin id'si. MODI.MiLANGUAGES enum'unun değerlerinden biri olabilir.
OCROrientImage: Karakter tanıma işlemi yapılırken sayfanın yatay veya düşey yönelimde olduğunun otomatik olarak algılanıp algılanmayacağı. Default değeri true'dır.
OCRStraightenImage: Karakter tanıma işlemi yapılırken sayfadaki ufak dikey yamuklukların düzeltilip düzeltilmeyeceği. Default değeri true'dır.

Ardından dökümanın içindeki image'lar içinde foreach ile dönerek Image nesnesinin Layout property'sindeki nesneyi yeni oluşturduğumuz MODI.Layout nesnesine atıyoruz. Sonra da formdaki richtextbox'ın Text'ine MODI.Layout nesnesinin Text property'sini atıyoruz. İşimiz bittikten sonra da MODI.Document nesnesinin Close metodunu çağırıyoruz. Şimdi kodu aşağıdaki resim için çalıştırıp deneyelim:

Görüldüğü gibi resimdeki yazıları alma işlemi oldukça başarılı bir şekilde tamamlandı.

Son olarak MODI.Layout nesnesinin iki property'sinden bahsetmek istiyorum. Words property'si taranan resimdeki her kelimenin taşındığı bir array'dir. Yani resimdeki tüm yazıya örnek uygulamada da yaptığımız gibi Layout nesnesinin Text property'si ile erişebilirsiniz. Text içindeki her bir kelimeye erişmeniz gerektiği durumlarda ise Words property'sini kullanabilirsiniz. Words array'i Word tipinde nesneleri taşır. Bahsetmek istediğim ikinci property de Word nesnesinin RecognitionConfidence property'si. Adından da anlaşılabileceği gibi RecognitionConfidence taranan bir kelimenin hatasız taranmış olma olasılığını verir. 0 ile 999 arası integer değer alır.

Umarım faydalı olmuştur.

Işıl Orhanel
www.isilorhanel.net

Download