You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.3 KiB
84 lines
2.3 KiB
4 years ago
|
package com.yuxue.easypr.core;
|
||
|
|
||
|
import org.bytedeco.javacpp.opencv_core;
|
||
|
import org.bytedeco.javacpp.opencv_core.Mat;
|
||
|
import org.bytedeco.javacpp.opencv_ml.ANN_MLP;
|
||
|
|
||
|
import com.yuxue.constant.Constant;
|
||
|
import com.yuxue.util.Convert;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 字符检测
|
||
|
* @author yuxue
|
||
|
* @date 2020-04-24 15:31
|
||
|
*/
|
||
|
public class CharsIdentify {
|
||
|
|
||
|
private ANN_MLP ann=ANN_MLP.create();
|
||
|
|
||
|
public CharsIdentify() {
|
||
|
loadModel(Constant.DEFAULT_ANN_PATH);
|
||
|
}
|
||
|
|
||
|
public void loadModel(String path) {
|
||
|
this.ann.clear();
|
||
|
// 加载ann配置文件 图像转文字的训练库文件
|
||
|
//ann=ANN_MLP.loadANN_MLP(path, "ann");
|
||
|
ann = ANN_MLP.load(path);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @param input
|
||
|
* @param isChinese
|
||
|
* @return
|
||
|
*/
|
||
|
public String charsIdentify(final Mat input, final Boolean isChinese, final Boolean isSpeci) {
|
||
|
String result = "";
|
||
|
|
||
|
/*String name = "D:/PlateDetect/train/chars_recognise_ann/" + System.currentTimeMillis() + ".jpg";
|
||
|
opencv_imgcodecs.imwrite(name, input);
|
||
|
Mat img = opencv_imgcodecs.imread(name);
|
||
|
Mat f = CoreFunc.features(img, Constant.predictSize);*/
|
||
|
|
||
|
Mat f = CoreFunc.features(input, Constant.predictSize);
|
||
|
|
||
|
int index = this.classify(f, isChinese, isSpeci);
|
||
|
|
||
|
System.err.print(index);
|
||
|
if (index < Constant.numCharacter) {
|
||
|
result = String.valueOf(Constant.strCharacters[index]);
|
||
|
} else {
|
||
|
String s = Constant.strChinese[index - Constant.numCharacter];
|
||
|
result = Constant.KEY_CHINESE_MAP.get(s); // 编码转中文
|
||
|
}
|
||
|
System.err.println(result);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
private int classify(final Mat f, final Boolean isChinses, final Boolean isSpeci) {
|
||
|
int result = -1;
|
||
|
|
||
|
Mat output = new Mat(1, 140, opencv_core.CV_32F);
|
||
|
|
||
|
ann.predict(f, output, 0); // 预测结果
|
||
|
|
||
|
int ann_min = (!isChinses) ? ((isSpeci) ? 10 : 0) : Constant.numCharacter;
|
||
|
int ann_max = (!isChinses) ? Constant.numCharacter : Constant.numAll;
|
||
|
|
||
|
float maxVal = -2;
|
||
|
|
||
|
for (int j = ann_min; j < ann_max; j++) {
|
||
|
float val = Convert.toFloat(output.ptr(0, j));
|
||
|
if (val > maxVal) {
|
||
|
maxVal = val;
|
||
|
result = j;
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|