package com.xindao.ocr.smartjavaai.opencv; import ai.djl.ndarray.NDArray; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.MatOfPoint; import org.opencv.core.Point; import java.util.ArrayList; import java.util.List; /** * NDArray Utils * */ public class OcrNDArrayUtils { /** * Mat To MatOfPoint * @param mat * @return */ public static MatOfPoint matToMatOfPoint(Mat mat) { int rows = mat.rows(); MatOfPoint matOfPoint = new MatOfPoint(); List list = new ArrayList<>(); for (int i = 0; i < rows; i++) { Point point = new Point((float) mat.get(i, 0)[0], (float) mat.get(i, 1)[0]); list.add(point); } matOfPoint.fromList(list); return matOfPoint; } /** * float NDArray To float[][] Array * @param ndArray * @return */ public static float[][] floatNDArrayToArray(NDArray ndArray) { int rows = (int) (ndArray.getShape().get(0)); int cols = (int) (ndArray.getShape().get(1)); float[][] arr = new float[rows][cols]; float[] arrs = ndArray.toFloatArray(); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { arr[i][j] = arrs[i * cols + j]; } } return arr; } /** * Mat To double[][] Array * @param mat * @return */ public static double[][] matToDoubleArray(Mat mat) { int rows = mat.rows(); int cols = mat.cols(); double[][] doubles = new double[rows][cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { doubles[i][j] = mat.get(i, j)[0]; } } return doubles; } /** * Mat To float[][] Array * @param mat * @return */ public static float[][] matToFloatArray(Mat mat) { int rows = mat.rows(); int cols = mat.cols(); float[][] floats = new float[rows][cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { floats[i][j] = (float) mat.get(i, j)[0]; } } return floats; } /** * Mat To byte[][] Array * @param mat * @return */ public static byte[][] matToUint8Array(Mat mat) { int rows = mat.rows(); int cols = mat.cols(); byte[][] bytes = new byte[rows][cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { bytes[i][j] = (byte) mat.get(i, j)[0]; } } return bytes; } /** * float NDArray To float[][] Array * @param ndArray * @param cvType * @return */ public static Mat floatNDArrayToMat(NDArray ndArray, int cvType) { int rows = (int) (ndArray.getShape().get(0)); int cols = (int) (ndArray.getShape().get(1)); Mat mat = new Mat(rows, cols, cvType); float[] arrs = ndArray.toFloatArray(); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { mat.put(i, j, arrs[i * cols + j]); } } return mat; } /** * float NDArray To Mat * @param ndArray * @return */ public static Mat floatNDArrayToMat(NDArray ndArray) { int rows = (int) (ndArray.getShape().get(0)); int cols = (int) (ndArray.getShape().get(1)); Mat mat = new Mat(rows, cols, CvType.CV_32F); float[] arrs = ndArray.toFloatArray(); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { mat.put(i, j, arrs[i * cols + j]); } } return mat; } /** * uint8 NDArray To Mat * @param ndArray * @return */ public static Mat uint8NDArrayToMat(NDArray ndArray) { int rows = (int) (ndArray.getShape().get(0)); int cols = (int) (ndArray.getShape().get(1)); Mat mat = new Mat(rows, cols, CvType.CV_8U); byte[] arrs = ndArray.toByteArray(); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { mat.put(i, j, arrs[i * cols + j]); } } return mat; } /** * float[][] Array To Mat * @param arr * @return */ public static Mat floatArrayToMat(float[][] arr) { int rows = arr.length; int cols = arr[0].length; Mat mat = new Mat(rows, cols, CvType.CV_32F); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { mat.put(i, j, arr[i][j]); } } return mat; } /** * byte[][] Array To Mat * @param arr * @return */ public static Mat uint8ArrayToMat(byte[][] arr) { int rows = arr.length; int cols = arr[0].length; Mat mat = new Mat(rows, cols, CvType.CV_8U); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { mat.put(i, j, arr[i][j]); } } return mat; } /** * List To Mat * @param points * @return */ public static Mat toMat(List points) { Mat mat = new Mat(points.size(), 2, CvType.CV_32F); for (int i = 0; i < points.size(); i++) { ai.djl.modality.cv.output.Point point = points.get(i); mat.put(i, 0, (float) point.getX()); mat.put(i, 1, (float) point.getY()); } return mat; } }