Here's a start. It doesn't do anything with the OCR and I haven't implemented the imutils or sort functionality but it does show most of the functionality up to that point. Note I'm using INDArray from ND4J - see
https://deeplearning4j.konduit.ai/nd4j/tutorials/quickstart :
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.opencv.opencv_core.Mat;
import org.bytedeco.opencv.opencv_core.MatVector;
import org.bytedeco.opencv.opencv_core.Point;
import org.bytedeco.opencv.opencv_core.Scalar;
import org.datavec.image.loader.NativeImageLoader;
import org.nd4j.linalg.api.ndarray.INDArray;
import java.io.IOException;
import static org.bytedeco.opencv.global.opencv_core.*;
import static org.bytedeco.opencv.global.opencv_imgcodecs.imread;
import static org.bytedeco.opencv.global.opencv_imgproc.*;
import static org.opencv.imgproc.Imgproc.COLOR_BGR2GRAY;
public class JavaCvOcr {
public static void main(String[] params){
Mat img = imread("image4.jpg");
Mat gray = new Mat();
cvtColor(img,gray, COLOR_BGR2GRAY);
Mat bfilter = new Mat();
bilateralFilter(gray,bfilter, 11,17,17);
Mat edged = new Mat();
Canny(bfilter, edged, 30, 200);
CanvasFrame canvasFrame = new CanvasFrame("Ocr test");
OpenCVFrameConverter.ToMat toMatConverter = new OpenCVFrameConverter.ToMat();
Frame frame = toMatConverter.convert(edged);
canvasFrame.showImage(frame);
MatVector contours = new MatVector();
Mat hierachy = new Mat();
findContours(edged.clone(), contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE);
for (int i =0 ; i < contours.size(); i++){
Mat contour = contours.get(i);
Mat approx = new Mat();
approxPolyDP(contour, approx, 10, true);
try {
NativeImageLoader nativeImageLoader = new NativeImageLoader(approx.rows(), approx.cols(), approx.channels());
INDArray approxArray = nativeImageLoader.asMatrix(approx);
if (approxArray.shape()[2]==4 && approxArray.stride()[1]==4) {
System.out.println("approxArray = " + approxArray);
System.out.println("approxArray shape length = " + approxArray.shapeInfoToString());
Mat mask = new Mat(img.rows(), img.cols(), CV_8U, new Scalar(0,0,0,0));
Mat new_image = new Mat();
drawContours(mask, contours, i, new Scalar(255, 255, 255, 255),FILLED , LINE_8, hierachy, 0, new Point(0,0) );
Frame maskFrame = toMatConverter.convert(mask);
canvasFrame.showImage(maskFrame);
bitwise_and( img, img, new_image, mask );
Frame new_imageFrame = toMatConverter.convert(new_image);
canvasFrame.showImage(new_imageFrame);
Thread.sleep(2000);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
}