|
|
@ -235,9 +235,11 @@ vector<Vec3d> QRDetect::searchHorizontalLines() |
|
|
|
vector<Point2f> QRDetect::separateVerticalLines(const vector<Vec3d> &list_lines) |
|
|
|
vector<Point2f> QRDetect::separateVerticalLines(const vector<Vec3d> &list_lines) |
|
|
|
{ |
|
|
|
{ |
|
|
|
CV_TRACE_FUNCTION(); |
|
|
|
CV_TRACE_FUNCTION(); |
|
|
|
|
|
|
|
const double min_dist_between_points = 10.0; |
|
|
|
for (int coeff_epsilon = 1; coeff_epsilon < 10; coeff_epsilon++) |
|
|
|
const double max_ratio = 1.0; |
|
|
|
|
|
|
|
for (int coeff_epsilon_i = 1; coeff_epsilon_i < 101; ++coeff_epsilon_i) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
const float coeff_epsilon = coeff_epsilon_i * 0.1f; |
|
|
|
vector<Point2f> point2f_result = extractVerticalLines(list_lines, eps_horizontal * coeff_epsilon); |
|
|
|
vector<Point2f> point2f_result = extractVerticalLines(list_lines, eps_horizontal * coeff_epsilon); |
|
|
|
if (!point2f_result.empty()) |
|
|
|
if (!point2f_result.empty()) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -247,9 +249,23 @@ vector<Point2f> QRDetect::separateVerticalLines(const vector<Vec3d> &list_lines) |
|
|
|
point2f_result, 3, labels, |
|
|
|
point2f_result, 3, labels, |
|
|
|
TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 0.1), |
|
|
|
TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 0.1), |
|
|
|
3, KMEANS_PP_CENTERS, centers); |
|
|
|
3, KMEANS_PP_CENTERS, centers); |
|
|
|
if (compactness == 0) |
|
|
|
double min_dist = std::numeric_limits<double>::max(); |
|
|
|
|
|
|
|
for (size_t i = 0; i < centers.size(); i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
double dist = norm(centers[i] - centers[(i+1) % centers.size()]); |
|
|
|
|
|
|
|
if (dist < min_dist) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
min_dist = dist; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (min_dist < min_dist_between_points) |
|
|
|
|
|
|
|
{ |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
if (compactness > 0) |
|
|
|
} |
|
|
|
|
|
|
|
double mean_compactness = compactness / point2f_result.size(); |
|
|
|
|
|
|
|
double ratio = mean_compactness / min_dist; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ratio < max_ratio) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return point2f_result; |
|
|
|
return point2f_result; |
|
|
|
} |
|
|
|
} |
|
|
@ -456,7 +472,6 @@ bool QRDetect::localization() |
|
|
|
vector<Point2f> list_lines_y = separateVerticalLines(list_lines_x); |
|
|
|
vector<Point2f> list_lines_y = separateVerticalLines(list_lines_x); |
|
|
|
if( list_lines_y.empty() ) { return false; } |
|
|
|
if( list_lines_y.empty() ) { return false; } |
|
|
|
|
|
|
|
|
|
|
|
vector<Point2f> centers; |
|
|
|
|
|
|
|
Mat labels; |
|
|
|
Mat labels; |
|
|
|
kmeans(list_lines_y, 3, labels, |
|
|
|
kmeans(list_lines_y, 3, labels, |
|
|
|
TermCriteria( TermCriteria::EPS + TermCriteria::COUNT, 10, 0.1), |
|
|
|
TermCriteria( TermCriteria::EPS + TermCriteria::COUNT, 10, 0.1), |
|
|
@ -464,7 +479,7 @@ bool QRDetect::localization() |
|
|
|
|
|
|
|
|
|
|
|
fixationPoints(localization_points); |
|
|
|
fixationPoints(localization_points); |
|
|
|
|
|
|
|
|
|
|
|
bool suare_flag = false, local_points_flag = false; |
|
|
|
bool square_flag = false, local_points_flag = false; |
|
|
|
double triangle_sides[3]; |
|
|
|
double triangle_sides[3]; |
|
|
|
double triangle_perim, square_area, img_square_area; |
|
|
|
double triangle_perim, square_area, img_square_area; |
|
|
|
if (localization_points.size() == 3) |
|
|
|
if (localization_points.size() == 3) |
|
|
@ -482,14 +497,14 @@ bool QRDetect::localization() |
|
|
|
|
|
|
|
|
|
|
|
if (square_area > (img_square_area * 0.2)) |
|
|
|
if (square_area > (img_square_area * 0.2)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
suare_flag = true; |
|
|
|
square_flag = true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
local_points_flag = true; |
|
|
|
local_points_flag = true; |
|
|
|
} |
|
|
|
} |
|
|
|
if ((suare_flag || local_points_flag) && purpose == SHRINKING) |
|
|
|
if ((square_flag || local_points_flag) && purpose == SHRINKING) |
|
|
|
{ |
|
|
|
{ |
|
|
|
localization_points.clear(); |
|
|
|
localization_points.clear(); |
|
|
|
bin_barcode = resized_bin_barcode.clone(); |
|
|
|
bin_barcode = resized_bin_barcode.clone(); |
|
|
@ -1970,6 +1985,13 @@ bool QRDecode::createSpline(vector<vector<Point2f> > &spline_lines) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (int i = 0; i < NUM_SIDES; i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (spline_lines[i].size() == 0) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|