多排文字排序问题,按照阅读顺序输出

一. 前景介绍

如下图所示,通过文本检测检测到下面的四个框,他们的编号如图所示。现在要按照阅读顺序输出,返回新的编号顺序:2 1 0 4 3
在这里插入图片描述

二. 思路与代码

主要思路如下:

  1. 计算平均高度
  2. 按照高度排序
  3. 左右排序
  4. 合并结果

代码实现:

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值