21 Ekim 2017 Cumartesi

Raspberry'de Python ile Tesseract OCR Kullanarak Plaka Okuma

OCR (Optical Character Recognition - Optik Karakter Tanıma),  bize grafiksel dosyalardaki yazıları yakalama imkanı veren teknolojidir. Örneğin, kameraya yakalanan kırmızı ışıkta geçen araçların plakaları bu teknoloji ile tespit edilebilmektedir. Bu yazımızda Raspberry Pi 3 cihazımıza tesseract-ocr programını kurarak, Python ile etkileşime geçip, örnek bir resim dosyasındaki plakayı okuyacağız.

Tesseract komut satırından kullanılabilen OCR aracıdır. Paket yöneticimizi güncelleyerek tesseract-ocr paketini yükleyelim.

sudo apt-get update



sudo apt-get install tesseract-ocr



Doğru kurulduğundan emin olmak için şu komutu çalıştırabiliriz.

tesseract -v


Şimdi örnek bir plaka resmi indirip tesseract programını komut satırından deneyelim. Aşağıdaki dosyayı plaka.jpg olarak kaydedelim.


Komut satırından tesseract programını örnek dosyamızı parametre vererek çağıralım. Sonucu komut satırına basması için stdout parametresini ekleyelim.

tesseract plaka.jpg stdout


Aslında baştaki TR kısmını okumaması işimize gelse de işimizi şansa bırakmamalıyız. tesseract'a resimleri vermeden önce image processing tekniklerini kullanarak işlemden geçirip, okunması gereken yazıyı daha belirgin hale getirmemiz gerektiğini not olarak düşelim.

Şimdi de Python ile tesseract'a resim okutalım. Resim işlemleri için Pillow, tesseract ile etkileşime geçmek için pytesseract kütüphanesini kurmamız gerekmektedir.

sudo pip install pillow
sudo pip install pytesseract


"plaka.jpg" isimli dosyayı okuyup içerisindeki yazıyı ekrana basan aşağıdaki Python kodunu "simple_ocr_plaka.py" isimli bir dosyaya kaydedelim.


Kodu çalıştırıp çıktısına bakalım:

python simple_ocr_plaka.py


Böylece, OCR teknolojisine temel bir giriş yapmış olduk. Gerçek hayat senaryolarında okunacak görüntü dosyaları bu kadar açık net ve basit olmayacaktır. Başarılı sonuç alabilmek için OpenCV kütüphanesi kullanarak, araçların plakaları tespit edilip, netlik ayarlamaları yapılmalı, görüntüdeki pürüzler giderilmelidir.





7 Ekim 2017 Cumartesi

GeoJSON ile Daire ve Yay Çizme

GeoJSON, çeşitli coğrafik şekilleri tanımlamaya yarayan JSON tabanlı bir standarttır. Standardı detaylı incelediğimizde, tanımlı şekiller arasında dairenin bulunmadığını görüyoruz. Peki, dairesel çizim ihtiyacını nasıl karşılayabiliriz? 
Bu yazımızda, yeni geliştirdiğimiz ultimate-geojson java kütüphanesini kullanarak nasıl dairesel çizim elde edilebileceği konusu üzerinde duracağız. 

Biraz Matematik

Bir düzlemde bir noktaya eşit uzaklıktaki sonsuz noktalar kümesine çember diyoruz. Bu çemberin içinde kalan alana da daire diyoruz. Sonsuz noktayı hesaplamak ve tutmak şu anki teknolojide pek mümkün olmadığından, çember üzerinde kabul edilebilir çoklukta nokta bularak mükemmel olmasa da dairesel çizimler elde etmek mümkün olmaktadır.
İhtiyacımız olan, merkez noktası olarak aldığımız bir koordinatın, belirli bir yarıçap mesafe uzaklıktaki noktasının koordinatını bulmak. Bunu 360 farklı açı için tekrarlarsak, bulduğumuz 360 nokta ile bir daire temsil eder hale gelebiliriz.
Dünya yüzeyi düz olmadığından alışılageldik trigonometrik hesaplamalar, merkez noktaya yarıçap kadar uzaklıktaki koordinatları bulmakta yetersiz kalmaktadır. Bunun için kütüphanemizde şuradaki dünyanın küreselliğini dikkate alan formülü kullandık.

Pasta Dilimini Nasıl Yapacağız?

Taramak istediğimiz açı aralığını belirledikten sonra, sadece o aralıkta kalan noktaları bularak, yay çizimini elde edebiliriz. 

Show me the code!

ultimate-geojson kütüphanesi kullanarak, hesaplamalara elinizi bulaştırmadan dairesel çizim elde edebilirsiniz. 

CircularDrawingAlgorithmImpl circleDrawer = new CircularDrawingAlgorithmImpl();
List<PositionDto> circlePoints = circleDrawer.getCirclePositions(new PositionDto(35,38), 10000.0);
  
UltimateGeoJSONFactory factory = new UltimateGeoJSONFactory();
PolygonDto circleAsPolygon = factory.createPolygon(circlePoints);

String geoJSON = UltimateGeoJSONBuilder.getInstance().toGeoJSON(circleAsPolygon);
 Üretilen GeoJSON'ı herhangi bir GeoJSON viewer'da deneyebilirsiniz. (örneğin: http://geojson.io/
.

Yay çizimi de benzer bir şekilde, fakat yayın başlangıç ve bitiş açıları verilmek suretiyle çizilebilmektedir.
CircularDrawingAlgorithmImpl circleDrawer = new CircularDrawingAlgorithmImpl();
PositionDto center = new PositionDto(35,38);
List<PositionDto> arcPositions = circleDrawer.getArcPositions(center, 10000, 0, 45);
  
UltimateGeoJSONFactory factory = new UltimateGeoJSONFactory();
PolygonDto polygon = factory.createPolygon(arcPositions);
  
String geoJSON = UltimateGeoJSONBuilder.getInstance().toGeoJSON(polygon);


DEMO


SSHJ ile Raspberry'de Uzaktan Python Çalıştırmak

Merhabalar, Bu yazımızda, Java ile uzaktaki bir makineye programatik olarak SSH ile bağlanıp Python kod çalıştırmayı göreceğiz. Örnek olarak...