From ec8fdc8aade80f03fd2e89fc5727e4459ea2fcb4 Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Fri, 4 Apr 2014 13:58:53 -0500 Subject: [PATCH] Revert "Using multiple instances of OCR and state recognizer for multiple threads" This reverts commit 29cb8fab213bfbc16b6a9674f6244d780f425533. --- src/openalpr/alpr_impl.cpp | 71 ++++++++------------------------------ src/openalpr/alpr_impl.h | 30 +++++----------- 2 files changed, 24 insertions(+), 77 deletions(-) diff --git a/src/openalpr/alpr_impl.cpp b/src/openalpr/alpr_impl.cpp index 51d5dfa..5c405a7 100644 --- a/src/openalpr/alpr_impl.cpp +++ b/src/openalpr/alpr_impl.cpp @@ -26,17 +26,8 @@ AlprImpl::AlprImpl(const std::string country, const std::string runtimeDir) { config = new Config(country, runtimeDir); plateDetector = new RegionDetector(config); - - int numThreads = getNumThreads(); - - for (int i = 0; i < numThreads; i++) - { - StateIdentifier* stateIdentifier = new StateIdentifier(config); - OCR* ocr = new OCR(config); - - stateIdentifiers.push_back(stateIdentifier); - ocrs.push_back(ocr); - } + stateIdentifier = new StateIdentifier(config); + ocr = new OCR(config); setNumThreads(0); @@ -77,28 +68,10 @@ AlprImpl::~AlprImpl() { delete config; delete plateDetector; - - for (int i = 0; i < stateIdentifiers.size(); i++) - { - delete stateIdentifiers[i]; - delete ocrs[i]; - } - - stateIdentifiers.clear(); - ocrs.clear(); + delete stateIdentifier; + delete ocr; } -int AlprImpl::getNumThreads() -{ - // Get the number of threads specified and make sure the value is sane (cannot be greater than CPU cores or less than 1) - int numThreads = config->multithreading_cores; - if (numThreads > tthread::thread::hardware_concurrency()) - numThreads = tthread::thread::hardware_concurrency(); - if (numThreads <= 0) - numThreads = 1; - - return numThreads; -} std::vector AlprImpl::recognize(cv::Mat img) { @@ -110,11 +83,15 @@ std::vector AlprImpl::recognize(cv::Mat img) vector plateRegions = plateDetector->detect(img); // Get the number of threads specified and make sure the value is sane (cannot be greater than CPU cores or less than 1) - int numThreads = getNumThreads(); + int numThreads = config->multithreading_cores; + if (numThreads > tthread::thread::hardware_concurrency()) + numThreads = tthread::thread::hardware_concurrency(); + if (numThreads <= 0) + numThreads = 1; PlateDispatcher dispatcher(plateRegions, &img, - config, stateIdentifiers, ocrs, + config, stateIdentifier, ocr, topN, detectRegion, defaultRegion); // Spawn n threads to process all of the candidate regions and recognize @@ -164,28 +141,13 @@ std::vector AlprImpl::recognize(cv::Mat img) void plateAnalysisThread(void* arg) { PlateDispatcher* dispatcher = (PlateDispatcher*) arg; - - timespec syncstarttime; - getTime(&syncstarttime); - - int threadID = dispatcher->getUniqueThreadId(); - Mat img = dispatcher->getImageCopy(); - if (dispatcher->config->debugGeneral) cout << "Thread: " << tthread::this_thread::get_id() << " Initialized" << endl; - - if (dispatcher->config->debugTiming) - { - timespec syncendtime; - getTime(&syncendtime); - cout << "Thread: " << tthread::this_thread::get_id() << " Synchronized initialization time in " << diffclock(syncstarttime, syncendtime) << "ms." << endl; - } int loop_count = 0; while (true) { - if (dispatcher->hasPlate() == false) break; @@ -196,7 +158,7 @@ void plateAnalysisThread(void* arg) // Get a single plate region from the queue Rect plateRegion = dispatcher->nextPlate(); - + Mat img = dispatcher->getImageCopy(); // Parallel section @@ -204,9 +166,6 @@ void plateAnalysisThread(void* arg) timespec platestarttime; getTime(&platestarttime); - StateIdentifier* stateIdentifier = dispatcher->stateIdentifiers[threadID]; - OCR* ocr = dispatcher->ocrs[threadID]; - LicensePlateCandidate lp(img, plateRegion, dispatcher->config); lp.recognize(); @@ -227,7 +186,7 @@ void plateAnalysisThread(void* arg) if (dispatcher->detectRegion) { char statecode[4]; - plateResult.regionConfidence = stateIdentifier->recognize(img, plateRegion, statecode); + plateResult.regionConfidence = dispatcher->stateIdentifier->recognize(img, plateRegion, statecode); if (plateResult.regionConfidence > 0) { plateResult.region = statecode; @@ -235,12 +194,12 @@ void plateAnalysisThread(void* arg) } - ocr->performOCR(lp.charSegmenter->getThresholds(), lp.charSegmenter->characters); + dispatcher->ocr->performOCR(lp.charSegmenter->getThresholds(), lp.charSegmenter->characters); - ocr->postProcessor->analyze(plateResult.region, dispatcher->topN); + dispatcher->ocr->postProcessor->analyze(plateResult.region, dispatcher->topN); //plateResult.characters = ocr->postProcessor->bestChars; - const vector ppResults = ocr->postProcessor->getResults(); + const vector ppResults = dispatcher->ocr->postProcessor->getResults(); int bestPlateIndex = 0; diff --git a/src/openalpr/alpr_impl.h b/src/openalpr/alpr_impl.h index 5915736..8fed548 100644 --- a/src/openalpr/alpr_impl.h +++ b/src/openalpr/alpr_impl.h @@ -63,17 +63,15 @@ class AlprImpl private: - int getNumThreads(); - cJSON* createJsonObj(const AlprResult* result); - RegionDetector* plateDetector; - vector stateIdentifiers; - vector ocrs; + StateIdentifier* stateIdentifier; + OCR* ocr; int topN; bool detectRegion; std::string defaultRegion; + cJSON* createJsonObj(const AlprResult* result); }; @@ -83,21 +81,19 @@ class PlateDispatcher public: PlateDispatcher(vector plateRegions, cv::Mat* image, Config* config, - vector stateIdentifiers, - vector ocrs, + StateIdentifier* stateIdentifier, + OCR* ocr, int topN, bool detectRegion, std::string defaultRegion) { this->plateRegions = plateRegions; this->frame = image; this->config = config; - this->stateIdentifiers = stateIdentifiers; - this->ocrs = ocrs; + this->stateIdentifier = stateIdentifier; + this->ocr = ocr; this->topN = topN; this->detectRegion = detectRegion; this->defaultRegion = defaultRegion; - - this->threadCounter = 0; } cv::Mat getImageCopy() @@ -109,13 +105,6 @@ class PlateDispatcher return img; } - - int getUniqueThreadId() - { - tthread::lock_guard guard(mMutex); - - return threadCounter++; - } bool hasPlate() { @@ -147,8 +136,8 @@ class PlateDispatcher } - vector stateIdentifiers; - vector ocrs; + StateIdentifier* stateIdentifier; + OCR* ocr; Config* config; int topN; @@ -157,7 +146,6 @@ class PlateDispatcher private: - int threadCounter; tthread::mutex mMutex; cv::Mat* frame; vector plateRegions;