一. 前景介绍
如下图所示,通过文本检测检测到下面的四个框,他们的编号如图所示。现在要按照阅读顺序输出,返回新的编号顺序:2 1 0 4 3
二. 思路与代码
主要思路如下:
- 计算平均高度
- 按照高度排序
- 左右排序
- 合并结果
代码实现:
#include <iostream>
#include <string>
#include <vector>
float cal_mean_height(const std::vector<std::vector<int>> &pp_boxes)
{
float height_sum = 0;
for(int i=0; i<pp_boxes.size(); i++)
{
float height = pp_boxes[i][3] - pp_boxes[i][1];
height_sum += height;
}
return height_sum/pp_boxes.size();
}
struct box_info
{
std::vector<int> box;
int idx;
};
class Compare1
{
public:
bool operator()(box_info &info1, box_info &info2)
{
return info1.box[1] < info2.box[1];
}
};
class Compare2
{
public:
bool operator()(box_info &info1, box_info &info2)
{
return info1.box[0] < info2.box[0];
}
};
int main()
{
std::vector<int> idx_list_new;
std::vector<int> idx_list = {0,1,2,3,4};
std::vector<std::vector<int>> pp_boxes = {{2,2,4,3}, {4,1,5,2}, {1,1,3,2}, {4,4,5,5}, {2,4,3,5}};
float mean_height = cal_mean_height(pp_boxes);
std::cout << "mean_height:" << mean_height << std::endl;
std::vector<box_info> boxes_info;
for(int i=0; i<idx_list.size(); i++)
{
box_info info;
info.box = pp_boxes[i];
info.idx = idx_list[i];
boxes_info.push_back(info);
}
// 对pp_boxes从上到下进行排序
std::sort(boxes_info.begin(), boxes_info.end(), Compare1());
for(int i=0; i<boxes_info.size(); i++)
{
std::cout << boxes_info[i].box[1] << std::endl;
}
std::cout << "top down sort success" << std::endl;
// 左右排序
std::vector<int> split_idx;
split_idx.push_back(0);
for(int i=1; i<boxes_info.size(); i++)
{
if(boxes_info[i].box[1] - boxes_info[i-1].box[1] > mean_height*0.5)
{
split_idx.push_back(i);
}
}
split_idx.push_back(boxes_info.size());
for(int i=0; i < split_idx.size()-1; i++)
{
int benin = split_idx[i];
int end = split_idx[i+1];
if(end-benin == 1)
{
idx_list_new.push_back(boxes_info[i+1].idx);
}
else
{
std::vector<box_info> sub_boxes_info;
for(int j=benin; j<end; j++)
{
sub_boxes_info.push_back(boxes_info[benin]);
}
std::sort(sub_boxes_info.begin(), sub_boxes_info.end(), Compare2());
for(int k=0; k<sub_boxes_info.size(); k++)
{
idx_list_new.push_back(sub_boxes_info[k].idx);
}
}
std::cout << "begin:" << benin << ",end:" << end << std::endl;
}
for(int i=0; i<idx_list_new.size(); i++)
{
std::cout << idx_list_new[i] << std::endl;
}
return 0;
}