import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Base64; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.imageio.ImageIO; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.MatOfFloat; import org.opencv.core.MatOfInt; import org.opencv.imgproc.Imgproc; import com.pennant.cob.beans.OCRReqBean; import com.pennant.cob.beans.OCRResBean; import com.pennant.cob.service.impl.OCRServiceImpl; import com.pennant.common.logging.PennantLoggerComponent; import net.sourceforge.tess4j.ITesseract; import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.Word; public class CV { private static String docType = null; private static boolean flag = true; private static String fileName; private static File aadhaarFile = new File("D:/OCR Images/Aadhaar1.jpg"); private static File panFile = new File("D:/OCR Images/PAN6.jpg"); private static String panFile1 = "D:/OCR Images/PAN_UP_1.jpg"; private static String panFile2 = "D:/OCR Images/PAN4.jpg"; private static File chequeFile1 = new File("D:/OCR Images/cheque1.jpg"); private static File chequeFile2 = new File("D:/OCR Images/cheque2.jpg"); private static File dummyFile = null; /* * String Contants for Doc Types */ private static final String CHEQUE = "CHEQUE"; private static final String AADHAARFRONTNEW = "AADHAARFRONTNEW"; private static final String AADHAARFRONTOLD = "AADHAARFRONTOLD"; private static final String AADHAARBACK = "AADHAARBACK"; private static final String LICENSE = "LICENSE"; private static final String PAN = "PAN"; private static final String PAN1 = "PAN1"; public static void main(String[] a) throws MalformedURLException, IOException, SecurityException, NoSuchFieldException{ List fileList = new ArrayList(); fileList.add(aadhaarFile); fileList.add(panFile); fileList.add(chequeFile1); System.load("C:/DIGITAL_HOME/ocr/opencv_java420.dll"); ClassLoader.class.getDeclaredField("sys_paths").setAccessible(true); for(int i=0;i"+docType); if(docType==null){ System.out.println("Please provide valid document to upload"); }else{ //OCRReqBean ocrRequest = prepareOCRRequest(dummyFile,docType); //OCRServiceImpl ocrServiceImpl = new OCRServiceImpl(); //OCRResBean OCRResBean = ocrServiceImpl.getImageProcessing(ocrRequest); //System.out.println("OCRResBean--->"+OCRResBean); BufferedImage bufferedImage = ImageIO.read(new File(panFile1)); ITesseract tesseract = new Tesseract(); OCRResBean ocrResBean = new OCRResBean(); Map docText = new HashMap<>(); String tessdata="C:/DIGITAL_HOME/ocr/tessdata"; tesseract.setDatapath(tessdata); //tesseract.setTessVariable("user_defined_dpi","300"); //tesseract.setTessVariable("tessedit_char_whitelist", ""); //bufferedImage = cropByDocType(bufferedImage,docType); String grayImage = convertGrayImage(panFile1); BufferedImage bufferedImage1 = ImageIO.read(new File(grayImage)); try { tesseract.setLanguage("eng"); if(!"PASSPORT".equals(docType.toUpperCase())){ List words = tesseract.getWords(bufferedImage1, 1); System.out.println(words); for (int i = 0; i < words.size(); i++) { Word word = words.get(i); if(null != word.getText()){ docText.put("lineno:"+i, word.getText()); } } } if("PAN".equals(docType.toUpperCase())){ processPAN(ocrResBean, docText, "N"); } } catch (Exception e) { // TODO: handle exception } } } private static String convertGrayImage(String ocrFile) { String grayFile=null; try{ BufferedImage bufferImage = ImageIO.read(new File(ocrFile)); byte[] data = ((DataBufferByte) bufferImage.getRaster().getDataBuffer()).getData(); Mat mat = new Mat(bufferImage.getHeight(), bufferImage.getWidth(), CvType.CV_8UC3); mat.put(0, 0, data); Mat mat1 = new Mat(bufferImage.getHeight(),bufferImage.getWidth(),CvType.CV_8UC1); Imgproc.cvtColor(mat, mat1, Imgproc.COLOR_RGB2GRAY); byte[] data1 = new byte[mat1.rows() * mat1.cols() * (int)(mat1.elemSize())]; mat1.get(0, 0, data1); BufferedImage image1 = new BufferedImage(mat1.cols(),mat1.rows(), BufferedImage.TYPE_BYTE_GRAY); image1.getRaster().setDataElements(0, 0, mat1.cols(), mat1.rows(), data1); grayFile="D:/OCR Images/PAN2-gray.jpg"; File ouptut = new File(grayFile); ImageIO.write(image1, "jpg", ouptut); }catch(IOException e){ }catch(Exception e){ } return grayFile; } private static void processPAN(OCRResBean ocrResBean, Map docText, String name2) { // TODO Auto-generated method stub String firstName=docText.get("lineno:0"); ocrResBean.setFirstName(firstName.replaceAll("\n", "").trim()); if("Y".equals(name2)){ String lastName=docText.get("lineno:1"); ocrResBean.setLastName(lastName.replaceAll("\n", "").trim()); String fatherName=docText.get("lineno:2"); ocrResBean.setParentsName(fatherName.replaceAll("\n", "").trim()); String dob=docText.get("lineno:3").replaceAll("\n", "").replaceAll("\\s", ""); ocrResBean.setDob(dob); String pan=docText.get("lineno:5").replaceAll("\n", "").trim().replaceAll("\\s", ""); ocrResBean.setDocId(pan); }else{ ocrResBean.setFirstName(firstName.replaceAll("\n", "").trim()); String fatherName=docText.get("lineno:1"); ocrResBean.setParentsName(fatherName.replaceAll("\n", "").trim()); String dob=docText.get("lineno:2"); ocrResBean.setDob(dob.replaceAll("\\s", "")); String pan=docText.get("lineno:4").replaceAll("\n", "").trim().replaceAll("\\s", ""); ocrResBean.setDocId(pan); /*System.out.println("fatherName-->"+firstName); System.out.println("fatherName-->"+fatherName); System.out.println("fatherName-->"+ocrResBean.getDob()); System.out.println("fatherName-->"+pan);*/ } } private static BufferedImage cropByDocType(BufferedImage bufferedImage,String docType) { int cropwidth = 70; int cropheight = 70; BufferedImage croppedImage = null; switch (docType) { case PAN: croppedImage = bufferedImage.getSubimage(173,1015,bufferedImage.getWidth()-1305,bufferedImage.getHeight()-1852); /*croppedImage = bufferedImage.getSubimage((bufferedImage.getWidth() - cropwidth) / 2, (bufferedImage.getHeight() - cropheight) / 2, bufferedImage.getWidth() - 1305, bufferedImage.getHeight() - 1852);*/ /*try { ImageIO.write(croppedImage, "png", new File("D:/OCR Images/PAN2_hint_png.png")); } catch (IOException e) { e.printStackTrace(); }*/ break; case LICENSE: croppedImage = bufferedImage.getSubimage(20, 180, 650, 330); break; case AADHAARFRONTOLD: croppedImage = bufferedImage.getSubimage(300, 210, 560, 330); break; case AADHAARBACK: croppedImage = bufferedImage.getSubimage(450, 120, 550, 300); break; case CHEQUE: croppedImage = bufferedImage.getSubimage(220, 400, 500, 50); break; default: croppedImage = bufferedImage; break; } return croppedImage; } private static OCRReqBean prepareOCRRequest(File dummyFile2, String docType) { // TODO Auto-generated method stub OCRReqBean ocrReqBean = new OCRReqBean(); ocrReqBean.setDocType(docType); ocrReqBean.setMultiLineFirstName("N"); ocrReqBean.setDocVersion(2); ocrReqBean.setDocLabel(fileName); String encodedString = encodeFileToBase64Binary(panFile1); ocrReqBean.setDocContent(encodedString); System.out.println("encodedString--->"+encodedString); return ocrReqBean; } private static String encodeFileToBase64Binary(String panFile12) { // TODO Auto-generated method stub File originalFile = new File(panFile12); String encodedBase64 = null; try { FileInputStream fileInputStreamReader = new FileInputStream(originalFile); byte[] bytes = new byte[(int)originalFile.length()]; fileInputStreamReader.read(bytes); encodedBase64 = new String(Base64.getEncoder().encode(bytes), "UTF-8"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return encodedBase64; } public int compare_image(File file,int i) throws MalformedURLException, IOException { Mat mat_1 = conv_Mat(ImageIO.read(file)); Mat mat_2 = conv_Mat(ImageIO.read(new File("D:/OCR Images/PAN6.jpg"))); //Initialize Mats & histograms Mat hist_1 = new Mat(); Mat hist_2 = new Mat(); MatOfFloat ranges = new MatOfFloat(0f,256f); MatOfInt histSize = new MatOfInt(25); Imgproc.calcHist(Arrays.asList(mat_1), new MatOfInt(0),new Mat(), hist_1, histSize, ranges); Imgproc.calcHist(Arrays.asList(mat_2), new MatOfInt(0),new Mat(), hist_2, histSize, ranges); //Compare 2 images double res = Imgproc.compareHist(hist_1, hist_2, Imgproc.CV_COMP_CORREL); Double d = new Double(res*100); if(d.intValue() >60){ System.out.println("Percentage--->"+d.intValue()); flag =false; fileName = file.getName(); System.out.println("fileName--->"+fileName); dummyFile = file; docType = i == 0?"Aadhaar":(i == 1?"PAN":(i ==2 ?"Cheque":"")); } return d.intValue(); } private Mat conv_Mat(BufferedImage img) { byte[] data = ((DataBufferByte) img.getRaster().getDataBuffer()).getData(); Mat mat = new Mat(img.getHeight(),img.getWidth(),CvType.CV_8UC3); mat.put(0,0,data); Mat mat1 = new Mat(img.getHeight(),img.getWidth(),CvType.CV_8UC3); Imgproc.cvtColor(mat, mat1, Imgproc.COLOR_RGB2HSV); return mat1; } }