Skip to content

Commit

Permalink
Temporary "confidence level" calculated from character costs
Browse files Browse the repository at this point in the history
  • Loading branch information
oskopek committed Jan 5, 2017
1 parent 94d106b commit 72e5073
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 16 deletions.
14 changes: 7 additions & 7 deletions src/main/java/net/sf/javaanpr/intelligence/Intelligence.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,7 @@
import net.sf.javaanpr.gui.TimeMeter;
import net.sf.javaanpr.imageanalysis.*;
import net.sf.javaanpr.jar.Main;
import net.sf.javaanpr.recognizer.CharacterRecognizer;
import net.sf.javaanpr.recognizer.RecognizedChar;
import net.sf.javaanpr.recognizer.KnnPatternClassificator;
import net.sf.javaanpr.recognizer.NeuralPatternClassificator;
import net.sf.javaanpr.recognizer.*;
import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
Expand Down Expand Up @@ -164,6 +161,7 @@ public String recognize(CarSnapshot carSnapshot, final boolean enableReportGener
for (Char chr : chars) {
chr.normalize();
}
int errors = 0;
float averageHeight = plate.getAveragePieceHeight(chars);
float averageContrast = plate.getAveragePieceContrast(chars);
float averageBrightness = plate.getAveragePieceBrightness(chars);
Expand Down Expand Up @@ -280,14 +278,16 @@ public String recognize(CarSnapshot carSnapshot, final boolean enableReportGener
continue;
}
lastProcessDuration = time.getTime();
String parsedOutput = Intelligence.parser.parse(recognizedPlate, syntaxAnalysisMode);
Parser.FinalPlate outputPlate = Intelligence.parser.parseToPlate(recognizedPlate, syntaxAnalysisMode);
if (enableReportGeneration) {
Main.rg.insertText("<span class='recognized'>");
Main.rg.insertText("Recognized plate : " + parsedOutput);
Main.rg.insertText("Recognized plate : " + outputPlate.getPlate());
Main.rg.insertText("Plate cost (confidence 0-n, 0 best): " + outputPlate.getCost());
Main.rg.insertText("</span>");
Main.rg.finish();
}
return parsedOutput;
System.out.println("Cost: " + outputPlate.getCost());
return outputPlate.getPlate();
}
}
// TODO failed!
Expand Down
42 changes: 33 additions & 9 deletions src/main/java/net/sf/javaanpr/intelligence/Parser.java
Original file line number Diff line number Diff line change
Expand Up @@ -168,14 +168,18 @@ public void invertFlags() {
* @return the parsed recognized plate text
*/
public String parse(RecognizedPlate recognizedPlate, SyntaxAnalysisMode syntaxAnalysisMode) {
return parseToPlate(recognizedPlate, syntaxAnalysisMode).getPlate();
}

public FinalPlate parseToPlate(RecognizedPlate recognizedPlate, SyntaxAnalysisMode syntaxAnalysisMode) {
int length = recognizedPlate.getChars().size();

switch (syntaxAnalysisMode) {
case DO_NOT_PARSE:
Main.rg.insertText(
" result : " + recognizedPlate.getString() + " --> <font size=15>" + recognizedPlate.getString()
+ "</font><hr><br>");
return recognizedPlate.getString();
return recognizedPlate.getFinalPlate();
case ONLY_EQUAL_LENGTH:
this.unFlagAll();
this.flagEqualLength(length);
Expand All @@ -200,15 +204,16 @@ public String parse(RecognizedPlate recognizedPlate, SyntaxAnalysisMode syntaxAn
FinalPlate finalPlate = new FinalPlate();
for (int j = 0; j < form.length(); j++) { // all chars of the form
RecognizedChar rc = recognizedPlate.getChar(j + i);
if (form.getPosition(j).isAllowed(rc.getPattern(0).getChar())) {
finalPlate.addChar(rc.getPattern(0).getChar());
RecognizedPattern pattern = rc.getPattern(0);
if (form.getPosition(j).isAllowed(pattern.getChar())) {
finalPlate.addChar(pattern.getChar(), pattern.getCost());
} else { // a swap needed
finalPlate.requiredChanges++; // +1 for every char
for (int x = 0; x < rc.getPatterns().size(); x++) {
if (form.getPosition(j).isAllowed(rc.getPattern(x).getChar())) {
RecognizedPattern rp = rc.getPattern(x);
finalPlate.requiredChanges += (rp.getCost() / 100); // +x for its cost
finalPlate.addChar(rp.getChar());
finalPlate.addChar(rp.getChar(), rp.getCost());
break;
}
}
Expand All @@ -219,7 +224,7 @@ public String parse(RecognizedPlate recognizedPlate, SyntaxAnalysisMode syntaxAn
}
}
if (finalPlates.size() == 0) {
return recognizedPlate.getString();
return recognizedPlate.getFinalPlate();
}
// else: find the plate with lowest number of swaps
float minimalChanges = Float.POSITIVE_INFINITY;
Expand All @@ -232,9 +237,9 @@ public String parse(RecognizedPlate recognizedPlate, SyntaxAnalysisMode syntaxAn
minimalIndex = i;
}
}
String toReturn = recognizedPlate.getString();
FinalPlate toReturn = recognizedPlate.getFinalPlate();
if (finalPlates.elementAt(minimalIndex).requiredChanges <= 2) {
toReturn = finalPlates.elementAt(minimalIndex).plate;
toReturn = finalPlates.elementAt(minimalIndex);
}
return toReturn;
}
Expand Down Expand Up @@ -282,16 +287,35 @@ public boolean isAllowed(char chr) {
}
}

public final class FinalPlate {
public static final class FinalPlate {
private String plate;
private float cost = 0;
private float requiredChanges = 0;

private FinalPlate() {
this.plate = "";
}

public void addChar(char chr) {
public FinalPlate(String plate, float cost) {
this.plate = plate;
this.cost = cost;
}

public void addChar(char chr, float cost) {
this.plate = this.plate + chr;
this.cost += cost;
}

public String getPlate() {
return plate;
}

public float getCost() {
return cost;
}

public float getRequiredChanges() {
return requiredChanges;
}
}
}
12 changes: 12 additions & 0 deletions src/main/java/net/sf/javaanpr/intelligence/RecognizedPlate.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package net.sf.javaanpr.intelligence;

import net.sf.javaanpr.recognizer.RecognizedChar;
import net.sf.javaanpr.recognizer.RecognizedPattern;

import java.util.Vector;

Expand Down Expand Up @@ -68,6 +69,17 @@ public String getString() {
return ret;
}

public Parser.FinalPlate getFinalPlate() {
String plate = "";
float cost = 0;
for (RecognizedChar recognizedChar : chars) {
RecognizedPattern pattern = recognizedChar.getPattern(0);
plate += pattern.getChar();
cost += pattern.getCost();
}
return new Parser.FinalPlate(plate, cost);
}

/**
* @return All the {@code RecognizedChar}s added to this plate
*/
Expand Down

0 comments on commit 72e5073

Please sign in to comment.