排序矩形轮廓opencv
Sorting rectangular contours opencv
我有一张单词图片,每个单词都由一个矩形轮廓包围。我需要对矩形轮廓矢量进行排序,以便对其进行一些操作。
这是单词的图片(带轮廓)。
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);
结果排序不正确(它不是从最左上角开始的,或者虽然开始但跳过了同一行中的等高线)。
原因可能是同一行的矩形高度不同。假设在同一行中一个矩形后面跟着一个更高的矩形,更高的矩形将比左边的矩形更早排序。
+--------------> x
| ****
| **** * *
| * * * *
| **** ****
| rect1 rect2
v
y
使用您的第一个比较函数,rect1.tl().y <= rect2.tl().y
为假,rect1.tl().y < rect2.br().y)
为真,因此 return (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 之间。
我有一张单词图片,每个单词都由一个矩形轮廓包围。我需要对矩形轮廓矢量进行排序,以便对其进行一些操作。
这是单词的图片(带轮廓)。 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);
结果排序不正确(它不是从最左上角开始的,或者虽然开始但跳过了同一行中的等高线)。
原因可能是同一行的矩形高度不同。假设在同一行中一个矩形后面跟着一个更高的矩形,更高的矩形将比左边的矩形更早排序。
+--------------> x
| ****
| **** * *
| * * * *
| **** ****
| rect1 rect2
v
y
使用您的第一个比较函数,rect1.tl().y <= rect2.tl().y
为假,rect1.tl().y < rect2.br().y)
为真,因此 return (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 之间。