表格线识别通用库文档
载入中...
搜索中...
未找到
intervals.hpp
浏览该文件的文档.
1/*
2 * @Description: 区间列表类 头文件及其实现
3 * @Version:
4 * @Autor: dreamy-xay
5 * @date: 2023-12-03
6 * @LastEditors: dreamy-xay
7 * @LastEditTime: 2024-03-03
8 */
9#ifndef COMMON_INTERVALS_HPP
10#define COMMON_INTERVALS_HPP
11
12#include <opencv2/core.hpp>
13
15#include "common/base/list.hpp"
16#include "common/enum.h"
17#include "common/macro.h"
18#include "common/type.h"
19
20namespace cm {
21
29class Intervals : public List<Interval> {
30 public:
31 using List<Interval>::List;
32
34 Intervals() = default;
36 Intervals(const Intervals& intervals) = default;
37 Intervals(const std::vector<cv::Range>& ranges);
39 ~Intervals() = default;
40
43};
44
56inline Intervals::Intervals(const std::vector<cv::Range>& ranges) {
57 for (auto& range : ranges)
58 this->emplace_back(range.start, range.end);
59}
60
73 *this = std::move(this->Filter([=](const Interval& interval) {
74 return interval.IsValid(min_interval_len);
75 })); // 更新区间列表
76
77 return *this;
78}
79
97 const Interval* intervals = this->data(); // 当前类的区间列表
98
99 int num_intervals = this->size(); // 获取区间的数量
100
101 // 如果区间的数量小于等于1则返回
102 if (num_intervals <= 1)
103 return *this;
104
105 // 按区间的左边界从小到大排序,如果左边界相等则按右边界从小到大排序
106 this->Sort();
107
108 Intervals new_intervals; // 新区间列表
109
110 int start_of_interval = intervals[0].start; // 区间起始值
111 int end_of_interval = intervals[0].end; // 区间结束值
112 // 遍历所有区间
113 for (int i = 1; i < num_intervals; ++i)
114 if (intervals[i].start <= end_of_interval + max_interval_distance && intervals[i].end > end_of_interval) // 如果区间满足合并需求
115 end_of_interval = intervals[i].end; // 合并区间
116 else if (intervals[i].start > end_of_interval + max_interval_distance) { // 没有需要合并的区间了
117 new_intervals.emplace_back(start_of_interval, end_of_interval); // 添加合并的区间
118
119 start_of_interval = intervals[i].start; // 当前区间作为起始区间,更新区间起始和结束值
121 }
122 new_intervals.emplace_back(start_of_interval, end_of_interval); // 添加最后一个区间
123
124 *this = std::move(new_intervals); // 更新区间列表
125
126 return *this;
127}
128
129} // namespace cm
130
131#endif
区间类
Definition interval.hpp:29
区间列表类
Definition intervals.hpp:29
~Intervals()=default
区间类的析构函数
Intervals(const Intervals &intervals)=default
区间类的拷贝构造函数
Intervals & MergeIntervals(int max_interval_distance=0)
合并相邻或重叠区间
Definition intervals.hpp:96
Intervals & FilterInvalidIntervals(int min_interval_len=1)
过滤无效区间
Definition intervals.hpp:72
Intervals()=default
区间类的默认构造函数
列表类
Definition list.hpp:36
List< Interval > Filter(const FUNC &func) const
过滤列表项
Definition list.hpp:270
List()=default
列表类的默认构造函数
List< Interval > & Sort()
对列表进行排序
Definition list.hpp:767
点类
Definition point.hpp:52