Yazılımcının Günlüğü | YazilimGunlugu.Com
Arama
Makale Kategorileri
Üye Girişi
Şuanki online üyeler()
Aktif üye bulunmamaktadır.


C# ile OCR(Optical Character Recognition) - VSTO

Yazar: Yasin Sirkecili

Kategori: C#.NET

Eklenme Tarihi: 31.10.2009 07:40:04

Bugünkü konumuz printer, daktilo, fotokopi vb. kağıt halindeki çıktılardan tutunda plaka tanıma sistemlerine kadar uzanan insan hayatını kolaylaştıran en sevdiğim yapay zeka uygulamalarından olan OCR(Optical Character Recognition) uygulamasının C# ile nasıl yapılacağına basitce bakacağız. Amacımız JPG dosyasındaki text verileri tanımlayıp *.txt dosyasına aktaracak bir OCR(Optical Character Recognition) uygulaması gerçekleştirmek.

Herkese merhabalar;

Bugünkü konumuz printer, daktilo, fotokopi vb. kağıt halindeki çıktılardan tutunda plaka tanıma sistemlerine kadar uzanan insan hayatını kolaylaştıran en sevdiğim yapay zeka uygulamalarından olan OCR(Optical Character Recognition) uygulamasının C# ile nasıl yapılacağına basitce bakacağız. Amacımız JPG dosyasındaki text verileri tanımlayıp *.txt dosyasına aktaracak bir OCR(Optical Character Recognition) uygulaması gerçekleştirmek.

İlk olarak projemize COM objesi olan Microsoft Office Document Imaging 12.0 Type Library referansını ekliyoruz. bu referans eklendiğinde MODI adında bir namespace'in kullanılabilir olduğunu göreceksiniz. Bu API Office 2003 ile birlikte geldiğinden Office 2003 veya üstü versiyonlarla kullanabilirsiniz. Ben projemi bir ASP.NET Web uygulaması olarak gerçekleştirdim siz isterseniz Windows Application kullanarak taranan veriyi richtextbox'a aktarabilirsiniz.

uygulamamızın xhtml görünümü şöyledir;

<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div>
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
</div>
</form>

Sadece bir FileUpload ve button kontrolü kullandığımız projenin icrası şu yönde olacaktır; Resim seçildikten sonra eğer jpg formatındaysa resmin adı değiştirilip jpgs diye bir klasöre aktarılacak daha sonra burda OCR işlemi gerçekleştirilecek.

if(FileUpload1.HasFile)
{
stringuzanti = System.IO.Path.GetExtension(FileUpload1.FileName.ToLower().Replace("", "i"));
if(uzanti == ".jpg")
{
stringdosyaadi = DateTime.Now.ToString().Replace(".", "").Replace(":", "").Replace("/", "").Replace("-", "").Replace(" ", "");
dosyaadi += uzanti;
FileUpload1.SaveAs(
HttpContext.Current.Server.MapPath("~/jpgs/"+ dosyaadi));
System.IO.
FileStreamfstream;
System.IO.
StreamWriterswriter;
try
{
MODI.
Documentmdoc = newMODI.Document();
mdoc.Create(
HttpContext.Current.Server.MapPath("~/jpgs/"+ dosyaadi));
mdoc.OCR(MODI.
MiLANGUAGES.miLANG_TURKISH, true, true);
MODI.
Imagemimg = mdoc.Images[0] asMODI.Image;
fstream =
newSystem.IO.FileStream(HttpContext.Current.Server.MapPath("~/yasin.txt"), System.IO.FileMode.OpenOrCreate);
swriter =
newSystem.IO.StreamWriter(fstream);
swriter.Write(mimg.Layout.Text);
swriter.Close();
fstream.Close();
}
catch
{
ScriptManager.RegisterStartupScript(Page, typeof(string), Guid.NewGuid().ToString(), "alert('Hata olutu');", true);
}
}
else
{
ScriptManager.RegisterStartupScript(Page, typeof(string), Guid.NewGuid().ToString(), "alert('.jpg formatında bir dosya seçiniz.');", true);
}
}
else
{
ScriptManager.RegisterStartupScript(Page, typeof(string), Guid.NewGuid().ToString(), "alert('Dosya seçmediniz.');", true);
}

Kodlarımızı açıklayacak olursak;

İlk olarak System.IO.Path sınıfı altındaki getextension fonksiyonundan faydalanarak aktarılan dosyanın .jpg uzantısına sahip olup olmadığını kontrol ediyoruz. Daha sonra bu dosyayı jpgs adında oluşturduğumuz klasöre aktarıyoruz.(Dosya adının çakışmasını engellemek için tarihe göre isim değiştiriyoruz) Sonrasında Jpg file içerisinde taranan karakterleri *.txt dosyasına aktarmamızı sağlayacak olan filestream ve streamwriter classlarından birer instance yaratıyoruz.

MODI.Documentmdoc = newMODI.Document();

ile mdoc adında MODI.Document classından OCR işleminde kullanacağımız yeni bir instance türettik.

mdoc nesnesinin Create fonksiyonunu kullanarak parametre olarak taranacak jpg dosyasının yolunu belirtiyoruz.

mdoc nesnesinin sahip olduğu en önemli fonksiyonumuz olan OCR fonksiyonuna gönderdiğimiz parametrelerle tarama işleminin sonuçlanmasını sağlıyoruz. Burdaki parametrelere ait açıklamalar şöyledir;

1 -) LangId : MODI.MiLANGUAGES enum değişkeninde tanımlanan karakter setlerinden size uygun olanı seçmenizi sağlar.
2- ) OCROrientImage : Sayfanın yatay veya dikey olup olmadığının API tarafından algılanmasını sağlayan boolean tipli bir değerdir.
3- ) OCRStraightenImage :  API tarafından image üzerindeki karakter tanımayı engelleyici eğimlerin otomatik olarak düzenmesine karar veren  boolean tipli değişkendir.

daha sonra MODI.Image tipinde oluşturduğumuz mimg nesnemize mdoc içerisindeki resimlerden istediğimizi aktarıyoruz.(Biz tek bir resim üzerinde işlem yaptığımızdan 0 index'ine sahip resmi aktardık)

bu işlemleri tamamladıktan sonra taranan ve karakter haline çevrilen verileri yasin.txt dosyasına yazarak filestream, streamwriter nesnelerinden türettiğimiz instance'ları Close(); methoduyla sonlandırarak jpg file içerisindeki karakterlerin yasin.txt dosyasına aktardığını gözlemleyebiliriz.

OCR işlemlerinin en basit hali bu şekilde uygulanabilir, dilerseniz siz daha detaylı OCR uygulamaları geliştirebilirsiniz.

Tüm yazılımcı arkadaşlara mutlu günler dilerim...

iyi çalışmalar,
Yasin SİRKECİLİ

Yazar Hakkında Yorum Yok Yorum Yaz Yazara ait diğer Makaleler
Tema
Anket
Visual Studio 2010 Beta 2'yi denediniz mi?


En Çok Okunan Makaleler
En Son Eklenen Makaleler
Soru Merkezinde Bekleyenler
Ana Sayfa | Hakkımızda | Editörler | Yazarlar | RSS RSS | İletişim
Yazılım Günlüğü 2007-2009 © Tüm Hakları Saklıdır.