classes.TextExtractor.java Source code

Java tutorial

Introduction

Here is the source code for classes.TextExtractor.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package classes;

import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

/**
 *
 * @author ggmendez
 */
public class TextExtractor {

    private final Mat image;
    private final String imageID;
    private final ArrayList<String> recognizedStrings = new ArrayList<String>();
    private HttpServletRequest request = null;

    public TextExtractor(Mat image, String imageID, HttpServletRequest request) {
        this.image = image;
        this.imageID = imageID;
        this.request = request;
    }

    public void extractText(Scalar meanColor) {

        ArrayList<String> recognizableImageNames = TextRecognitionPreparer.generateRecognizableImagesNames(image,
                meanColor, imageID, request);

        for (String imageName : recognizableImageNames) {

            try {

                // First recognition step
                String recognizedText2 = TextRecognizer.recognize(imageName, false).trim();
                if (recognizedText2 != null && !recognizedText2.isEmpty()) {
                    recognizedStrings.add(recognizedText2);
                }

                // Second recognition step
                String recognizedText1 = TextRecognizer.recognize(imageName, true).trim();
                if (recognizedText1 != null && !recognizedText1.isEmpty()) {
                    recognizedStrings.add(recognizedText1);
                }

            } catch (Exception e) {
            }
        }

        //            ArrayList<BufferedImage> recognizableBufferedImages = TextRecognitionPreparer.generateRecognizableBufferedImages(data, backgroundColor, userColor);
        //            for (BufferedImage bufferedImage : recognizableBufferedImages) {
        //                try {
        //                    // First recognition step
        //                    String recognizedText = TextRecognizer.recognize(bufferedImage, true).trim();
        //                    if (recognizedText != null && !recognizedText.isEmpty()) {
        //                        recognizedStrings.add(recognizedText);
        //                    }
        //                    // Second recognition step
        //                    recognizedText = TextRecognizer.recognize(bufferedImage, false).trim();
        //                    if (recognizedText != null && !recognizedText.isEmpty()) {
        //                        recognizedStrings.add(recognizedText);
        //                    }
        //                    
        //                } catch (Exception e) {
        //                }
        //            }
    }

    public Mat getImage() {
        return image;
    }

    public ArrayList<String> getRecognizedStrings() {
        return recognizedStrings;
    }

    private static Point transformPoint(Point point, Mat transformationMatrix) {
        double newX = transformationMatrix.get(0, 0)[0] * point.x + transformationMatrix.get(0, 1)[0] * point.y
                + transformationMatrix.get(0, 2)[0];
        double newY = transformationMatrix.get(1, 0)[0] * point.x + transformationMatrix.get(1, 1)[0] * point.y
                + transformationMatrix.get(1, 2)[0];
        return new Point(newX, newY);
    }

    public void extractText(Rect roi, double roiAngle) throws Exception {

        Point roiTopLeft = roi.tl();

        double radians = Math.toRadians(roiAngle);
        double sin = Math.abs(Math.sin(radians));
        double cos = Math.abs(Math.cos(radians));

        int newWidth = (int) (image.width() * cos + image.height() * sin);
        int newHeight = (int) (image.width() * sin + image.height() * cos);

        int[] newWidthHeight = { newWidth, newHeight };

        int pivotX = newWidthHeight[0] / 2;
        int pivotY = newWidthHeight[1] / 2;

        Point center = new Point(pivotX, pivotY);

        Size targetSize = new Size(newWidthHeight[0], newWidthHeight[1]);

        Mat intermediateImage = new Mat(targetSize, image.type());

        int offsetX = (newWidthHeight[0] - image.width()) / 2;
        int offsetY = (newWidthHeight[1] - image.height()) / 2;

        Point paddedTopLeft = new Point(roiTopLeft.x + offsetX, roiTopLeft.y + offsetY);

        Mat containerImage = intermediateImage.submat(offsetY, offsetY + image.height(), offsetX,
                offsetX + image.width());
        image.copyTo(containerImage);

        Mat rotationMatrix = Imgproc.getRotationMatrix2D(center, roiAngle, 1.0);

        Point transformedTopLeft = transformPoint(paddedTopLeft, rotationMatrix);

        Mat rotatedImage = new Mat();
        Imgproc.warpAffine(intermediateImage, rotatedImage, rotationMatrix, targetSize, Imgproc.INTER_LINEAR,
                Imgproc.BORDER_CONSTANT, new Scalar(0));

        ImageUtils.saveImage(rotatedImage, imageID + "_rotatedImage.png", request);

        double adjustedWidth = roi.size().width;
        double adjustedHeight = roi.size().height;

        if (transformedTopLeft.x + adjustedWidth > rotatedImage.width()) {
            adjustedWidth = rotatedImage.width() - transformedTopLeft.x;
        }

        if (transformedTopLeft.y + adjustedHeight > rotatedImage.height()) {
            adjustedHeight = rotatedImage.height() - transformedTopLeft.y;
        }

        Rect newROI = new Rect(transformedTopLeft, new Size(adjustedWidth, adjustedHeight));

        Mat extractedROI = new Mat(rotatedImage, newROI);

        String fileName = ImageUtils.saveImage(extractedROI, imageID + "_ROI.png", request);

        extractText(fileName);
    }

    public void extractText(String imageName) throws Exception {

        // First recognition step
        String recognizedText1 = TextRecognizer.recognizeInSkewedImage(imageName, true).trim();
        if (recognizedText1 != null && !recognizedText1.isEmpty()) {
            recognizedStrings.add(recognizedText1);
        }

        // Second recognition step
        String recognizedText2 = TextRecognizer.recognizeInSkewedImage(imageName, false).trim();
        if (recognizedText2 != null && !recognizedText2.isEmpty()) {
            recognizedStrings.add(recognizedText2);
        }

        // First recognition step
        String recognizedText3 = TextRecognizer.recognize(imageName, true).trim();
        if (recognizedText3 != null && !recognizedText3.isEmpty()) {
            recognizedStrings.add(recognizedText3);
        }

        // Second recognition step
        String recognizedText4 = TextRecognizer.recognize(imageName, false).trim();
        if (recognizedText4 != null && !recognizedText4.isEmpty()) {
            recognizedStrings.add(recognizedText4);
        }

    }

}