diff --git a/src/misc_utilities/benchmark.cpp b/src/misc_utilities/benchmark.cpp index 832e5c6..4c9011b 100644 --- a/src/misc_utilities/benchmark.cpp +++ b/src/misc_utilities/benchmark.cpp @@ -150,7 +150,7 @@ int main( int argc, const char** argv ) string fullpath = inDir + "/" + files[i]; frame = imread( fullpath.c_str() ); - vector regions = plateDetector.detect(frame); + vector regions = plateDetector.detect(frame); imshow("Current LP", frame); waitKey(5); @@ -200,7 +200,7 @@ int main( int argc, const char** argv ) endToEndTimes.push_back(endToEndTime); getTime(&startTime); - vector regions = plateDetector.detect(frame); + vector regions = plateDetector.detect(frame); getTime(&endTime); double regionDetectionTime = diffclock(startTime, endTime); @@ -211,14 +211,14 @@ int main( int argc, const char** argv ) { getTime(&startTime); char temp[5]; - stateIdentifier.recognize(frame, regions[z], temp); + stateIdentifier.recognize(frame, regions[z].rect, temp); getTime(&endTime); double stateidTime = diffclock(startTime, endTime); cout << "\tRegion " << z << ": State ID time: " << stateidTime << "ms." << endl; stateIdTimes.push_back(stateidTime); getTime(&startTime); - LicensePlateCandidate lp(frame, regions[z], &config); + LicensePlateCandidate lp(frame, regions[z].rect, &config); lp.recognize(); getTime(&endTime); double analysisTime = diffclock(startTime, endTime); diff --git a/src/openalpr/alpr_impl.cpp b/src/openalpr/alpr_impl.cpp index e755db5..baa2879 100644 --- a/src/openalpr/alpr_impl.cpp +++ b/src/openalpr/alpr_impl.cpp @@ -79,7 +79,7 @@ std::vector AlprImpl::recognize(cv::Mat img) // Find all the candidate regions - vector plateRegions = plateDetector->detect(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 = config->multithreading_cores; @@ -120,7 +120,7 @@ std::vector AlprImpl::recognize(cv::Mat img) { for (int i = 0; i < plateRegions.size(); i++) { - rectangle(img, plateRegions[i], Scalar(0, 0, 255), 2); + rectangle(img, plateRegions[i].rect, Scalar(0, 0, 255), 2); } for (int i = 0; i < dispatcher.getRecognitionResults().size(); i++) @@ -137,8 +137,9 @@ std::vector AlprImpl::recognize(cv::Mat img) displayImage(config, "Main Image", img); // Pause indefinitely until they press a key - while ((char) cv::waitKey(50) == -1) - {} + cv::waitKey(1); + //while ((char) cv::waitKey(50) == -1) + // {} } @@ -163,7 +164,7 @@ void plateAnalysisThread(void* arg) cout << "Thread: " << tthread::this_thread::get_id() << " loop " << ++loop_count << endl; // Get a single plate region from the queue - Rect plateRegion = dispatcher->nextPlate(); + PlateRegion plateRegion = dispatcher->nextPlate(); Mat img = dispatcher->getImageCopy(); @@ -172,7 +173,7 @@ void plateAnalysisThread(void* arg) timespec platestarttime; getTime(&platestarttime); - LicensePlateCandidate lp(img, plateRegion, dispatcher->config); + LicensePlateCandidate lp(img, plateRegion.rect, dispatcher->config); lp.recognize(); @@ -192,7 +193,7 @@ void plateAnalysisThread(void* arg) if (dispatcher->detectRegion) { char statecode[4]; - plateResult.regionConfidence = dispatcher->stateIdentifier->recognize(img, plateRegion, statecode); + plateResult.regionConfidence = dispatcher->stateIdentifier->recognize(img, plateRegion.rect, statecode); if (plateResult.regionConfidence > 0) { plateResult.region = statecode; diff --git a/src/openalpr/alpr_impl.h b/src/openalpr/alpr_impl.h index 1dadd25..98ccf8b 100644 --- a/src/openalpr/alpr_impl.h +++ b/src/openalpr/alpr_impl.h @@ -78,7 +78,7 @@ class AlprImpl class PlateDispatcher { public: - PlateDispatcher(vector plateRegions, cv::Mat* image, + PlateDispatcher(vector plateRegions, cv::Mat* image, Config* config, StateIdentifier* stateIdentifier, OCR* ocr, @@ -113,11 +113,11 @@ class PlateDispatcher mMutex.unlock(); return plateAvailable; } - Rect nextPlate() + PlateRegion nextPlate() { tthread::lock_guard guard(mMutex); - Rect plateRegion = plateRegions[plateRegions.size() - 1]; + PlateRegion plateRegion = plateRegions[plateRegions.size() - 1]; plateRegions.pop_back(); return plateRegion; @@ -147,7 +147,7 @@ class PlateDispatcher tthread::mutex mMutex; cv::Mat* frame; - vector plateRegions; + vector plateRegions; vector recognitionResults; }; diff --git a/src/openalpr/regiondetector.cpp b/src/openalpr/regiondetector.cpp index d2a7023..063dee0 100644 --- a/src/openalpr/regiondetector.cpp +++ b/src/openalpr/regiondetector.cpp @@ -57,19 +57,19 @@ bool RegionDetector::isLoaded() return this->loaded; } -vector RegionDetector::detect(Mat frame) +vector RegionDetector::detect(Mat frame) { Mat frame_gray; cvtColor( frame, frame_gray, CV_BGR2GRAY ); - vector regionsOfInterest = doCascade(frame_gray); + vector regionsOfInterest = doCascade(frame_gray); return regionsOfInterest; } /** @function detectAndDisplay */ -vector RegionDetector::doCascade(Mat frame) +vector RegionDetector::doCascade(Mat frame) { //float scale_factor = 1; int w = frame.size().width; @@ -116,6 +116,28 @@ vector RegionDetector::doCascade(Mat frame) plates[i].height = plates[i].height / scale_factor; } - return plates; + vector orderedRegions = aggregateRegions(plates); + + return orderedRegions; } + +vector RegionDetector::aggregateRegions(vector regions) +{ + // Combines overlapping regions into a parent->child order. + // The largest regions will be parents, and they will have children if they are within them. + // This way, when processing regions later, we can process the parents first, and only delve into the children + // If there was no plate match. Otherwise, we would process everything and that would be wasteful. + + vector orderedRegions; + + // For now, just return a full list with no children, so I can get the plumbing sorted. + for (int i = 0; i < regions.size(); i++) + { + PlateRegion newRegion; + newRegion.rect = regions[i]; + orderedRegions.push_back(newRegion); + } + + return orderedRegions; +} diff --git a/src/openalpr/regiondetector.h b/src/openalpr/regiondetector.h index c0d63c2..867225b 100644 --- a/src/openalpr/regiondetector.h +++ b/src/openalpr/regiondetector.h @@ -33,6 +33,12 @@ #include "support/timing.h" #include "constants.h" +struct PlateRegion +{ + Rect rect; + vector children; +}; + class RegionDetector { @@ -41,7 +47,7 @@ class RegionDetector virtual ~RegionDetector(); bool isLoaded(); - vector detect(Mat frame); + vector detect(Mat frame); private: Config* config; @@ -51,8 +57,9 @@ class RegionDetector bool loaded; - vector doCascade(Mat frame); + vector doCascade(Mat frame); + vector aggregateRegions(vector regions); }; #endif // REGIONDETECTOR_H