繁体   English   中英

对矩形轮廓进行排序opencv

[英]Sorting rectangular contours opencv


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

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

我试图对它进行排序,我的比较功能是

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中的矩形左上角差异在阈值内,则认为它们在同一行上并且比较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之间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM