Added generic OCR wrapper for Tesseract

This commit is contained in:
Matt Hill
2016-07-02 08:37:15 -04:00
parent e3979c77bc
commit f215f92a82
11 changed files with 150 additions and 26 deletions

View File

@@ -31,6 +31,7 @@
#include "endtoendtest.h" #include "endtoendtest.h"
#include "detection/detectorfactory.h" #include "detection/detectorfactory.h"
#include "ocr/ocrfactory.h"
#include "support/filesystem.h" #include "support/filesystem.h"
using namespace std; using namespace std;
@@ -169,7 +170,7 @@ int main( int argc, const char** argv )
PreWarp prewarp(&config); PreWarp prewarp(&config);
Detector* plateDetector = createDetector(&config, &prewarp); Detector* plateDetector = createDetector(&config, &prewarp);
OCR ocr(&config); OCR* ocr = createOcr(&config);
vector<double> endToEndTimes; vector<double> endToEndTimes;
vector<double> regionDetectionTimes; vector<double> regionDetectionTimes;
@@ -230,14 +231,14 @@ int main( int argc, const char** argv )
lpAnalysisPositiveTimes.push_back(analysisTime); lpAnalysisPositiveTimes.push_back(analysisTime);
getTimeMonotonic(&startTime); getTimeMonotonic(&startTime);
ocr.performOCR(&pipeline_data); ocr->performOCR(&pipeline_data);
getTimeMonotonic(&endTime); getTimeMonotonic(&endTime);
double ocrTime = diffclock(startTime, endTime); double ocrTime = diffclock(startTime, endTime);
cout << "\tRegion " << z << ": OCR time: " << ocrTime << "ms." << endl; cout << "\tRegion " << z << ": OCR time: " << ocrTime << "ms." << endl;
ocrTimes.push_back(ocrTime); ocrTimes.push_back(ocrTime);
getTimeMonotonic(&startTime); getTimeMonotonic(&startTime);
ocr.postProcessor.analyze("", 25); ocr->postProcessor.analyze("", 25);
getTimeMonotonic(&endTime); getTimeMonotonic(&endTime);
double postProcessTime = diffclock(startTime, endTime); double postProcessTime = diffclock(startTime, endTime);
cout << "\tRegion " << z << ": PostProcess time: " << postProcessTime << "ms." << endl; cout << "\tRegion " << z << ": PostProcess time: " << postProcessTime << "ms." << endl;

View File

@@ -28,7 +28,8 @@
#include "licenseplatecandidate.h" #include "licenseplatecandidate.h"
#include "utility.h" #include "utility.h"
#include "support/filesystem.h" #include "support/filesystem.h"
#include "ocr.h" #include "ocr/ocrfactory.h"
#include "ocr/ocr.h"
using namespace std; using namespace std;
using namespace cv; using namespace cv;
@@ -120,7 +121,7 @@ int main( int argc, const char** argv )
config.debugGeneral = false; config.debugGeneral = false;
config.debugCharAnalysis = false; config.debugCharAnalysis = false;
config.debugCharSegmenter = false; config.debugCharSegmenter = false;
OCR ocr(&config); OCR* ocr = createOcr(&config);
if (DirectoryExists(inDir.c_str())) if (DirectoryExists(inDir.c_str()))
{ {
@@ -162,9 +163,9 @@ int main( int argc, const char** argv )
//ocr.cleanCharRegions(charSegmenter.thresholds, charSegmenter.characters); //ocr.cleanCharRegions(charSegmenter.thresholds, charSegmenter.characters);
ocr.performOCR(&pipeline_data); ocr->performOCR(&pipeline_data);
ocr.postProcessor.analyze(statecodestr, 25); ocr->postProcessor.analyze(statecodestr, 25);
cout << "OCR results: " << ocr.postProcessor.bestChars << endl; cout << "OCR results: " << ocr->postProcessor.bestChars << endl;
vector<bool> selectedBoxes(pipeline_data.thresholds.size()); vector<bool> selectedBoxes(pipeline_data.thresholds.size());
for (int z = 0; z < pipeline_data.thresholds.size(); z++) for (int z = 0; z < pipeline_data.thresholds.size(); z++)

View File

@@ -15,7 +15,9 @@ set(lpr_source_files
detection/detectormask.cpp detection/detectormask.cpp
licenseplatecandidate.cpp licenseplatecandidate.cpp
utility.cpp utility.cpp
ocr.cpp ocr/tesseract_ocr.cpp
ocr/ocr.cpp
ocr/ocrfactory.cpp
postprocess/postprocess.cpp postprocess/postprocess.cpp
postprocess/regexrule.cpp postprocess/regexrule.cpp
binarize_wolf.cpp binarize_wolf.cpp

View File

@@ -736,7 +736,7 @@ namespace alpr
// Country training data has not already been loaded. Load it. // Country training data has not already been loaded. Load it.
AlprRecognizers recognizer; AlprRecognizers recognizer;
recognizer.plateDetector = createDetector(config, prewarp); recognizer.plateDetector = createDetector(config, prewarp);
recognizer.ocr = new OCR(config); recognizer.ocr = createOcr(config);
#ifndef SKIP_STATE_DETECTION #ifndef SKIP_STATE_DETECTION
recognizer.stateDetector = new StateDetector(this->config->country, this->config->config_file_path, this->config->runtimeBaseDir); recognizer.stateDetector = new StateDetector(this->config->country, this->config->config_file_path, this->config->runtimeBaseDir);

View File

@@ -37,7 +37,8 @@
#include "licenseplatecandidate.h" #include "licenseplatecandidate.h"
#include "../statedetection/state_detector.h" #include "../statedetection/state_detector.h"
#include "segmentation/charactersegmenter.h" #include "segmentation/charactersegmenter.h"
#include "ocr.h" #include "ocr/ocr.h"
#include "ocr/ocrfactory.h"
#include "constants.h" #include "constants.h"

33
src/openalpr/ocr/ocr.cpp Normal file
View File

@@ -0,0 +1,33 @@
/*
* Copyright (c) 2015 OpenALPR Technology, Inc.
* Open source Automated License Plate Recognition [http://www.openalpr.com]
*
* This file is part of OpenALPR.
*
* OpenALPR is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License
* version 3 as published by the Free Software Foundation
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ocr.h"
namespace alpr
{
OCR::OCR(Config* config) : postProcessor(config) {
this->config = config;
}
OCR::~OCR() {
}
}

44
src/openalpr/ocr/ocr.h Normal file
View File

@@ -0,0 +1,44 @@
/*
* Copyright (c) 2015 OpenALPR Technology, Inc.
* Open source Automated License Plate Recognition [http://www.openalpr.com]
*
* This file is part of OpenALPR.
*
* OpenALPR is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License
* version 3 as published by the Free Software Foundation
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OPENALPR_OCR_H
#define OPENALPR_OCR_H
#include "postprocess/postprocess.h"
#include "pipeline_data.h"
namespace alpr
{
class OCR {
public:
OCR(Config* config);
virtual ~OCR();
virtual void performOCR(PipelineData* pipeline_data)=0;
PostProcess postProcessor;
protected:
Config* config;
};
}
#endif /* OPENALPR_OCR_H */

View File

@@ -0,0 +1,12 @@
#include "ocrfactory.h"
#include "tesseract_ocr.h"
namespace alpr
{
OCR* createOcr(Config* config)
{
return new TesseractOcr(config);
}
}

View File

@@ -0,0 +1,33 @@
/*
* Copyright (c) 2015 OpenALPR Technology, Inc.
* Open source Automated License Plate Recognition [http://www.openalpr.com]
*
* This file is part of OpenALPR.
*
* OpenALPR is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License
* version 3 as published by the Free Software Foundation
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OPENALPR_OCRFACTORY_H
#define OPENALPR_OCRFACTORY_H
#include "config.h"
#include "ocr.h"
namespace alpr
{
OCR* createOcr(Config* config);
}
#endif /* OPENALPR_DETECTORFACTORY_H */

View File

@@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "ocr.h" #include "tesseract_ocr.h"
using namespace std; using namespace std;
using namespace cv; using namespace cv;
@@ -26,12 +26,11 @@ using namespace tesseract;
namespace alpr namespace alpr
{ {
OCR::OCR(Config* config) TesseractOcr::TesseractOcr(Config* config)
: postProcessor(config) : OCR(config)
{ {
const string MINIMUM_TESSERACT_VERSION = "3.03"; const string MINIMUM_TESSERACT_VERSION = "3.03";
this->config = config;
if (cmpVersion(tesseract.Version(), MINIMUM_TESSERACT_VERSION.c_str()) < 0) if (cmpVersion(tesseract.Version(), MINIMUM_TESSERACT_VERSION.c_str()) < 0)
{ {
@@ -46,12 +45,12 @@ namespace alpr
tesseract.SetPageSegMode(PSM_SINGLE_CHAR); tesseract.SetPageSegMode(PSM_SINGLE_CHAR);
} }
OCR::~OCR() TesseractOcr::~TesseractOcr()
{ {
tesseract.End(); tesseract.End();
} }
void OCR::performOCR(PipelineData* pipeline_data) void TesseractOcr::performOCR(PipelineData* pipeline_data)
{ {
const int SPACE_CHAR_CODE = 32; const int SPACE_CHAR_CODE = 32;

View File

@@ -17,14 +17,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef OPENALPR_OCR_H #ifndef OPENALPR_TESSERACTOCR_H
#define OPENALPR_OCR_H #define OPENALPR_TESSERACTOCR_H
#include <iostream> #include <iostream>
#include <stdio.h> #include <stdio.h>
#include "utility.h" #include "utility.h"
#include "postprocess/postprocess.h"
#include "config.h" #include "config.h"
#include "pipeline_data.h" #include "pipeline_data.h"
@@ -33,24 +32,23 @@
#include "support/filesystem.h" #include "support/filesystem.h"
#include "support/version.h" #include "support/version.h"
#include "ocr.h"
#include "tesseract/baseapi.h" #include "tesseract/baseapi.h"
namespace alpr namespace alpr
{ {
class OCR class TesseractOcr : public OCR
{ {
public: public:
OCR(Config* config); TesseractOcr(Config* config);
virtual ~OCR(); virtual ~TesseractOcr();
void performOCR(PipelineData* pipeline_data); void performOCR(PipelineData* pipeline_data);
PostProcess postProcessor;
private: private:
Config* config;
tesseract::TessBaseAPI tesseract; tesseract::TessBaseAPI tesseract;
@@ -58,4 +56,4 @@ namespace alpr
} }
#endif // OPENALPR_OCR_H #endif // OPENALPR_TESSERACTOCR_H