Java ve Tesseract ile OCR işlemleri ve Kimlik Kartı Üzerindeki TC Kimlik No Alanının OCR ile Okunması

Bulent Bozdemir
turkcell
5 min readDec 24, 2023

--

Tesseract OCR, 100'den fazla dili destekleyen ve image üzerindeki karakterleri metin olarak tanıyan çok popüler open source bir OCR (Optical Character Recognation) tooludur.

Bugün yeni TC kimlik kartı üzerindeki TC kimlik numarası bilgisini Java ve Tesseract kullanarak text olarak okuyacağız.

Öncelikle Eclipse’de yeni bir proje oluşturuyoruz. Eğer Maven projesi oluşturduysak pom.xml dosyasında aşağıdaki dependency leri tanımlıyoruz. Eğer Maven projesi değilse linkten Tess4J API’sini indirmeliyiz.

 <dependencies>  
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>3.4.4</version>
</dependency>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>tesseract.ocr.example</groupId>
<artifactId>OCRExample</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>OcrExample Maven Webapp</name>
<url>http://maven.apache.org</url>

<dependencies>
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>3.4.4</version>
</dependency>
</dependencies>

<build>
<finalName>OCRExample</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>

<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
</project>

Daha sonra indirdiğimiz api’den tessdata klasörünü ve traineddata dosyalarını /src/main/resources klasörüne eklemeliyiz.

Proje klasöründe src\main\resources klasörü altında test_img isimli bir klasör oluşturup test için kullanacağımız yeni kimlik image dosyasını buraya kopyaladım. İnternetten bulduğum aşağıdaki örnek kimlik kartındaki TC kimlik numarası alanını okuyacağız. Aşağıdaki görseli tc-identity-karti-01.jpg adı altında test_img klasörüne kaydettim.

TestOCR isminde yeni bir class oluşturup src/main/resources/test_img/tc-identity-karti-01.jpg klasöründeki kimlik imajını Tesseract objesini kullanarak aşağıdaki gibi okuyoruz ve ardından Tesseract datapath ayarlarını yapıyoruz. Dosyaları src/main/resources/tessdata altına koyuyoruz.

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

public class TestOCR {

public static void main(String[] args) {
BufferedImage bufferedImage;
try {
bufferedImage = ImageIO.read(new File("src/main/resources/test_img/tc-kimlik-karti-01.jpg")); //ocr yapilacak dosya path , proje directory test_img directory icinde
Tesseract tesseract = new Tesseract(); // JNA Interface Mapping
tesseract.setDatapath("src/main/resources/tessdata"); //tesseract data path

Daha sonra görselden kimlik üzerinde TC kimlik numarasının yazıldığı yeri croplayarak alıyoruz ve src/main/resources/test_img/ klasörüne ocr_area.jpg dosya adı ile kaydediyoruz.

 public static void main(String[] args) {
BufferedImage bufferedImage;
try {
bufferedImage = ImageIO.read(new File("src/main/resources/test_img/tc-kimlik-karti-01.jpg")); //ocr yapilacak dosya path , proje directory test_img directory icinde
Tesseract tesseract = new Tesseract(); // JNA Interface Mapping
tesseract.setDatapath("src/main/resources/tessdata"); //tesseract data path

//yeni kimlik - tckimlik no yazan yeri kesip aliyoruz
int xRectangle = (int) Math.round(bufferedImage.getWidth() * 0.02);//kimlikteki tckimlik no ile ilgili yerin x koordinatı
int yRectangle = (int) Math.round(bufferedImage.getHeight() * 0.225);//kimlikteki tckimlik no ile ilgili yerin y koordinatı
int widthRectangle = (int) Math.round(bufferedImage.getWidth() * 0.35);//kimlikteki tckimlik no ile ilgili yerin yatay buyuklugu
int heightRectangle = (int) Math.round(bufferedImage.getHeight() * 0.10);//kimlikteki tckimlik no ile ilgili yerin dikey buyuklugu
BufferedImage tcknImg = bufferedImage.getSubimage(xRectangle, yRectangle, widthRectangle, heightRectangle); //kimlikteki tckimlik no yazan yerin image

File outputfiletckn = new File("src/main/resources/test_img/ocr_area.jpg");//tckimlikno ile ilgili ocr yaptığımız parçayı proje test_img directory icinde ocr_area.jpg ismiyle kaydettik
ImageIO.write(tcknImg, "jpg", outputfiletckn);

İşlem sonrasında kimlik üzerinde TC kimlik numarasının yazıldığı yerin görseli aşağıdaki gibidir.

Daha sonra bu TC kimlik numarasının bulunduğu görseli siyah beyaza dönüştürüp ocr_area_black_and_white.jpg dosya adı ile src/main/resources/test_img/ klasörüne kaydediyoruz.

 public static void main(String[] args) {
BufferedImage bufferedImage;
try {
bufferedImage = ImageIO.read(new File("src/main/resources/test_img/tc-kimlik-karti-01.jpg")); //ocr yapilacak dosya path , proje directory test_img directory icinde
Tesseract tesseract = new Tesseract(); // JNA Interface Mapping
tesseract.setDatapath("src/main/resources/tessdata"); //tesseract data path

//yeni kimlik - tckimlik no yazan yeri kesip aliyoruz
int xRectangle = (int) Math.round(bufferedImage.getWidth() * 0.02);//kimlikteki tckimlik no ile ilgili yerin x koordinatı
int yRectangle = (int) Math.round(bufferedImage.getHeight() * 0.225);//kimlikteki tckimlik no ile ilgili yerin y koordinatı
int widthRectangle = (int) Math.round(bufferedImage.getWidth() * 0.35);//kimlikteki tckimlik no ile ilgili yerin yatay buyuklugu
int heightRectangle = (int) Math.round(bufferedImage.getHeight() * 0.10);//kimlikteki tckimlik no ile ilgili yerin dikey buyuklugu
BufferedImage tcknImg = bufferedImage.getSubimage(xRectangle, yRectangle, widthRectangle, heightRectangle); //kimlikteki tckimlik no yazan yerin image

File outputfiletckn = new File("src/main/resources/test_img/ocr_area.jpg");//tckimlikno ile ilgili ocr yaptığımız parçayı proje test_img directory icinde ocr_area.jpg ismiyle kaydettik
ImageIO.write(tcknImg, "jpg", outputfiletckn);

//yeni kimlik - tckimlik no yazan yeri kesip aldıktan sonra siyah beyaza ceviriyoruz.
BufferedImage tcknImgBlackNWhite = new BufferedImage(tcknImg.getWidth(),tcknImg.getHeight(), BufferedImage.TYPE_BYTE_BINARY);//kimlikteki tckimlik no yazan yerin image ı siyah beyaza ceviriyoruz
Graphics2D graphic = tcknImgBlackNWhite.createGraphics();
graphic.drawImage(tcknImg, 0, 0, Color.WHITE, null);
graphic.dispose();

File outputfiletcknBlackNWhite = new File("src/main/resources/test_img/ocr_area_black_and_white.jpg");//tckimlikno ile ilgili ocr kısmı siyah beyaz yapıp test_img directory icinde ocr_area_black_and_white.jpg ismiyle kaydettik
ImageIO.write(tcknImgBlackNWhite, "jpg", outputfiletcknBlackNWhite);

İşlemden sonra siyah beyaza dönüştürülen image dosyası aşağıdaki gibidir.

Kodumuzun sonunda kesip siyah beyaza çevirdiğimiz image ı tesseract.doOCR metodu ile OCR yapıyoruz.

            String textBlackNWhite = tesseract.doOCR(tcknImgBlackNWhite);//sadece tckimlikno yazan yerin siyah beyaz ocr yaptık
System.out.println(textBlackNWhite);//output yazdı

console çıktısında TC kimlik numarasının 22345678902 olarak tanındığını görüyoruz.

Kodumuzun tamamı aşağıdaki gibidir.

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

public class TestOCR {

public static void main(String[] args) {
BufferedImage bufferedImage;
try {
bufferedImage = ImageIO.read(new File("src/main/resources/test_img/tc-kimlik-karti-01.jpg")); //ocr yapilacak dosya path , proje directory test_img directory icinde
Tesseract tesseract = new Tesseract(); // JNA Interface Mapping
tesseract.setDatapath("src/main/resources/tessdata"); //tesseract data path

//yeni kimlik - tckimlik no yazan yeri kesip aliyoruz
int xRectangle = (int) Math.round(bufferedImage.getWidth() * 0.02);//kimlikteki tckimlik no ile ilgili yerin x koordinatı
int yRectangle = (int) Math.round(bufferedImage.getHeight() * 0.225);//kimlikteki tckimlik no ile ilgili yerin y koordinatı
int widthRectangle = (int) Math.round(bufferedImage.getWidth() * 0.35);//kimlikteki tckimlik no ile ilgili yerin yatay buyuklugu
int heightRectangle = (int) Math.round(bufferedImage.getHeight() * 0.10);//kimlikteki tckimlik no ile ilgili yerin dikey buyuklugu
BufferedImage tcknImg = bufferedImage.getSubimage(xRectangle, yRectangle, widthRectangle, heightRectangle); //kimlikteki tckimlik no yazan yerin image

File outputfiletckn = new File("src/main/resources/test_img/ocr_area.jpg");//tckimlikno ile ilgili ocr yaptığımız parçayı proje test_img directory icinde ocr_area.jpg ismiyle kaydettik
ImageIO.write(tcknImg, "jpg", outputfiletckn);

//yeni kimlik - tckimlik no yazan yeri kesip aldıktan sonra siyah beyaza ceviriyoruz.
BufferedImage tcknImgBlackNWhite = new BufferedImage(tcknImg.getWidth(),tcknImg.getHeight(), BufferedImage.TYPE_BYTE_BINARY);//kimlikteki tckimlik no yazan yerin image ı siyah beyaza ceviriyoruz
Graphics2D graphic = tcknImgBlackNWhite.createGraphics();
graphic.drawImage(tcknImg, 0, 0, Color.WHITE, null);
graphic.dispose();

File outputfiletcknBlackNWhite = new File("src/main/resources/test_img/ocr_area_black_and_white.jpg");//tckimlikno ile ilgili ocr kısmı siyah beyaz yapıp test_img directory icinde ocr_area_black_and_white.jpg ismiyle kaydettik
ImageIO.write(tcknImgBlackNWhite, "jpg", outputfiletcknBlackNWhite);

String textBlackNWhite = tesseract.doOCR(tcknImgBlackNWhite);//sadece tckimlikno yazan yerin siyah beyaz ocr yaptık
System.out.println(textBlackNWhite);//output yazdı
} catch (TesseractException | IOException e) {
e.printStackTrace();
}
}

}

Umarım yazıyı beğenmişsinizdir.

--

--