package com.mokasz.image_pool.algorithm; import org.bytedeco.javacpp.Loader; import org.bytedeco.opencv.opencv_java; import org.opencv.core.Mat; import org.opencv.core.MatOfByte; import org.opencv.img_hash.PHash; import org.opencv.imgcodecs.Imgcodecs; public class OpenCvService { // 静态初始化 OpenCV static { Loader.load(opencv_java.class); } private final PHash pHash = PHash.create(); private static void transformMatToArrayOfFloat(Mat mat, float[] floats) { if (mat.width() != 8 || mat.height() != 1) throw new RuntimeException("Matrix dimension is not 1x8"); for (int i = 0; i < 8; i++) { floats[i] = (float) mat.get(0, i)[0]; } } public void calculatePHash (byte[] fileBytes, float[] vector) { Mat input = Imgcodecs.imdecode(new MatOfByte(fileBytes), Imgcodecs.IMREAD_UNCHANGED); Mat output = new Mat(); pHash.compute(input, output); transformMatToArrayOfFloat(output, vector); } }