diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/ExtParam.java b/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/ExtParam.java new file mode 100644 index 0000000..130bbfd --- /dev/null +++ b/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/ExtParam.java @@ -0,0 +1,45 @@ +package com.visual.open.anpr.core.domain; + +import java.io.Serializable; + +public class ExtParam implements Serializable { + + private float scoreTh; + + private float iouTh; + + private int topK = 5; + + private ExtParam(){} + + public static ExtParam build(){ + return new ExtParam(); + } + + public float getScoreTh() { + return scoreTh; + } + + public ExtParam setScoreTh(float scoreTh) { + this.scoreTh = scoreTh; + return this; + } + + public float getIouTh() { + return iouTh; + } + + public ExtParam setIouTh(float iouTh) { + this.iouTh = iouTh; + return this; + } + + public int getTopK() { + return topK; + } + + public ExtParam setTopK(int topK) { + this.topK = topK; + return this; + } +} diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/PlateImage.java b/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/PlateImage.java new file mode 100644 index 0000000..7d74083 --- /dev/null +++ b/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/PlateImage.java @@ -0,0 +1,62 @@ +package com.visual.open.anpr.core.domain; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class PlateImage implements Serializable { + + /**图像数据**/ + public String imageBase64; + /**人脸解析数据**/ + public List PlateInfos; + + /** + * 构建函数 + * @param imageBase64 图像数据 + * @param PlateInfos 人脸解析数据 + * @return + */ + private PlateImage(String imageBase64, List PlateInfos) { + this.imageBase64 = imageBase64; + this.PlateInfos = PlateInfos; + } + + /** + * 构建对象 + * @param imageBase64 图像数据 + * @param PlateInfos 人脸解析数据 + * @return + */ + public static PlateImage build(String imageBase64, List PlateInfos){ + if(PlateInfos == null){ + PlateInfos = new ArrayList<>(); + } + return new PlateImage(imageBase64, PlateInfos); + } + + /** + * 图像数据 + * @return + */ + public String imageBase64(){ + return this.imageBase64; + } + + /** + * 获取图像数据 + * @return + */ + public ImageMat imageMat(){ + return ImageMat.fromBase64(this.imageBase64); + } + + /** + * 获取人脸解析数据 + * @return + */ + public List PlateInfos(){ + return this.PlateInfos; + } + +} diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/PlateInfo.java b/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/PlateInfo.java index fa3d7ba..63bb07b 100755 --- a/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/PlateInfo.java +++ b/open-anpr-core/src/main/java/com/visual/open/anpr/core/domain/PlateInfo.java @@ -11,6 +11,8 @@ public class PlateInfo implements Comparable, Serializable { public PlateBox box; /**是否为单行车牌**/ public boolean single; + /**解析到的车牌信息**/ + public ParseInfo parseInfo; /** * 构造函数 @@ -312,8 +314,13 @@ public class PlateInfo implements Comparable, Serializable { } public static class ParseInfo implements Serializable { + /**当前图片的base64编码值**/ + public String image; + /**车牌文本信息**/ public String plateNo; + /**车牌的颜色信息**/ public String plateColor; + /**车牌颜色的分数**/ public float colorScore; private ParseInfo(String plateNo, String plateColor, float colorScore) { diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/extract/PlateExtractor.java b/open-anpr-core/src/main/java/com/visual/open/anpr/core/extract/PlateExtractor.java new file mode 100644 index 0000000..e30f32b --- /dev/null +++ b/open-anpr-core/src/main/java/com/visual/open/anpr/core/extract/PlateExtractor.java @@ -0,0 +1,19 @@ +package com.visual.open.anpr.core.extract; + +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 { + + /** + * 人脸特征提取 + * @param image + * @param extParam + * @param params + * @return + */ + public PlateImage extract(ImageMat image, ExtParam extParam, Map params); + +} diff --git a/open-anpr-core/src/main/java/com/visual/open/anpr/core/extract/PlateExtractorImpl.java b/open-anpr-core/src/main/java/com/visual/open/anpr/core/extract/PlateExtractorImpl.java new file mode 100644 index 0000000..6704a20 --- /dev/null +++ b/open-anpr-core/src/main/java/com/visual/open/anpr/core/extract/PlateExtractorImpl.java @@ -0,0 +1,42 @@ +package com.visual.open.anpr.core.extract; + +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.models.TorchPlateDetection; +import com.visual.open.anpr.core.models.TorchPlateRecognition; +import com.visual.open.anpr.core.utils.CropUtil; +import org.opencv.core.Mat; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PlateExtractorImpl implements PlateExtractor { + + private TorchPlateDetection torchPlateDetection; + private TorchPlateRecognition torchPlateRecognition; + + public PlateExtractorImpl(TorchPlateDetection torchPlateDetection, TorchPlateRecognition torchPlateRecognition) { + this.torchPlateDetection = torchPlateDetection; + this.torchPlateRecognition = torchPlateRecognition; + } + + @Override + public PlateImage extract(ImageMat image, ExtParam extParam, Map params) { + List plateInfos = torchPlateDetection.inference(image, extParam.getScoreTh(),extParam.getIouTh(), new HashMap<>()); + //取人脸topK + int topK = (extParam.getTopK() > 0) ? extParam.getTopK() : 5; + if(plateInfos.size() > topK){ + plateInfos = plateInfos.subList(0, topK); + } + //解析车牌信息 + for(PlateInfo plateInfo : plateInfos){ + Mat crop = CropUtil.crop(image.toCvMat(), plateInfo.box); + plateInfo.parseInfo = torchPlateRecognition.inference(ImageMat.fromCVMat(crop), plateInfo.single, new HashMap<>()); + } + //返回数据 + return PlateImage.build(image.toBase64AndNoReleaseMat(), plateInfos); + } +}