43 const double min_length) {
44 const double min_length_squared = min_length * min_length;
46 std::vector<uint8_t> bitmap_data;
54 std::vector<double> bitmap_data_double(bitmap_data.begin(),
58 std::unique_ptr<double> segments_data(lsd(&num_segments,
59 bitmap_data_double.data(),
62 std::vector<LineSegment> segments;
63 segments.reserve(num_segments);
64 for (
int i = 0; i < num_segments; ++i) {
65 const Eigen::Vector2d start(segments_data.get()[i * 7],
66 segments_data.get()[i * 7 + 1]);
67 const Eigen::Vector2d end(segments_data.get()[i * 7 + 2],
68 segments_data.get()[i * 7 + 3]);
69 if ((start - end).squaredNorm() >= min_length_squared) {
70 segments.emplace_back();
71 segments.back().start = start;
72 segments.back().end = end;
80 const std::vector<LineSegment>& segments,
const double tolerance) {
81 CHECK_LE(tolerance, 0.5);
83 std::vector<LineSegmentOrientation> orientations;
84 orientations.reserve(segments.size());
86 for (
const auto& segment : segments) {
87 const Eigen::Vector2d direction =
88 (segment.end - segment.start).normalized();
89 if (std::abs(direction.x()) + tolerance > 1) {
91 }
else if (std::abs(direction.y()) + tolerance > 1) {
std::vector< uint8_t > ConvertToRowMajorArray() const
Bitmap CloneAsGrey() const
std::vector< LineSegment > DetectLineSegments(const Bitmap &bitmap, const double min_length)
std::vector< LineSegmentOrientation > ClassifyLineSegmentOrientations(const std::vector< LineSegment > &segments, const double tolerance)