|
|
@@ -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(
|