OpenCvService.java 1006 B

123456789101112131415161718192021222324252627282930
  1. package com.mokasz.image_pool.algorithm;
  2. import org.bytedeco.javacpp.Loader;
  3. import org.bytedeco.opencv.opencv_java;
  4. import org.opencv.core.Mat;
  5. import org.opencv.core.MatOfByte;
  6. import org.opencv.img_hash.PHash;
  7. import org.opencv.imgcodecs.Imgcodecs;
  8. public class OpenCvService {
  9. // 静态初始化 OpenCV
  10. static {
  11. Loader.load(opencv_java.class);
  12. }
  13. private final PHash pHash = PHash.create();
  14. private static void transformMatToArrayOfFloat(Mat mat, float[] floats) {
  15. if (mat.width() != 8 || mat.height() != 1) throw new RuntimeException("Matrix dimension is not 1x8");
  16. for (int i = 0; i < 8; i++) {
  17. floats[i] = (float) mat.get(0, i)[0];
  18. }
  19. }
  20. public void calculatePHash (byte[] fileBytes, float[] vector) {
  21. Mat input = Imgcodecs.imdecode(new MatOfByte(fileBytes), Imgcodecs.IMREAD_UNCHANGED);
  22. Mat output = new Mat();
  23. pHash.compute(input, output);
  24. transformMatToArrayOfFloat(output, vector);
  25. }
  26. }