> getByPicture(@RequestParam String CameraIP){
+ // 获取当前项目路径
+ String property = System.getProperty("user.dir");
+ String imageName = FfmpegUtil.getLiveCapture(CameraIP, property + targetPath);
+ return imagesToBase64(imageName);
+ }
+
+
}
diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/BorderMat.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/BorderMat.java
similarity index 95%
rename from open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/BorderMat.java
rename to open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/BorderMat.java
index df845be..e14b437 100644
--- a/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/BorderMat.java
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/BorderMat.java
@@ -1,4 +1,4 @@
-package com.visual.open.anpr.core.domain;
+package com.visual.open.anpr.server.domain;
import org.opencv.core.Mat;
diff --git a/open-anpr-test/src/main/java/com/visual/open/anpr/utils/DrawImage.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/DrawImage.java
similarity index 98%
rename from open-anpr-test/src/main/java/com/visual/open/anpr/utils/DrawImage.java
rename to open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/DrawImage.java
index d9d9c3d..dd367a0 100644
--- a/open-anpr-test/src/main/java/com/visual/open/anpr/utils/DrawImage.java
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/DrawImage.java
@@ -1,4 +1,4 @@
-package com.visual.open.anpr.utils;
+package com.visual.open.anpr.server.domain;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/ExtParam.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/ExtParam.java
similarity index 94%
rename from open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/ExtParam.java
rename to open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/ExtParam.java
index 130bbfd..4305a81 100644
--- a/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/ExtParam.java
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/ExtParam.java
@@ -1,4 +1,4 @@
-package com.visual.open.anpr.core.domain;
+package com.visual.open.anpr.server.domain;
import java.io.Serializable;
diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/ImageMat.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/ImageMat.java
old mode 100755
new mode 100644
similarity index 99%
rename from open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/ImageMat.java
rename to open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/ImageMat.java
index 70aa248..f5e3035
--- a/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/ImageMat.java
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/ImageMat.java
@@ -1,8 +1,8 @@
-package com.visual.open.anpr.core.domain;
+package com.visual.open.anpr.server.domain;
import ai.onnxruntime.OnnxTensor;
import ai.onnxruntime.OrtEnvironment;
-import com.visual.open.anpr.core.utils.MatUtil;
+import com.visual.open.anpr.server.utils.MatUtil;
import org.opencv.core.Point;
import org.opencv.core.*;
import org.opencv.dnn.Dnn;
diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/PlateImage.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/PlateImage.java
similarity index 96%
rename from open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/PlateImage.java
rename to open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/PlateImage.java
index 9f0308c..412866f 100644
--- a/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/PlateImage.java
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/PlateImage.java
@@ -1,4 +1,4 @@
-package com.visual.open.anpr.core.domain;
+package com.visual.open.anpr.server.domain;
import java.io.Serializable;
import java.util.ArrayList;
diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/PlateInfo.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/PlateInfo.java
old mode 100755
new mode 100644
similarity index 99%
rename from open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/PlateInfo.java
rename to open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/PlateInfo.java
index d163835..15f2775
--- a/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/PlateInfo.java
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/domain/PlateInfo.java
@@ -1,4 +1,4 @@
-package com.visual.open.anpr.core.domain;
+package com.visual.open.anpr.server.domain;
import java.io.Serializable;
diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/extract/PlateExtractor.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/extract/PlateExtractor.java
similarity index 57%
rename from open-anpr-core/src/main/java/com/visual/open/anpr/core/extract/PlateExtractor.java
rename to open-anpr-server/src/main/java/com/visual/open/anpr/server/extract/PlateExtractor.java
index 5ab2ac2..c1822a7 100644
--- a/open-anpr-core/src/main/java/com/visual/open/anpr/core/extract/PlateExtractor.java
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/extract/PlateExtractor.java
@@ -1,9 +1,10 @@
-package com.visual.open.anpr.core.extract;
+package com.visual.open.anpr.server.extract;
+
+import com.visual.open.anpr.server.domain.ExtParam;
+import com.visual.open.anpr.server.domain.ImageMat;
+import com.visual.open.anpr.server.domain.PlateImage;
import java.util.Map;
-import com.visual.open.anpr.core.domain.ExtParam;
-import com.visual.open.anpr.core.domain.ImageMat;
-import com.visual.open.anpr.core.domain.PlateImage;
public interface PlateExtractor {
diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/extract/PlateExtractorImpl.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/extract/PlateExtractorImpl.java
similarity index 88%
rename from open-anpr-core/src/main/java/com/visual/open/anpr/core/extract/PlateExtractorImpl.java
rename to open-anpr-server/src/main/java/com/visual/open/anpr/server/extract/PlateExtractorImpl.java
index b549896..544201b 100644
--- a/open-anpr-core/src/main/java/com/visual/open/anpr/core/extract/PlateExtractorImpl.java
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/extract/PlateExtractorImpl.java
@@ -1,12 +1,12 @@
-package com.visual.open.anpr.core.extract;
+package com.visual.open.anpr.server.extract;
-import com.visual.open.anpr.core.base.PlateDetection;
-import com.visual.open.anpr.core.base.PlateRecognition;
-import com.visual.open.anpr.core.domain.ExtParam;
-import com.visual.open.anpr.core.domain.ImageMat;
-import com.visual.open.anpr.core.domain.PlateImage;
-import com.visual.open.anpr.core.domain.PlateInfo;
-import com.visual.open.anpr.core.utils.CropUtil;
+import com.visual.open.anpr.server.base.PlateDetection;
+import com.visual.open.anpr.server.base.PlateRecognition;
+import com.visual.open.anpr.server.domain.ExtParam;
+import com.visual.open.anpr.server.domain.ImageMat;
+import com.visual.open.anpr.server.domain.PlateImage;
+import com.visual.open.anpr.server.domain.PlateInfo;
+import com.visual.open.anpr.server.utils.CropUtil;
import org.opencv.core.Core;
import org.opencv.core.Mat;
diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/models/TorchPlateDetection.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/models/TorchPlateDetection.java
similarity index 95%
rename from open-anpr-core/src/main/java/com/visual/open/anpr/core/models/TorchPlateDetection.java
rename to open-anpr-server/src/main/java/com/visual/open/anpr/server/models/TorchPlateDetection.java
index 0049c94..9a15d8f 100644
--- a/open-anpr-core/src/main/java/com/visual/open/anpr/core/models/TorchPlateDetection.java
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/models/TorchPlateDetection.java
@@ -1,14 +1,17 @@
-package com.visual.open.anpr.core.models;
+package com.visual.open.anpr.server.models;
import ai.onnxruntime.OnnxTensor;
import ai.onnxruntime.OrtSession;
-import com.visual.open.anpr.core.base.BaseOnnxInfer;
-import com.visual.open.anpr.core.base.PlateDetection;
-import com.visual.open.anpr.core.domain.ImageMat;
-import com.visual.open.anpr.core.domain.BorderMat;
-import com.visual.open.anpr.core.domain.PlateInfo;
-import com.visual.open.anpr.core.utils.ReleaseUtil;
-import org.opencv.core.*;
+import com.visual.open.anpr.server.base.BaseOnnxInfer;
+import com.visual.open.anpr.server.base.PlateDetection;
+import com.visual.open.anpr.server.domain.BorderMat;
+import com.visual.open.anpr.server.domain.ImageMat;
+import com.visual.open.anpr.server.domain.PlateInfo;
+import com.visual.open.anpr.server.utils.ReleaseUtil;
+import org.opencv.core.Core;
+import org.opencv.core.Mat;
+import org.opencv.core.Scalar;
+import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
import java.util.*;
diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/models/TorchPlateRecognition.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/models/TorchPlateRecognition.java
similarity index 92%
rename from open-anpr-core/src/main/java/com/visual/open/anpr/core/models/TorchPlateRecognition.java
rename to open-anpr-server/src/main/java/com/visual/open/anpr/server/models/TorchPlateRecognition.java
index 6597bee..de5e250 100644
--- a/open-anpr-core/src/main/java/com/visual/open/anpr/core/models/TorchPlateRecognition.java
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/models/TorchPlateRecognition.java
@@ -1,20 +1,21 @@
-package com.visual.open.anpr.core.models;
+package com.visual.open.anpr.server.models;
import ai.onnxruntime.OnnxTensor;
import ai.onnxruntime.OrtSession;
-import com.visual.open.anpr.core.base.BaseOnnxInfer;
-import com.visual.open.anpr.core.base.PlateRecognition;
-import com.visual.open.anpr.core.domain.ImageMat;
-import com.visual.open.anpr.core.domain.PlateInfo.ParseInfo;
-import com.visual.open.anpr.core.utils.ArrayUtil;
-import com.visual.open.anpr.core.utils.MatUtil;
-import com.visual.open.anpr.core.utils.ReleaseUtil;
-import com.visual.open.anpr.core.utils.SoftMaxUtil;
+import com.visual.open.anpr.server.base.BaseOnnxInfer;
+import com.visual.open.anpr.server.base.PlateRecognition;
+import com.visual.open.anpr.server.domain.ImageMat;
+import com.visual.open.anpr.server.domain.PlateInfo.ParseInfo;
+import com.visual.open.anpr.server.utils.ArrayUtil;
+import com.visual.open.anpr.server.utils.MatUtil;
+import com.visual.open.anpr.server.utils.ReleaseUtil;
+import com.visual.open.anpr.server.utils.SoftMaxUtil;
import org.opencv.core.Mat;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
+
import java.util.Collections;
import java.util.Map;
diff --git a/open-anpr-server/src/main/java/com/visual/open/anpr/server/service/impl/PlateServiceImpl.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/service/impl/PlateServiceImpl.java
index d77f8d7..aeb9459 100644
--- a/open-anpr-server/src/main/java/com/visual/open/anpr/server/service/impl/PlateServiceImpl.java
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/service/impl/PlateServiceImpl.java
@@ -1,10 +1,7 @@
package com.visual.open.anpr.server.service.impl;
-import com.visual.open.anpr.core.domain.ExtParam;
-import com.visual.open.anpr.core.domain.ImageMat;
-import com.visual.open.anpr.core.domain.PlateImage;
-import com.visual.open.anpr.core.domain.PlateInfo;
-import com.visual.open.anpr.core.extract.PlateExtractor;
+import com.visual.open.anpr.server.extract.PlateExtractor;
+import com.visual.open.anpr.server.domain.*;
import com.visual.open.anpr.server.domain.extend.*;
import com.visual.open.anpr.server.domain.request.PlateInfoReqVo;
import com.visual.open.anpr.server.domain.response.PlateInfoRepVo;
diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/utils/AlignUtil.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/AlignUtil.java
old mode 100755
new mode 100644
similarity index 99%
rename from open-anpr-core/src/main/java/com/visual/open/anpr/core/utils/AlignUtil.java
rename to open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/AlignUtil.java
index ae15913..78ee5f2
--- a/open-anpr-core/src/main/java/com/visual/open/anpr/core/utils/AlignUtil.java
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/AlignUtil.java
@@ -1,4 +1,4 @@
-package com.visual.open.anpr.core.utils;
+package com.visual.open.anpr.server.utils;
import org.apache.commons.math3.linear.RealMatrix;
import org.apache.commons.math3.linear.RealVector;
diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/utils/ArrayUtil.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/ArrayUtil.java
similarity index 95%
rename from open-anpr-core/src/main/java/com/visual/open/anpr/core/utils/ArrayUtil.java
rename to open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/ArrayUtil.java
index 800fd9d..bfe8230 100644
--- a/open-anpr-core/src/main/java/com/visual/open/anpr/core/utils/ArrayUtil.java
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/ArrayUtil.java
@@ -1,4 +1,4 @@
-package com.visual.open.anpr.core.utils;
+package com.visual.open.anpr.server.utils;
public class ArrayUtil {
diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/utils/CropUtil.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/CropUtil.java
old mode 100755
new mode 100644
similarity index 95%
rename from open-anpr-core/src/main/java/com/visual/open/anpr/core/utils/CropUtil.java
rename to open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/CropUtil.java
index 6a528ba..5015255
--- a/open-anpr-core/src/main/java/com/visual/open/anpr/core/utils/CropUtil.java
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/CropUtil.java
@@ -1,6 +1,6 @@
-package com.visual.open.anpr.core.utils;
+package com.visual.open.anpr.server.utils;
-import com.visual.open.anpr.core.domain.PlateInfo;
+import com.visual.open.anpr.server.domain.PlateInfo;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
diff --git a/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/FfmpegUtil.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/FfmpegUtil.java
new file mode 100644
index 0000000..d8439da
--- /dev/null
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/FfmpegUtil.java
@@ -0,0 +1,324 @@
+package com.visual.open.anpr.server.utils;
+
+import ws.schild.jave.Encoder;
+import ws.schild.jave.EncoderException;
+import ws.schild.jave.MultimediaObject;
+import ws.schild.jave.encode.AudioAttributes;
+import ws.schild.jave.encode.EncodingAttributes;
+import ws.schild.jave.encode.VideoAttributes;
+import ws.schild.jave.info.MultimediaInfo;
+import ws.schild.jave.process.ProcessWrapper;
+import ws.schild.jave.process.ffmpeg.DefaultFFMPEGLocator;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author ruibo.duan, <1573434995@qq.com>
+ * @since 2021/7/22
+ */
+public class FfmpegUtil {
+
+ /**
+ * 通过本地路径获取多媒体文件信息(宽,高,时长,编码等)
+ *
+ * @param localPath 本地路径
+ * @return MultimediaInfo 对象,包含 (宽,高,时长,编码等)
+ * @throws EncoderException
+ */
+ public static MultimediaInfo getMultimediaInfo(String localPath) {
+ MultimediaInfo multimediaInfo = null;
+ try {
+ multimediaInfo = new MultimediaObject(new File(localPath)).getInfo();
+ } catch (EncoderException e) {
+ System.out.println("获取多媒体文件信息异常");
+ e.printStackTrace();
+ }
+ return multimediaInfo;
+ }
+
+ /**
+// * 通过URL获取多媒体文件信息
+ *
+ * @param url 网络url
+ * @return MultimediaInfo 对象,包含 (宽,高,时长,编码等)
+ * @throws EncoderException
+ */
+ public static MultimediaInfo getMultimediaInfoFromUrl(String url) {
+ MultimediaInfo multimediaInfo = null;
+ try {
+ multimediaInfo = new MultimediaObject(new URL(url)).getInfo();
+ } catch (Exception e) {
+ System.out.println("获取多媒体文件信息异常");
+ e.printStackTrace();
+ }
+ return multimediaInfo;
+ }
+
+ private static final int SAMPLING_RATE = 16000;
+ private static final int SINGLE_CHANNEL = 1;
+
+ /**
+ * 音频格式化为wav,并设置单声道和采样率
+ *
+ * @param url 需要转格式的音频
+ * @param targetPath 格式化后要保存的目标路径
+ */
+ public static boolean formatAudio(String url, String targetPath) {
+ File target = new File(targetPath);
+ MultimediaObject multimediaObject;
+ try {
+ // 若是本地文件: multimediaObject = new MultimediaObject(new File("你的本地路径"));
+ multimediaObject = new MultimediaObject(new URL(url));
+ // 音频参数
+ // TODO: 2023/1/31 此处按需自定义音频参数
+ AudioAttributes audio = new AudioAttributes();
+ // 采样率
+ audio.setSamplingRate(SAMPLING_RATE);
+ // 单声道
+ audio.setChannels(SINGLE_CHANNEL);
+ Encoder encoder = new Encoder();
+ EncodingAttributes attrs = new EncodingAttributes();
+ // 输出格式
+ attrs.setOutputFormat("wav");
+ attrs.setAudioAttributes(audio);
+ encoder.encode(multimediaObject, target, attrs);
+ return true;
+ } catch (Exception e) {
+ System.out.println("格式化音频异常");
+ return false;
+ }
+ }
+
+ /**
+ * 视频格式化为mp4
+ *
+ * @param url
+ * @param targetPath
+ * @return
+ */
+ public static boolean formatToMp4(String url, String targetPath) {
+ File target = new File(targetPath);
+ MultimediaObject multimediaObject;
+ try {
+ // 若是本地文件: multimediaObject = new MultimediaObject(new File("你的本地路径"));
+ multimediaObject = new MultimediaObject(new URL(url));
+ EncodingAttributes attributes = new EncodingAttributes();
+ // 设置视频的音频参数
+ AudioAttributes audioAttributes = new AudioAttributes();
+ attributes.setAudioAttributes(audioAttributes);
+ // 设置视频的视频参数
+ VideoAttributes videoAttributes = new VideoAttributes();
+ // 设置帧率
+ videoAttributes.setFrameRate(25);
+ attributes.setVideoAttributes(videoAttributes);
+ // 设置输出格式
+ attributes.setOutputFormat("mp4");
+ Encoder encoder = new Encoder();
+ encoder.encode(multimediaObject, target, attributes);
+ return true;
+ } catch (Exception e) {
+ System.out.println("格式化视频异常");
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * 获取视频缩略图 获取视频第0秒的第一帧图片
+ *
+ * 执行的ffmpeg 命令为: ffmpeg -i 你的视频文件路径 -ss 指定的秒数 生成文件的全路径地址
+ *
+ * @param localPath 本地路径
+ * @param targetPath 存放的目标路径
+ * @return
+ */
+ public static boolean getTargetThumbnail(String localPath, String targetPath) {
+ // FIXME: 2023/1/31 该方法基本可作为执行ffmpeg命令的模板方法,之后的几个方法与此类似
+ try {
+ ProcessWrapper ffmpeg = new DefaultFFMPEGLocator().createExecutor();
+ ffmpeg.addArgument("-i");
+ ffmpeg.addArgument(localPath);
+ ffmpeg.addArgument("-ss");
+ // 此处可自定义视频的秒数
+ ffmpeg.addArgument("0");
+ ffmpeg.addArgument(targetPath);
+ ffmpeg.execute();
+ try (BufferedReader br = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()))) {
+ blockFfmpeg(br);
+ }
+ } catch (IOException e) {
+ System.out.println("获取视频缩略图失败");
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * 抓拍实况
+ * @param localPath 实况地址
+ * @param targetPath 存放的目标路径
+ * @return 返回抓拍图片的文件名
+ */
+ // 获取实况抓拍图片
+ public static String getLiveCapture(String localPath, String targetPath) {
+
+ String formattedDate ="";
+
+ try {
+ ProcessWrapper ffmpeg = new DefaultFFMPEGLocator().createExecutor();
+ ffmpeg.addArgument("-i");
+ ffmpeg.addArgument(localPath);
+ ffmpeg.addArgument("-vf");
+ // 加上 "select=eq(pict_type\,I)" -frames:v 1
+ ffmpeg.addArgument("select='eq(pict_type,I)'");
+ ffmpeg.addArgument("-frames:v");
+ ffmpeg.addArgument("1");
+
+ // 生成一个根据时间的文件名
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+ // 获取当前时间
+ Date currentDate = new Date();
+ // 格式化时间为字符串
+ formattedDate = sdf.format(currentDate)+ ".jpg";
+
+ ffmpeg.addArgument(formattedDate);
+
+ ffmpeg.addArgument(targetPath + formattedDate);
+
+ ffmpeg.execute();
+ try (BufferedReader br = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()))) {
+ blockFfmpeg(br);
+ }
+ } catch (IOException e) {
+ formattedDate = "获取实况抓拍图片失败";
+ System.out.println(formattedDate);
+ e.printStackTrace();
+ return formattedDate;
+ } return formattedDate;
+ }
+
+ /**
+ * 等待命令执行成功,退出
+ *
+ * @param br
+ * @throws IOException
+ */
+ private static void blockFfmpeg(BufferedReader br) throws IOException {
+ String line;
+ // 该方法阻塞线程,直至合成成功
+ while ((line = br.readLine()) != null) {
+ doNothing(line);
+ }
+ }
+
+ /**
+ * 打印日志
+ *
+ * @param line
+ */
+ private static void doNothing(String line) {
+ // FIXME: 2023/1/31 正式使用时注释掉此行,仅用于观察日志
+ System.out.println(line);
+ }
+
+ /**
+ * 视频增加字幕
+ *
+ * @param originVideoPath 原视频地址
+ * @param targetVideoPath 目标视频地址
+ * @param srtPath 固定格式的srt文件地址或存储位置,字母文件名: xxx.srt,样例看博客
+ * @return
+ * @throws Exception
+ */
+ public static boolean addSubtitle(
+ String originVideoPath, String srtPath, String targetVideoPath) {
+ try {
+ ProcessWrapper ffmpeg = new DefaultFFMPEGLocator().createExecutor();
+ ffmpeg.addArgument("-i");
+ ffmpeg.addArgument(originVideoPath);
+ ffmpeg.addArgument("-i");
+ ffmpeg.addArgument(srtPath);
+ ffmpeg.addArgument("-c");
+ ffmpeg.addArgument("copy");
+ ffmpeg.addArgument(targetVideoPath);
+ ffmpeg.execute();
+ try (BufferedReader br = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()))) {
+ blockFfmpeg(br);
+ }
+ } catch (IOException e) {
+ System.out.println("字幕增加失败");
+ e.printStackTrace();
+ }
+ return true;
+ }
+
+ /**
+ * 常用命令
+ *
+ * @return
+ */
+ public static void cmd() {
+ // FIXME: 2023/1/31 还有很多类似命令 不再一一列举 ,附上命令,具体写法参考 getTargetThumbnail或addSubtitle方法
+ // FIXME: 2023/1/31 ffmpeg命令网上搜索即可
+
+ // 剪切视频
+ // ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vcodec copy -acodec copy output.mp4
+ // * -ss 指定从什么时间开始
+ // * -t 指定需要截取多长时间
+ // * -i 指定输入文件
+
+ // ffmpeg -ss 10 -t 15 -accurate_seek -i test.mp4 -codec copy cut.mp4
+ // ffmpeg -ss 10 -t 15 -accurate_seek -i test.mp4 -codec copy -avoid_negative_ts 1 cut.mp4
+
+ // 拼接MP4
+ // 第一种方法:
+ // ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -codec copy out_mp4.mp4
+ // 1.mp4 第一个视频文件的全路径
+ // 2.mp4 第二个视频文件的全路径
+
+ // 提取视频中的音频
+ // ffmpeg -i input.mp4 -acodec copy -vn output.mp3
+ // -vn: 去掉视频;-acodec: 音频选项, 一般后面加copy表示拷贝
+
+ // 音视频合成
+ // ffmpeg -y –i input.mp4 –i input.mp3 –vcodec copy –acodec copy output.mp4
+ // -y 覆盖输出文件
+
+ // 剪切视频
+ // ffmpeg -ss 0:1:30 -t 0:0:20 -i input.mp4 -vcodec copy -acodec copy output.mp4
+ // -ss 开始时间; -t 持续时间
+
+ // 视频截图
+ // ffmpeg –i test.mp4 –f image2 -t 0.001 -s 320x240 image-%3d.jpg
+ // -s 设置分辨率; -f 强迫采用格式fmt;
+
+ // 视频分解为图片
+ // ffmpeg –i test.mp4 –r 1 –f image2 image-%3d.jpg
+ // -r 指定截屏频率
+
+ // 将图片合成视频
+ // ffmpeg -f image2 -i image%d.jpg output.mp4
+
+ // 视频拼接
+ // ffmpeg -f concat -i filelist.txt -c copy output.mp4
+
+ // 将视频转为gif
+ // ffmpeg -i input.mp4 -ss 0:0:30 -t 10 -s 320x240 -pix_fmt rgb24 output.gif
+ // -pix_fmt 指定编码
+
+ // 视频添加水印
+ // ffmpeg -i input.mp4 -i logo.jpg
+ // -filter_complex[0:v][1:v]overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] -map [out] -map
+ // 0:a -codec:a copy output.mp4
+ // main_w-overlay_w-10 视频的宽度-水印的宽度-水印边距;
+
+ }
+}
+
diff --git a/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/FileCopyUtil.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/FileCopyUtil.java
new file mode 100644
index 0000000..22607b4
--- /dev/null
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/FileCopyUtil.java
@@ -0,0 +1,173 @@
+package com.visual.open.anpr.server.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+
+import java.io.*;
+
+
+@Slf4j
+public class FileCopyUtil {
+
+
+ /**
+ * 复制path目录下所有文件
+ * @param path 文件目录 不能以/开头
+ * @param newpath 新文件目录
+ */
+ public static void BatCopyFileFromJar(String path,String newpath) {
+ if (!new File(newpath).exists()){
+ new File(newpath).mkdir();
+ }
+ ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
+ try {
+ //获取所有匹配的文件
+ Resource[] resources = resolver.getResources(path+"/*");
+ //打印有多少文件
+ for(int i=0;i boolean isStartupFromJar() {
+ String protocol = FileCopyUtil.class.getResource("").getProtocol();
+ if ("jar".equals(protocol)){
+ return true;
+ }else {
+ return false;
+ }
+ }
+
+}
+
diff --git a/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/FreeMarkerUtil.java b/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/FreeMarkerUtil.java
new file mode 100644
index 0000000..2bc1bf4
--- /dev/null
+++ b/open-anpr-server/src/main/java/com/visual/open/anpr/server/utils/FreeMarkerUtil.java
@@ -0,0 +1,140 @@
+package com.visual.open.anpr.server.utils;
+
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+
+import java.io.*;
+
+/**
+ * @author:hahaha
+ * @creattime:2021-12-02 10:33
+ */
+
+public class FreeMarkerUtil {
+
+
+ /**
+ * 复制path目录下所有文件
+ * @param path 文件目录 不能以/开头
+ * @param newpath 新文件目录
+ */
+ public static void BatCopyFileFromJar(String path,String newpath) {
+ if (!new File(newpath).exists()){
+ new File(newpath).mkdir();
+ }
+ ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
+ try {
+ //获取所有匹配的文件
+ Resource[] resources = resolver.getResources(path+"/*");
+ //打印有多少文件
+ for(int i=0;i retryCount) {
+// break;
+// }
+// if (sleepTime != null && sleepTime > 0) {
+// // 休眠一段时间后重试
+// Thread.sleep(sleepTime);
+// }
+// count ++;
+// }
+// }
+// long end = System.currentTimeMillis();
+// long second = (end - start) / 1000;
+// logger.info("视频存储结束:"+ DateUtil.getCurrentDateTime());
+// logger.info("视频存储总耗时(秒):"+ second);
+// System.out.printf("转码完成,视频帧[%d],音频帧[%d],数据帧[%d]\r\n", videoframenum, audioframenum, dataframenum);
+// logger.info("转码完成,视频帧"+videoframenum+",音频帧" + audioframenum + ",数据帧" + dataframenum);
+// } catch (Exception e) {
+// e.printStackTrace();
+// } finally {
+// if (recorder != null) {
+// try {
+// recorder.close();
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+// }
+// try {
+// grabber.close();
+// } catch (FrameGrabber.Exception e) {
+// e.printStackTrace();
+// }
+// }
+// }
+//}
\ No newline at end of file
diff --git a/open-anpr-server/src/main/resources/application-local.yml b/open-anpr-server/src/main/resources/application-local.yml
index 4c5a222..3236858 100755
--- a/open-anpr-server/src/main/resources/application-local.yml
+++ b/open-anpr-server/src/main/resources/application-local.yml
@@ -1,7 +1,7 @@
# 开发环境配置
server:
# 服务器的HTTP端口,默认为80
- port: 8080
+ port: 1115
servlet:
# 应用的访问路径
context-path: /
diff --git a/open-anpr-core/src/main/resources/models/plate_detect.onnx b/open-anpr-server/src/main/resources/models/plate_detect.onnx
similarity index 100%
rename from open-anpr-core/src/main/resources/models/plate_detect.onnx
rename to open-anpr-server/src/main/resources/models/plate_detect.onnx
diff --git a/open-anpr-core/src/main/resources/models/plate_rec_color.onnx b/open-anpr-server/src/main/resources/models/plate_rec_color.onnx
similarity index 100%
rename from open-anpr-core/src/main/resources/models/plate_rec_color.onnx
rename to open-anpr-server/src/main/resources/models/plate_rec_color.onnx
diff --git a/open-anpr-test/pom.xml b/open-anpr-test/pom.xml
deleted file mode 100644
index 390aa6d..0000000
--- a/open-anpr-test/pom.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
- 4.0.0
-
- com.visual.open.anpr
- open-anpr-test
- 1.1.0
-
-
- 1.8
- 8
- 8
- UTF-8
-
-
-
-
- com.visual.open.anpr
- open-anpr-client
- ${project.version}
-
-
-
- org.openpnp
- opencv
- 4.6.0-0
-
-
-
-
\ No newline at end of file
diff --git a/open-anpr-test/src/main/java/com/visual/open/anpr/exps/PlateRecognitionExample.java b/open-anpr-test/src/main/java/com/visual/open/anpr/exps/PlateRecognitionExample.java
deleted file mode 100755
index 2797686..0000000
--- a/open-anpr-test/src/main/java/com/visual/open/anpr/exps/PlateRecognitionExample.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.visual.open.anpr.exps;
-
-import com.visual.open.anpr.PlateRecognition;
-import com.visual.open.anpr.model.*;
-import com.visual.open.anpr.utils.Base64Util;
-import com.visual.open.anpr.utils.DrawImage;
-import org.opencv.highgui.HighGui;
-
-import java.awt.*;
-import java.io.File;
-import java.util.List;
-import java.util.Objects;
-
-public class PlateRecognitionExample {
-
- static{ nu.pattern.OpenCV.loadShared(); }
- //本地开发模式
- public static String serverHost = "http://127.0.0.1:8080";
- //docker部署模式
- //public static String serverHost = "http://127.0.0.1:56790";
- //远程测试服务
- //public static String serverHost = "http://open-anpr.diven.nat300.top";
-
- public static PlateRecognition plateRecognition = PlateRecognition.build(serverHost);
-
- /**搜索*/
- public static void recognition() {
- String searchPath = "open-anpr-test/src/main/resources/image";
- File [] files = Objects.requireNonNull(new File(searchPath).listFiles());
- System.out.println(files.length);
- for(int i=0; i < files.length; i++){
- System.out.println(i);
- File imageA = files[i];
- String imageBase64 = Base64Util.encode(imageA.getAbsolutePath());
- Response> response = plateRecognition.detection().recognition(
- Recognition.build().setImage(imageBase64).setLimit(5)
- );
- DrawImage drawImage = DrawImage.build(imageA.getAbsolutePath());
- if(response.ok()){
- for(RecognitionRep recognitionRep : response.getData()){
- //画位置信息
- PlateLocation location = recognitionRep.getLocation();
- drawImage.drawLine(
- new DrawImage.Point(location.getLeftTop().getX(), location.getLeftTop().getY()),
- new DrawImage.Point(location.getRightTop().getX(), location.getRightTop().getY()),
- 2, Color.RED
- );
- drawImage.drawLine(
- new DrawImage.Point(location.getRightTop().getX(), location.getRightTop().getY()),
- new DrawImage.Point(location.getRightBottom().getX(), location.getRightBottom().getY()),
- 2, Color.RED
- );
- drawImage.drawLine(
- new DrawImage.Point(location.getRightBottom().getX(), location.getRightBottom().getY()),
- new DrawImage.Point(location.getLeftBottom().getX(), location.getLeftBottom().getY()),
- 2, Color.RED
- );
- drawImage.drawLine(
- new DrawImage.Point(location.getLeftBottom().getX(), location.getLeftBottom().getY()),
- new DrawImage.Point(location.getLeftTop().getX(), location.getLeftTop().getY()),
- 2, Color.RED
- );
- //画识别信息
- RecognitionInfo recognition = recognitionRep.getRecognition();
- int fonSize = Float.valueOf(1.4f * location.width() / recognition.getPlateNo().length()).intValue();
- drawImage.drawText(recognition.getPlateNo(),
- new DrawImage.Point(location.minX(), location.minY()-(int)(fonSize*2.2)), fonSize, Color.RED);
- drawImage.drawText((recognition.getLayout() == PlateLayout.SINGLE ? "单排" : "双排") + ":" + recognition.getPlateColor().getName(),
- new DrawImage.Point(location.minX(), location.minY()-(int)(fonSize*1.2)), fonSize, Color.RED);
- }
- }
- HighGui.imshow("image", drawImage.toMat());
- HighGui.waitKey();
- }
- //退出程序
- System.exit(1);
- }
-
- /**main**/
- public static void main(String[] args) {
- recognition();
- }
-
-}
diff --git a/open-anpr-test/src/main/java/com/visual/open/anpr/utils/MatUtil.java b/open-anpr-test/src/main/java/com/visual/open/anpr/utils/MatUtil.java
deleted file mode 100755
index 144f75e..0000000
--- a/open-anpr-test/src/main/java/com/visual/open/anpr/utils/MatUtil.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package com.visual.open.anpr.utils;
-
-import org.opencv.core.Mat;
-import org.opencv.core.Range;
-
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
-import java.util.Base64;
-import java.util.Objects;
-
-public class MatUtil {
-
- /**
- * 将Mat转换为BufferedImage
- * @param mat
- * @return BufferedImage
- */
- public static BufferedImage matToBufferedImage(Mat mat) {
- int dataSize = mat.cols() * mat.rows() * (int) mat.elemSize();
- byte[] data = new byte[dataSize];
- mat.get(0, 0, data);
- int type = mat.channels() == 1 ? BufferedImage.TYPE_BYTE_GRAY : BufferedImage.TYPE_3BYTE_BGR;
- if (type == BufferedImage.TYPE_3BYTE_BGR) {
- for (int i = 0; i < dataSize; i += 3) {
- byte blue = data[i + 0];
- data[i + 0] = data[i + 2];
- data[i + 2] = blue;
- }
- }
- BufferedImage image = new BufferedImage(mat.cols(), mat.rows(), type);
- image.getRaster().setDataElements(0, 0, mat.cols(), mat.rows(), data);
- return image;
- }
-
- /**
- * 将Mat转换为 Base64
- * @param mat
- * @return Base64
- */
- public static String matToBase64(Mat mat) {
- ByteArrayOutputStream byteArrayOutputStream = null;
- try {
- byteArrayOutputStream = new ByteArrayOutputStream();
- ImageIO.write(matToBufferedImage(mat), "jpg", byteArrayOutputStream);
- byte[] bytes = byteArrayOutputStream.toByteArray();
- Base64.Encoder encoder = Base64.getMimeEncoder();
- return encoder.encodeToString(Objects.requireNonNull(bytes));
- }catch (Exception e){
- throw new RuntimeException(e);
- }finally {
- if(null != byteArrayOutputStream){
- try {
- byteArrayOutputStream.close();
- } catch (Exception e) {}
- }
- }
- }
-
- public static Mat concat(Mat m1, Mat ...m2){
- Mat mat = m1;
- if(null != m2){
- for(Mat m : m2){
- mat = concat(mat, m1);
- }
- }
- return mat;
- }
-
- /**
- * 横向拼接两个图像的数据(Mat),该两个图像的类型必须是相同的类型,如:均为CvType.CV_8UC3类型
- * @author bailichun
- * @since 2020.02.20 15:00
- * @param m1 要合并的图像1(左图)
- * @param m2 要合并的图像2(右图)
- * @return 拼接好的Mat图像数据集。其高度等于两个图像中高度较大者的高度;其宽度等于两个图像的宽度之和。类型与两个输入图像相同。
- * @throws Exception 当两个图像数据的类型不同时,抛出异常
- */
- public static Mat concat(Mat m1, Mat m2){
- if(m1.type() != m2.type()){
- throw new RuntimeException("concat:两个图像数据的类型不同!");
- }
- long time = System.currentTimeMillis();
- //宽度为两图的宽度之和
- double w = m1.size().width + m2.size().width;
- //高度取两个矩阵中的较大者的高度
- double h = m1.size().height > m2.size().height ? m1.size().height : m2.size().height;
- //创建一个大矩阵对象
- Mat des = Mat.zeros((int)h, (int)w, m1.type());
- //在最终的大图上标记一块区域,用于存放复制图1(左图)的数据,大小为从第0列到m1.cols()列
- Mat rectForM1 = des.colRange(new Range(0, m1.cols()));
- //标记出位于rectForM1的垂直方向上中间位置的区域,高度为图1的高度,此时该区域的大小已经和图1的大小相同。(用于存放复制图1(左图)的数据)
- int rowOffset1 = (int)(rectForM1.size().height-m1.rows())/2;
- rectForM1 = rectForM1.rowRange(rowOffset1, rowOffset1 + m1.rows());
- //在最终的大图上标记一块区域,用于存放复制图2(右图)的数据
- Mat rectForM2 = des.colRange(new Range(m1.cols(), des.cols()));
- //标记出位于rectForM2的垂直方向上中间位置的区域,高度为图2的高度,此时该区域的大小已经和图2的大小相同。(用于存放复制图2(右图)的数据)
- int rowOffset2 = (int)(rectForM2.size().height-m2.rows())/2;
- rectForM2 = rectForM2.rowRange(rowOffset2, rowOffset2 + m2.rows());
- //将图1拷贝到des的指定区域 rectForM1
- m1.copyTo(rectForM1);
- //将图2拷贝到des的指定区域 rectForM2
- m2.copyTo(rectForM2);
- return des;
- }
-
-}
diff --git a/open-anpr-test/src/main/resources/image/image001.jpg b/open-anpr-test/src/main/resources/image/image001.jpg
deleted file mode 100644
index 972f10e..0000000
Binary files a/open-anpr-test/src/main/resources/image/image001.jpg and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image/image002.jpg b/open-anpr-test/src/main/resources/image/image002.jpg
deleted file mode 100644
index 215c8f6..0000000
Binary files a/open-anpr-test/src/main/resources/image/image002.jpg and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image/image003.jpg b/open-anpr-test/src/main/resources/image/image003.jpg
deleted file mode 100644
index c80eb40..0000000
Binary files a/open-anpr-test/src/main/resources/image/image003.jpg and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image/image004.jpg b/open-anpr-test/src/main/resources/image/image004.jpg
deleted file mode 100644
index eee6cac..0000000
Binary files a/open-anpr-test/src/main/resources/image/image004.jpg and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image/image005.jpg b/open-anpr-test/src/main/resources/image/image005.jpg
deleted file mode 100644
index f7c216d..0000000
Binary files a/open-anpr-test/src/main/resources/image/image005.jpg and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image/image006.jpg b/open-anpr-test/src/main/resources/image/image006.jpg
deleted file mode 100644
index 219a4c9..0000000
Binary files a/open-anpr-test/src/main/resources/image/image006.jpg and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image/image007.png b/open-anpr-test/src/main/resources/image/image007.png
deleted file mode 100644
index eabaf11..0000000
Binary files a/open-anpr-test/src/main/resources/image/image007.png and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image/image008.png b/open-anpr-test/src/main/resources/image/image008.png
deleted file mode 100644
index cde51c1..0000000
Binary files a/open-anpr-test/src/main/resources/image/image008.png and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image/image009.jpg b/open-anpr-test/src/main/resources/image/image009.jpg
deleted file mode 100644
index 9ac0bb1..0000000
Binary files a/open-anpr-test/src/main/resources/image/image009.jpg and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image/image010.jpg b/open-anpr-test/src/main/resources/image/image010.jpg
deleted file mode 100644
index 57cfb90..0000000
Binary files a/open-anpr-test/src/main/resources/image/image010.jpg and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image/image011.jpg b/open-anpr-test/src/main/resources/image/image011.jpg
deleted file mode 100644
index b42b61c..0000000
Binary files a/open-anpr-test/src/main/resources/image/image011.jpg and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image/image012.jpg b/open-anpr-test/src/main/resources/image/image012.jpg
deleted file mode 100644
index d583ac7..0000000
Binary files a/open-anpr-test/src/main/resources/image/image012.jpg and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image/image013.jpg b/open-anpr-test/src/main/resources/image/image013.jpg
deleted file mode 100644
index 993cd14..0000000
Binary files a/open-anpr-test/src/main/resources/image/image013.jpg and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image/image014.png b/open-anpr-test/src/main/resources/image/image014.png
deleted file mode 100644
index c0d49db..0000000
Binary files a/open-anpr-test/src/main/resources/image/image014.png and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image1/75a6f232_7346047.jpeg b/open-anpr-test/src/main/resources/image1/75a6f232_7346047.jpeg
deleted file mode 100644
index 7adbde8..0000000
Binary files a/open-anpr-test/src/main/resources/image1/75a6f232_7346047.jpeg and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image1/c4145e27_7346047.jpeg b/open-anpr-test/src/main/resources/image1/c4145e27_7346047.jpeg
deleted file mode 100644
index 4c78b78..0000000
Binary files a/open-anpr-test/src/main/resources/image1/c4145e27_7346047.jpeg and /dev/null differ
diff --git a/open-anpr-test/src/main/resources/image1/f7759908_7346047.png b/open-anpr-test/src/main/resources/image1/f7759908_7346047.png
deleted file mode 100644
index cbd7988..0000000
Binary files a/open-anpr-test/src/main/resources/image1/f7759908_7346047.png and /dev/null differ
diff --git a/pom.xml b/pom.xml
index 26f3f2b..e1825e2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,10 +17,7 @@
1.1.0
- open-anpr-core
open-anpr-server
- open-anpr-test
- open-anpr-client