排序矩形轮廓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的左上角差为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之间。
相关文章:
- 如何在OpenCV中存储部分轮廓点喜欢新矢量中的左侧,该类型为<vector<vector<Point>>
- Opencv 时刻没有成员命名 m00,同时试图确定轮廓的中心
- OpenCV : findcontours() , 太多的外部轮廓
- 查找从轮廓到点OPENCV C 的距离
- 在 OpenCV 和 C++ 中查找距轮廓中心最近的黑色像素
- 排序矩形轮廓OPENCV
- 如何使用 OpenCv 从图像中"cut"轮廓?
- OpenCV c++ 断言失败调用绘制轮廓
- 过滤不需要的轮廓-C 的OPENCV
- 在OpenCV中使用遮罩和ROI计算轮廓内浮器的图像像素值(例如平均值)
- OpenCV C++:按轮廓区域对轮廓进行排序
- 在OpenCV C/C++中只过滤出一个轮廓
- 如何在 OpenCv 中使用 HSV 阈值和轮廓从图像中提取皮肤
- OpenCV查找近距离物体的轮廓
- 将 OpenCV 轮廓从 JNI C++ 函数传递到 Android 中的 Java
- 如何将 OpenCV 轮廓平滑添加到现有缓冲区
- 在C++中订购 OpenCv 轮廓
- OpenCV轮廓时刻
- 从Blob检测中提取OpenCV轮廓阵列
- 我如何计算手指的数量?(openCV +轮廓检测)