Resimde gördüğünüz kod basit denecek bir resim ve renklerin çözümlenmesi çok kolay.
İşlemlere başlamadan önce de OCR kavramına biraz bakmak da önemli.Buradaki linkten http://office.microsoft.com/tr-tr/help/HP003081255.aspx nasıl bir şey olduğu ile ilgili kafanızda birşeyler belirebilir.
Resim doğrulama kodu için ben 3 aşamalı bir uygulama geliştirdim ve bunlar
- C# Webbrowser nesnesi ile resmi download etmek.
- Resmi yeniden renklendirmek
- OCR ile resim üzerinden okuma işlemini yapmak
Şimdi adımları açılayarak neden gerekli ve nasıl işlediğini görücez arkadaşlar.
1.C# Webbrowser nesnesi ile resmi download etmek.
Bu işlemi resim üzerinde oynama yapabilmek için yapıyoruz webbrowserda açılan sayfadaki resim doğrulama kodunu (captchayı) indirme işlemi ile başlıyoruz.
public void GetCaptcha(string URL)
{
IHTMLDocument2 wbDocument = (IHTMLDocument2)Browser4A4B.Document.DomDocument;
IHTMLControlRange imageRange = (IHTMLControlRange)((HTMLBody)wbDocument.body).createControlRange();
foreach (IHTMLImgElement img in wbDocument.images)
{
imageRange.add((IHTMLControlElement)img);
imageRange.execCommand("Copy", false, null);
using (Bitmap bmp = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap))
{
bmp.Save(string.Format("{0}\\guvenlikResmi.bmp", Application.StartupPath));
}
}
}
Yukarıdaki örnek kod bize resmi getiriyor ve programın çalıştığı dizine resmi kaydediyor. İlk adımımızı böyle sonlandırıyoruz.
2.Resmi yeniden renklendirmek
Bu bölümde daha önceden resmi siyah beyaz yapma işlemi ile ilgili makalemdeki kodlardan faydalandım aslında.tek fark birazcık değişiklik yaptım üzerinde.
private string GunvenlikKoduDuzenle(string resimYolu)
{
try
{
bmp = new Bitmap(resimYolu);
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width;
x++)
{
Color eski = bmp.GetPixel(x, y);
int ortalama = (eski.R + eski.G
+ eski.B) / 3;
Color yeni = eski;
if (ortalama <= 50)
yeni = Color.White;
else
yeni = eski;
bmp.SetPixel(x, y,
yeni);
}
for (int x = 0; x < bmp.Width;
x++)
{
Color eski = bmp.GetPixel(x, y);
int ortalama = (eski.R + eski.G
+ eski.B) / 3;
Color yeni = Color.White;
if (ortalama != 255)
yeni = Color.Black;
bmp.SetPixel(x, y,
yeni);
}
}
pictureBox2.Image = bmp;
bmp.Save(resimYolu.Replace(".bmp", string.Empty) + "Temiz.bmp");
return resimYolu.Replace(".bmp", string.Empty) + "Temiz.bmp";
}
catch
{
return string.Empty;
}
}
Bu bölümde dikkat etmemiz gereken 2 bölüm var.1. bölüm ilk for döngüsü için geçerli bu bölümde pixel pixel tarama var ve pixelin RGB değerini alıp ortalamasını buluyor.Bu ortalama ile de pixelin siyaha yakın olma durumunu anlıyoruz ve siyah renkteki arka planı beyaz yapıyoruz.2. bölümü ise geri kalan yazı kısmını birden fazla renk olduğu için tek renk siyaha çevirme işlemi. Bu işlemleri yapma amacımsa OCR için daha net ve basit bir resim oluşturmak. Çünkü bu yöntemi kullansam da OCR ile %100 çevirme işlemi olamayabiliyor.
3.OCR ile resim üzerinden okuma işlemini yapmak
MODI.Document modiDocument;
private string GuvenlikResmiIceriginiAl(string dosyaYolu)
{
try
{
modiDocument.Create dosyaYolu);
modiDocument.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
foreach (MODI.Image insImage in modiDocument.Images)
{
MODI.Layout insLayout =
insImage.Layout;
return insLayout.Text;
}
modiDocument.Close(false);
return string.Empty;
}
catch (Exception ex)
{
SystemStatics.HataYakala(ex);
return string.Empty;
}
}
Son bölümde ise oluşturduğum resmi Office içinde olan OCR yi kullanarak. Çıkan sonucu return ederek alıyorum. Burdaki unutulmaması gereken bir husus da MODI referansını projeye eklemek.
Bu yöntem ile bu tarzdaki resimleri %75 oranında çözümleyebiliyorum. Umarım sizin de işinize yarar. Okuduğunuz için teşekkürler.
tebrikler
YanıtlaSilHocam c#ta yazdığımda 'IHTMLDocument2' hata veriyor. Projeyi atabilirmisiniz inceliyim.
YanıtlaSilMalesef arkadaş çok üşengeç Mshtml.dll projenize ekleyiniz
YanıtlaSilyahu resmi download adiyorsunda adilen resim güvenlik resmi değilki ilk image neyse onu alır
YanıtlaSilBu yorum yazar tarafından silindi.
YanıtlaSilMerhaba "hocam peki şöyle birşey mümkünmüdür pc ekranındaki sectiğimiz bir bölgeyi anlık olarak okuması ? " şeklinde bir soru sormuşsun.Öncesinde ekran görüntüsünü yakalayım bir yere kaydedersen yada direk streamden direk işlem yapabilirsin. Ancak bu yazıda yaptığım şey çok ilkel.OCR üzerine çok çok fazla açık kaynak kodlu kütüphaneler de bulunmakta.O yüzden bu mantaliteyi bir başlangıç gibi kabul edip daha gelişmiş kütüphaneler ile çalışmanı tavsiye ederim.
Silaynı soruyu bende çok araştırdım ancak bulamadım hocam pc ekranındaki siyah beyaz yazıyı çekip klavyeden işletmeyi nasıl yapabiliriz?
SilEkran görüntüsü için güzelce bir google araması yapmalısın, çünkü yerli yabancı birçok kaynak aramalar sonucu karşıma çıktı.Bulduğun kodları kurcalamnı öneririm çünkü çok farklı yöntemlerle insanlar kullanmış.
Silanladım teşekkür ederim
Sil