OpenCV中矩形轮廓的排序

3


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

这是带有轮廓的单词图片。 带有轮廓的图片

我尝试过排序,我的比较函数是:

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);

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


它已经通过阈值法工作了,我想过用你的方法,但是我认为可以比那更简单的方式完成,无论如何还是谢谢! - Abdel-Rahman
1个回答

2

可能的原因是同一行中的矩形高度不同。假设一个矩形后面跟着一个更高的矩形在同一行中,那么更高的矩形会比左边的矩形先排序。

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

使用第一个比较函数,rect1.tl().y <= rect2.tl().y 是假的,而 rect1.tl().y < rect2.br().y) 是真的,因此返回 (rect1.tl().y < 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 是在 <cmath> 中实现的浮点绝对值函数。计算阈值的一种方法是使用矩形的平均高度。

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

K是一个常数,您可以进行实验来确定哪个常数表现最佳,它应该在0和1之间。


是的,我在我的第一段代码中尝试使用“右下角点(br())”来处理它,这行代码:if (((rect1.tl().y) <= rect2.tl().y) && (rect1.tl().y < rect2.br().y)),它可以解决不同高度的问题,但仍然无法正确排序。 - Abdel-Rahman
它并没有,我在我的回答中添加了一个示例来说明为什么你的第一个比较失败了。 - lamandy
它在没有k的情况下表现最佳,有时除非k = 1,否则会失败。 - Abdel-Rahman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接