mirror of
https://github.com/kerberos-io/openalpr-base.git
synced 2025-10-06 06:36:50 +08:00
Moved more data members to textline
This commit is contained in:
@@ -39,7 +39,7 @@ CharacterRegion::CharacterRegion(PipelineData* pipeline_data)
|
|||||||
charAnalysis->analyze();
|
charAnalysis->analyze();
|
||||||
pipeline_data->plate_inverted = charAnalysis->thresholdsInverted;
|
pipeline_data->plate_inverted = charAnalysis->thresholdsInverted;
|
||||||
|
|
||||||
if (this->debug && charAnalysis->linePolygon.size() > 0)
|
if (this->debug && pipeline_data->textLines.size() > 0)
|
||||||
{
|
{
|
||||||
vector<Mat> tempDash;
|
vector<Mat> tempDash;
|
||||||
for (uint z = 0; z < pipeline_data->thresholds.size(); z++)
|
for (uint z = 0; z < pipeline_data->thresholds.size(); z++)
|
||||||
@@ -67,7 +67,7 @@ CharacterRegion::CharacterRegion(PipelineData* pipeline_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (charAnalysis->linePolygon.size() > 0)
|
if (pipeline_data->textLines.size() > 0)
|
||||||
{
|
{
|
||||||
int confidenceDrainers = 0;
|
int confidenceDrainers = 0;
|
||||||
int charSegmentCount = charAnalysis->bestContours.getGoodIndicesCount();
|
int charSegmentCount = charAnalysis->bestContours.getGoodIndicesCount();
|
||||||
|
@@ -51,7 +51,7 @@ CharacterSegmenter::CharacterSegmenter(PipelineData* pipeline_data)
|
|||||||
displayImage(config, "CharacterSegmenter Thresholds", drawImageDashboard(pipeline_data->thresholds, CV_8U, 3));
|
displayImage(config, "CharacterSegmenter Thresholds", drawImageDashboard(pipeline_data->thresholds, CV_8U, 3));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->config->debugCharSegmenter && charAnalysis->linePolygon.size() > 0)
|
if (this->config->debugCharSegmenter && pipeline_data->textLines.size() > 0)
|
||||||
{
|
{
|
||||||
Mat img_contours(charAnalysis->bestThreshold.size(), CV_8U);
|
Mat img_contours(charAnalysis->bestThreshold.size(), CV_8U);
|
||||||
charAnalysis->bestThreshold.copyTo(img_contours);
|
charAnalysis->bestThreshold.copyTo(img_contours);
|
||||||
@@ -74,20 +74,21 @@ CharacterSegmenter::CharacterSegmenter(PipelineData* pipeline_data)
|
|||||||
cv::Scalar(0,255,0), // in green
|
cv::Scalar(0,255,0), // in green
|
||||||
1); // with a thickness of 1
|
1); // with a thickness of 1
|
||||||
|
|
||||||
if (charAnalysis->linePolygon.size() > 0)
|
|
||||||
{
|
line(img_contours, pipeline_data->textLines[0].linePolygon[0], pipeline_data->textLines[0].linePolygon[1], Scalar(255, 0, 255), 1);
|
||||||
line(img_contours, charAnalysis->linePolygon[0], charAnalysis->linePolygon[1], Scalar(255, 0, 255), 1);
|
line(img_contours, pipeline_data->textLines[0].linePolygon[3], pipeline_data->textLines[0].linePolygon[2], Scalar(255, 0, 255), 1);
|
||||||
line(img_contours, charAnalysis->linePolygon[3], charAnalysis->linePolygon[2], Scalar(255, 0, 255), 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
Mat bordered = addLabel(img_contours, "Best Contours");
|
Mat bordered = addLabel(img_contours, "Best Contours");
|
||||||
imgDbgGeneral.push_back(bordered);
|
imgDbgGeneral.push_back(bordered);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (charAnalysis->linePolygon.size() > 0)
|
if (pipeline_data->textLines.size() > 0)
|
||||||
{
|
{
|
||||||
this->top = LineSegment(charAnalysis->linePolygon[0].x, charAnalysis->linePolygon[0].y, charAnalysis->linePolygon[1].x, charAnalysis->linePolygon[1].y);
|
this->top = LineSegment(pipeline_data->textLines[0].linePolygon[0].x, pipeline_data->textLines[0].linePolygon[0].y,
|
||||||
this->bottom = LineSegment(charAnalysis->linePolygon[3].x, charAnalysis->linePolygon[3].y, charAnalysis->linePolygon[2].x, charAnalysis->linePolygon[2].y);
|
pipeline_data->textLines[0].linePolygon[1].x, pipeline_data->textLines[0].linePolygon[1].y);
|
||||||
|
this->bottom = LineSegment(pipeline_data->textLines[0].linePolygon[3].x, pipeline_data->textLines[0].linePolygon[3].y,
|
||||||
|
pipeline_data->textLines[0].linePolygon[2].x, pipeline_data->textLines[0].linePolygon[2].y);
|
||||||
|
|
||||||
vector<int> charWidths;
|
vector<int> charWidths;
|
||||||
vector<int> charHeights;
|
vector<int> charHeights;
|
||||||
@@ -120,7 +121,7 @@ CharacterSegmenter::CharacterSegmenter(PipelineData* pipeline_data)
|
|||||||
{
|
{
|
||||||
Mat histogramMask = Mat::zeros(pipeline_data->thresholds[i].size(), CV_8U);
|
Mat histogramMask = Mat::zeros(pipeline_data->thresholds[i].size(), CV_8U);
|
||||||
|
|
||||||
fillConvexPoly(histogramMask, charAnalysis->linePolygon.data(), charAnalysis->linePolygon.size(), Scalar(255,255,255));
|
fillConvexPoly(histogramMask, pipeline_data->textLines[0].linePolygon.data(), pipeline_data->textLines[0].linePolygon.size(), Scalar(255,255,255));
|
||||||
|
|
||||||
VerticalHistogram vertHistogram(pipeline_data->thresholds[i], histogramMask);
|
VerticalHistogram vertHistogram(pipeline_data->thresholds[i], histogramMask);
|
||||||
|
|
||||||
|
@@ -49,6 +49,7 @@ void CharacterAnalysis::analyze()
|
|||||||
timespec startTime;
|
timespec startTime;
|
||||||
getTime(&startTime);
|
getTime(&startTime);
|
||||||
|
|
||||||
|
pipeline_data->textLines.clear();
|
||||||
|
|
||||||
for (uint i = 0; i < pipeline_data->thresholds.size(); i++)
|
for (uint i = 0; i < pipeline_data->thresholds.size(); i++)
|
||||||
{
|
{
|
||||||
@@ -149,18 +150,19 @@ void CharacterAnalysis::analyze()
|
|||||||
displayImage(config, "Matching Contours", img_contours);
|
displayImage(config, "Matching Contours", img_contours);
|
||||||
}
|
}
|
||||||
|
|
||||||
this->linePolygon = getBestVotedLines(pipeline_data->crop_gray, bestContours);
|
vector<Point> linePolygon = getBestVotedLines(pipeline_data->crop_gray, bestContours);
|
||||||
|
|
||||||
if (this->linePolygon.size() > 0)
|
if (linePolygon.size() > 0)
|
||||||
{
|
{
|
||||||
LineSegment topLine = LineSegment(this->linePolygon[0].x, this->linePolygon[0].y, this->linePolygon[1].x, this->linePolygon[1].y);
|
|
||||||
LineSegment bottomLine = LineSegment(this->linePolygon[3].x, this->linePolygon[3].y, this->linePolygon[2].x, this->linePolygon[2].y);
|
LineSegment topLine = LineSegment(linePolygon[0].x, linePolygon[0].y, linePolygon[1].x, linePolygon[1].y);
|
||||||
|
LineSegment bottomLine = LineSegment(linePolygon[3].x, linePolygon[3].y, linePolygon[2].x, linePolygon[2].y);
|
||||||
|
|
||||||
filterBetweenLines(bestThreshold, bestContours, linePolygon);
|
filterBetweenLines(bestThreshold, bestContours, linePolygon);
|
||||||
|
|
||||||
vector<Point> textArea = getCharArea(topLine, bottomLine);
|
vector<Point> textArea = getCharArea(topLine, bottomLine);
|
||||||
|
|
||||||
TextLine textLine(textArea, topLine, bottomLine);
|
TextLine textLine(textArea, linePolygon);
|
||||||
|
|
||||||
pipeline_data->textLines.push_back(textLine);
|
pipeline_data->textLines.push_back(textLine);
|
||||||
}
|
}
|
||||||
|
@@ -39,8 +39,6 @@ class CharacterAnalysis
|
|||||||
|
|
||||||
TextContours bestContours;
|
TextContours bestContours;
|
||||||
|
|
||||||
std::vector<cv::Point> linePolygon;
|
|
||||||
|
|
||||||
bool thresholdsInverted;
|
bool thresholdsInverted;
|
||||||
bool isTwoLine;
|
bool isTwoLine;
|
||||||
|
|
||||||
|
@@ -20,12 +20,15 @@
|
|||||||
|
|
||||||
#include "textline.h"
|
#include "textline.h"
|
||||||
|
|
||||||
TextLine::TextLine(std::vector<cv::Point> textArea, LineSegment topLine, LineSegment bottomLine) {
|
TextLine::TextLine(std::vector<cv::Point> textArea, std::vector<cv::Point> linePolygon) {
|
||||||
if (textArea.size() > 0)
|
if (textArea.size() > 0)
|
||||||
{
|
{
|
||||||
this->textArea = textArea;
|
this->textArea = textArea;
|
||||||
this->topLine = topLine;
|
this->linePolygon = linePolygon;
|
||||||
this->bottomLine = bottomLine;
|
|
||||||
|
this->topLine = LineSegment(linePolygon[0].x, linePolygon[0].y, linePolygon[1].x, linePolygon[1].y);
|
||||||
|
this->bottomLine = LineSegment(linePolygon[3].x, linePolygon[3].y, linePolygon[2].x, linePolygon[2].y);
|
||||||
|
|
||||||
this->charBoxTop = LineSegment(textArea[0].x, textArea[0].y, textArea[1].x, textArea[1].y);
|
this->charBoxTop = LineSegment(textArea[0].x, textArea[0].y, textArea[1].x, textArea[1].y);
|
||||||
this->charBoxBottom = LineSegment(textArea[3].x, textArea[3].y, textArea[2].x, textArea[2].y);
|
this->charBoxBottom = LineSegment(textArea[3].x, textArea[3].y, textArea[2].x, textArea[2].y);
|
||||||
this->charBoxLeft = LineSegment(textArea[3].x, textArea[3].y, textArea[0].x, textArea[0].y);
|
this->charBoxLeft = LineSegment(textArea[3].x, textArea[3].y, textArea[0].x, textArea[0].y);
|
||||||
|
@@ -25,9 +25,10 @@
|
|||||||
|
|
||||||
class TextLine {
|
class TextLine {
|
||||||
public:
|
public:
|
||||||
TextLine(std::vector<cv::Point> textArea, LineSegment topLine, LineSegment bottomLine);
|
TextLine(std::vector<cv::Point> textArea, std::vector<cv::Point> linePolygon);
|
||||||
virtual ~TextLine();
|
virtual ~TextLine();
|
||||||
|
|
||||||
|
std::vector<cv::Point> linePolygon;
|
||||||
std::vector<cv::Point> textArea;
|
std::vector<cv::Point> textArea;
|
||||||
LineSegment topLine;
|
LineSegment topLine;
|
||||||
LineSegment bottomLine;
|
LineSegment bottomLine;
|
||||||
|
Reference in New Issue
Block a user