Automatic License Plate Recognition System - JAVA (Image Processing Algorithm) - 2 (OCR)








import static org.bytedeco.javacpp.opencv_imgproc.*;
import static org.bytedeco.javacpp.opencv_highgui.*;
import static org.bytedeco.javacpp.opencv_core.*;
import static org.bytedeco.javacpp.opencv_video.*;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import net.sourceforge.tess4j.ITessAPI;
import net.sourceforge.tess4j.Tesseract1;
import net.sourceforge.tess4j.TesseractException;

import org.bytedeco.javacpp.Loader;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_core.CvMemStorage;
import org.bytedeco.javacpp.opencv_core.CvRect;
import org.bytedeco.javacpp.opencv_core.CvScalar;
import org.bytedeco.javacpp.opencv_core.CvSeq;
import org.bytedeco.javacpp.opencv_core.IplConvKernel;
import org.bytedeco.javacpp.opencv_core.IplImage;
import org.bytedeco.javacpp.opencv_highgui;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;



public class plakaOcr {
String yeni="",Result="",PlakaMetin="",ters="";
IplImage griPlaka,roiCikis,gray_roi,HarfroiCikis,Harfgray_roi,PlakaAlani;

 public String getYeni() {
 return yeni;
}

public void setYeni(String yeni) {
 this.yeni = yeni;
}

public String getTers() {
 return ters;
}

public void setTers(String ters) {
 this.ters = ters;
}

 public plakaOcr()throws InterruptedException{
  CanvasFrame plakaFrame = new CanvasFrame("İlk plaka");
  CanvasFrame KeranarıTemiz = new CanvasFrame("Kernarı Temiz plaka");
  CanvasFrame OCRAlani = new CanvasFrame("OCR alanı plaka");
  CanvasFrame bulunanAlan = new CanvasFrame("Bulunan Char plaka");
  CanvasFrame filter = new CanvasFrame("Filter plaka");
 int kernelSize =3;
 int KernelAnchorOffset=1;
 IplConvKernel morfo2=cvCreateStructuringElementEx(kernelSize, kernelSize, KernelAnchorOffset, KernelAnchorOffset, CV_SHAPE_RECT);
 IplConvKernel morfo = IplConvKernel.create(3, 3,1, 1, CV_SHAPE_RECT,null);
 IplImage plaka = cvLoadImage("plaka.jpg");
 plakaFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 plakaFrame.showImage(plaka);
 PlakaAlani = IplImage.create(300, 70, plaka.depth(), plaka.nChannels());
 griPlaka = IplImage.create(PlakaAlani.width(), PlakaAlani.height(),IPL_DEPTH_8U, 1);
 cvResize(plaka, PlakaAlani);
 cvCvtColor(PlakaAlani, griPlaka, CV_BGR2GRAY);
 cvAdaptiveThreshold(griPlaka, griPlaka, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 15, 5);
 cvSmooth(griPlaka, griPlaka, CV_MEDIAN, 7, 7, 1, 1);
 cvMorphologyEx(griPlaka, griPlaka,null, morfo, CV_MOP_OPEN,1);
 cvSmooth(griPlaka, griPlaka, CV_MEDIAN, 5, 5, 1, 1);
 cvEqualizeHist(griPlaka, griPlaka); 
 
 filter.showImage(griPlaka);
 
 CvMemStorage mem = opencv_core.CvMemStorage.create();
 CvSeq contours = new opencv_core.CvSeq();
 CvSeq ptr = new opencv_core.CvSeq();
 cvFindContours(griPlaka, mem, contours,
   Loader.sizeof(opencv_core.CvContour.class), CV_RETR_EXTERNAL,
   CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));

 CvRect boundbox =null;
 int i = 0;
 ArrayList<CvRect> HarfAlani = new ArrayList<CvRect>();
 ArrayList<CvRect> YaziAlani = new ArrayList<CvRect>();
 for (ptr = contours; ptr != null; ptr = ptr.h_next()) {
  boundbox = cvBoundingRect(ptr, 0);
  
  if (boundbox.width() * boundbox.height() >5000 && boundbox.width() * boundbox.height() < 20000) {
    YaziAlani.add(i,boundbox);
    i=i+1;  
    
    }
 }
 opencv_core.cvClearMemStorage(mem);
 contours = null;
 ptr = null;
 
 CvMemStorage Harfmem = opencv_core.CvMemStorage.create();
 CvSeq Harfcontours = new opencv_core.CvSeq();
 CvSeq Harfptr = new opencv_core.CvSeq(); 
 
 try {
  opencv_core.cvSetImageROI(PlakaAlani,cvRect(YaziAlani.get(0).x(), YaziAlani.get(0).y(),
    YaziAlani.get(0).width(),
    YaziAlani.get(0).height()));
  
  roiCikis = IplImage.create(cvGetSize(PlakaAlani),PlakaAlani.depth(), PlakaAlani.nChannels());
  cvCopy(PlakaAlani, roiCikis);
  cvResetImageROI(PlakaAlani);
  gray_roi = IplImage.create(roiCikis.width(),roiCikis.height(), IPL_DEPTH_8U, 1);
  cvCvtColor(roiCikis, gray_roi, CV_BGR2GRAY);
  cvAdaptiveThreshold(gray_roi, gray_roi, 255, CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY, 15, 5);
  cvSmooth(gray_roi, gray_roi, CV_MEDIAN, 7, 7,1,1);
  cvMorphologyEx(gray_roi, gray_roi,null, morfo2, CV_MOP_OPEN,1);
  cvSmooth(gray_roi, gray_roi, CV_MEDIAN, 5, 5, 1, 1);
  cvEqualizeHist(gray_roi, gray_roi); 
  cvCanny(gray_roi, gray_roi, 200, 200);
  KeranarıTemiz.showImage(gray_roi);
  cvFindContours(gray_roi, Harfmem, Harfcontours,
    Loader.sizeof(opencv_core.CvContour.class), CV_RETR_TREE,
    CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));
  
  CvRect Harfboundbox =null;
  int j = 0;
  for (Harfptr = Harfcontours; Harfptr != null; Harfptr = Harfptr.h_next()) {
            Harfboundbox = cvBoundingRect(Harfptr, 0);
            if ((Harfboundbox.height() > 20)&&(Harfboundbox.width()>12) && Harfboundbox.width() * Harfboundbox.height() < 3000){
    HarfAlani.add(j,Harfboundbox);
     j=j+1;
     cvRectangle(
       PlakaAlani,
       cvPoint(Harfboundbox.x(), Harfboundbox.y()),
       cvPoint(Harfboundbox.x() + Harfboundbox.width(),
         Harfboundbox.y() + Harfboundbox.height()),
       cvScalar(225, 0, 0, 0), 2, 8, 0);
     
   }
   }
  bulunanAlan.showImage(PlakaAlani);
  int height =0;
  for(int h=0;h<HarfAlani.size();h++){
   height +=HarfAlani.get(h).height();
  }
  if(HarfAlani.size()>0){
  int ortalama =height/HarfAlani.size();
  for(int h=0;h<HarfAlani.size();h++){
   if(HarfAlani.get(h).height()<ortalama-1){
    HarfAlani.remove(h);
   }
  }
  }
  opencv_core.cvResetImageROI(gray_roi);
  opencv_core.cvResetImageROI(PlakaAlani);
  Collections.sort(HarfAlani,Main.Sirala);
  OCRAlani.showImage(roiCikis);
 for(int h=0;h<HarfAlani.size();h++){
  
  opencv_core.cvSetImageROI(roiCikis,cvRect(HarfAlani.get(h).x()-3, HarfAlani.get(h).y()-3,
    HarfAlani.get(h).width()+3,
    HarfAlani.get(h).height()+6));
  HarfroiCikis = IplImage.create(cvGetSize(roiCikis),roiCikis.depth(), roiCikis.nChannels());
  cvCopy(roiCikis, HarfroiCikis);
  cvResetImageROI(roiCikis);
  Harfgray_roi = IplImage.create(HarfroiCikis.width(),HarfroiCikis.height(), IPL_DEPTH_8U, 1);
  cvCvtColor(HarfroiCikis, Harfgray_roi, CV_BGR2GRAY);
  cvAdaptiveThreshold(Harfgray_roi, Harfgray_roi, 255,CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 15, 5);
  cvSmooth(gray_roi, gray_roi, CV_MEDIAN, 7, 7,3,3);
  int zero = cvCountNonZero(Harfgray_roi);
  //System.out.println(zero);
  if(zero<600){
   cvDilate(Harfgray_roi, Harfgray_roi,morfo2,1);
  // cvThreshold(Harfgray_roi, Harfgray_roi, 0, 255, CV_THRESH_BINARY  | CV_THRESH_OTSU);
   cvErode(Harfgray_roi, Harfgray_roi,morfo2,1);
   //System.out.println("Girdi..");
  
  }
  cvMorphologyEx(Harfgray_roi, Harfgray_roi, null, morfo2, CV_MOP_CLOSE, 1);
  cvSaveImage("harfler/"+h+"_harf.jpg", Harfgray_roi);
  // System.setProperty("jna.library.path","c:/javacv-bin/Tess4J/");
  Tesseract1 instance = new Tesseract1();
  instance.setLanguage("leu");
  instance.setPageSegMode(ITessAPI.TessPageSegMode.PSM_SINGLE_CHAR);
  BufferedImage harfGrayBufferedImage =Harfgray_roi.getBufferedImage();
  try {
   Result = instance.doOCR(harfGrayBufferedImage);
   PlakaMetin += Result;
   //System.out.println("Bulunan Textler: " + Result);
    } catch (TesseractException e) {
   System.err.println("Tesseract hatasi alindi."+ e.getMessage());
  }
  
 }
 }catch(Exception e){
  System.out.println(e);
  
 }
  
  try{
  yeni = PlakaMetin.replaceAll("\n", "");
  }catch(Exception e){
   System.out.println("yazacak bir şey bulunamadı...");
   yeni="";
  }
  PlakaMetin="";
  opencv_core.cvClearMemStorage(Harfmem);
  Harfcontours = null;
  Harfptr = null;
  System.out.println(yeni);
  //JOptionPane.showMessageDialog(null, yeni);
  }
  
  public static Comparator<CvRect> Sirala =new Comparator<CvRect>() {
   
   public int compare(CvRect a,CvRect b){
   int satirNo1 = a.x();
   int satirNo2 = b.x();
   
   return satirNo1 - satirNo2; //A'dan z ye
  }};
  public static void main(String args[]) throws InterruptedException{
   new plakaOcr();
  }
}




Yorumlar

  1. Hello, I want download project, you can send to mail alovndev@gmail.com

    I run error

    run:
    Exception in thread "main" java.lang.UnsatisfiedLinkError: no jniopencv_core in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:1191)
    at org.bytedeco.javacpp.Loader.load(Loader.java:953)
    at org.bytedeco.javacpp.Loader.load(Loader.java:854)
    at org.bytedeco.javacpp.opencv_core.(opencv_core.java:10)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.bytedeco.javacpp.Loader.load(Loader.java:913)
    at org.bytedeco.javacpp.Loader.load(Loader.java:854)
    at org.bytedeco.javacpp.opencv_imgproc.(opencv_imgproc.java:12)
    at com.teamvietdev.view.Exam.(Exam.java:68)
    at com.teamvietdev.view.Exam.main(Exam.java:234)
    Caused by: java.lang.UnsatisfiedLinkError: no opencv_core249 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:1191)
    at org.bytedeco.javacpp.Loader.load(Loader.java:940)
    ... 9 more

    YanıtlaSil

Yorum Gönder