Sfoglia il codice sorgente

Refactor: 抽取opencv相关操作

wudi 5 anni fa
parent
commit
b7963630d5

+ 7 - 49
src/main/java/com/mokasz/image_pool/restful/controller/ImageController.java

@@ -1,14 +1,9 @@
 package com.mokasz.image_pool.restful.controller;
 
 import com.mokasz.image_pool.algorithm.FeatureExtractor;
+import com.mokasz.image_pool.algorithm.OpenCvService;
 import com.mokasz.image_pool.restful.entity.ImageQueryResponse;
 import com.mokasz.image_pool.restful.entity.ImageSaveResponse;
-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;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,48 +18,11 @@ import java.util.List;
 @RestController
 @RequestMapping("/service/image")
 public class ImageController {
-  // 静态初始化 OpenCV
-  static {
-    Loader.load(opencv_java.class);
-  }
 
   private final Logger logger = LoggerFactory.getLogger(this.getClass());
-  private final PHash pHash = PHash.create();
+  private final OpenCvService service = new OpenCvService();
   @Autowired private JdbcTemplate jdbcTemplate;
 
-  private void calculate(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);
-  }
-
-  private 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];
-    }
-  }
-
-  private void transformBinaryArray(float[] octets, float[] binaries) {
-    for (int i = 0; i < 8; i++) {
-      for (int j = 0; j < 8; j++) {
-        int v = (int) octets[i];
-        binaries[i * 8 + j] = (v & (1 << j)) >> j;
-      }
-    }
-  }
-
-  private String getReadableHash(float[] floats) {
-    StringBuilder stringBuilder = new StringBuilder();
-    for (int i = 0; i < 8; i++) {
-      stringBuilder.append(String.format("%02X", (int) floats[i]));
-    }
-    return stringBuilder.toString();
-  }
-
   @GetMapping("/")
   public ImageSaveResponse index() throws IOException {
     return new ImageSaveResponse("ok", 0);
@@ -81,11 +39,11 @@ public class ImageController {
       @RequestParam("file") MultipartFile file, @RequestParam("pool") int pool) throws IOException {
     logger.info("File size: {} Name: {}", file.getSize(), file.getOriginalFilename());
     float[] floats = new float[8];
-    calculate(file.getBytes(), floats);
+    service.calculatePHash(file.getBytes(), floats);
     float[] binaries = new float[64];
-    transformBinaryArray(floats, binaries);
+    service.transformBinaryArray(floats, binaries);
     logger.info("{}", binaries);
-    String hash = getReadableHash(floats);
+    String hash = service.getReadableHash(floats);
     int updated =
         jdbcTemplate.update(
             "INSERT INTO image_pool.image_hash VALUES (?, NOW(), ?) ON CONFLICT (hash) DO NOTHING",
@@ -108,9 +66,9 @@ public class ImageController {
       @RequestParam(value = "limit", defaultValue = "10") int limit)
       throws IOException {
     float[] floats = new float[8];
-    calculate(file.getBytes(), floats);
+    service.calculatePHash(file.getBytes(), floats);
     float[] binaries = new float[64];
-    transformBinaryArray(floats, binaries);
+    service.transformBinaryArray(floats, binaries);
     logger.info("{}", floats);
     List<ImageQueryResponse> list =
         jdbcTemplate.query(