排序矩形轮廓OPENCV

Sorting rectangular contours opencv

本文关键字:OPENCV 轮廓 排序      更新时间:2023-10-16


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

这是单词的图片(带轮廓)。图像带轮廓

我尝试对其进行排序,而我的比较函数是

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

结果无法正确排序(它不是从左上角启动或启动,而是在同一行中跳过轮廓)。

原因可能是因为同一行中的矩形具有不同的高度。假设一个矩形之后是同一行中的一个较高的矩形,较高的矩形将比左侧的矩形进行排序。

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

使用您的第一个比较函数,rect1.tl().y <= rect2.tl().y为false,rect1.tl().y < rect2.br().y)为TRUE,因此返回(rect1.tl().y < rect2.tl().y)将使正确的矩形将右矩形小于左一个

克服这一点的一个建议是,如果矩形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之间。