Преглед изворни кода

Feature: L2 distance conversion

If all bits in a vector are different, the L2 distance should be 64, which means zero similarity.
wudi пре 5 година
родитељ
комит
9671d86469

+ 31 - 0
src/main/java/com/mokasz/image_pool/algorithm/FeatureExtractor.java

@@ -0,0 +1,31 @@
+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.core.MatOfKeyPoint;
+import org.opencv.features2d.ORB;
+import org.opencv.imgcodecs.Imgcodecs;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FeatureExtractor {
+
+    private final static Logger logger = LoggerFactory.getLogger(FeatureExtractor.class.getName());
+
+    // 静态初始化 OpenCV
+    static {
+        Loader.load(opencv_java.class);
+    }
+
+    public static void compute (byte[] fileBytes) {
+        Mat input = Imgcodecs.imdecode(new MatOfByte(fileBytes), Imgcodecs.IMREAD_GRAYSCALE);
+        ORB detector = ORB.create(128);
+        Mat output = new Mat();
+        MatOfKeyPoint matOfKeyPoint = new MatOfKeyPoint();
+        detector.detect(input, matOfKeyPoint);
+        detector.compute(input, matOfKeyPoint, output);
+        logger.info("KP: {} OUT: {}", matOfKeyPoint.dump(), output.dump());
+    }
+}

+ 8 - 1
src/main/java/com/mokasz/image_pool/restful/controller/ImageController.java

@@ -1,5 +1,6 @@
 package com.mokasz.image_pool.restful.controller;
 
+import com.mokasz.image_pool.algorithm.FeatureExtractor;
 import com.mokasz.image_pool.restful.entity.ImageQueryResponse;
 import com.mokasz.image_pool.restful.entity.ImageSaveResponse;
 import org.bytedeco.javacpp.Loader;
@@ -67,6 +68,12 @@ public class ImageController {
         return stringBuilder.toString();
     }
 
+    @PostMapping("/store2")
+    public ImageSaveResponse store2 (@RequestParam("file") MultipartFile file) throws IOException {
+        FeatureExtractor.compute(file.getBytes());
+        return new ImageSaveResponse("OK", 1L);
+    }
+
     @PostMapping("/store")
     public ImageSaveResponse store (@RequestParam("file") MultipartFile file) throws IOException {
         logger.info("File size: {} Name: {}", file.getSize(), file.getOriginalFilename());
@@ -89,7 +96,7 @@ public class ImageController {
         float[] binaries = new float[64];
         transformBinaryArray(floats, binaries);
         logger.info("{}", floats);
-        List<ImageQueryResponse> list = jdbcTemplate.query("SELECT hash, l2_distance(?::FLOAT2[], vector) AS similarity FROM image_pool.image_hash ORDER BY vector <-> ?::FLOAT2[] DESC LIMIT 2",
+        List<ImageQueryResponse> list = jdbcTemplate.query("SELECT hash, (64 - l2_distance(?::FLOAT2[], vector)) / 64 AS similarity FROM image_pool.image_hash ORDER BY vector <-> ?::FLOAT2[] ASC LIMIT 2",
                 (ResultSet rs, int rowNum) -> new ImageQueryResponse(rs.getFloat("similarity"), rs.getString("hash")), binaries, binaries);
         return list;
     }