【问题标题】:Sorting rectangular contours opencv排序矩形轮廓opencv
【发布时间】:2017-12-06 08:13:30
【问题描述】:


我有一张单词图片,每个单词都以矩形轮廓为界。我需要对矩形轮廓向量进行排序,以便对其进行一些操作。

这是文字的图片(带有轮廓)。 image with contours

我尝试对其进行排序,我的比较功能是

bool my_compare(Rect2d rect1, Rect2d rect2)
{  if(((rect1.tl().y) <= rect2.tl().y) &&(rect1.tl().y < rect2.br().y)) 
     return (rect1.tl().x < rect2.tl().x);
  return (rect1.tl().y < rect2.tl().y);
}

我也试过了

 if((rect1.tl().y == rect2.tl().y))
   return (rect1.tl().x < rect2.tl().x); 
   return (rect1.tl().y < rect2.tl().y);

结果排序不正确(它不是从最左上角开始,或者它开始但它跳过了同一行中的轮廓)。

【问题讨论】:

  • 它已经通过阈值方法起作用了,我想按照你的方式做,但是..我相信它可以用比这更简单的方法来完成,无论如何谢谢!

标签: c++ sorting opencv image-processing opencv-contour


【解决方案1】:

原因可能是因为同一行中的矩形具有不同的高度。假设一个矩形后面是同一行中的一个较高的矩形,较高的矩形将比左边的矩形更早地排序。

+--------------> x
|          ****           
| ****     *  *
| *  *     *  *
| ****     ****
| rect1    rect2
v
y

使用你的第一个比较函数,rect1.tl().y &lt;= rect2.tl().y 为假,rect1.tl().y &lt; rect2.br().y) 为真,因此返回(rect1.tl().y &lt; rect2.tl().y),这将使右边的矩形小于左边的矩形

解决此问题的一个建议是,如果矩形左上角 y 的差异在阈值内,则将它们视为在同一行上,并改为通过 x 进行比较。

bool my_compare(Rect2d rect1, Rect2d rect2)
{   
    if (fabs(rect1.tl().y - rect2.tl().y) < threshold) 
        return (rect1.tl().x < rect2.tl().x);
    return (rect1.tl().y < rect2.tl().y);
}

fabs&lt;cmath&gt;下的浮点绝对函数。计算阈值的一种方法是使用矩形的平均高度。

threshold = ((rect1.br().y - rect1.tl().y) + (rect2.br().y - rect2.tl().y)) / 2 * K;

K 是一个常数,您可以试验看看哪个性能最好,它应该在 0 和 1 之间。

【讨论】:

  • 是的,我尝试在我的第一个代码中使用“右下点 (br.())”来处理它,这一行: if ((( rect1.tl().y)
  • 它没有,我在回答中添加了一个示例来说明您的第一次比较失败的原因
  • 没有 k 时效果最好,有时它会失败,除非 k = 1
猜你喜欢
  • 2021-09-14
  • 1970-01-01
  • 2013-05-29
  • 2017-01-17
  • 2012-05-10
  • 2021-09-01
  • 2021-11-19
  • 1970-01-01
  • 2018-03-11
相关资源
最近更新 更多