我检测到图像中的线条,并使用 HoughLinesP 方法将它们绘制在 OpenCv C++ 中的单独图像文件中。以下是生成的图像的一部分。实际上有数百条细小的线形成一条大的单线。
但我想要代表所有这些行数的几行。较近的线应合并在一起形成一条线。例如,上面的一组线应该由下面的 3 条单独的线表示。
预期输出如上。如何完成这个任务。
到目前为止,阿卡萨科夫的回答取得了进展。
(产生的不同类别的线用不同的颜色绘制)。请注意,此结果是我正在处理的原始完整图像,而不是我在问题中使用的示例部分
原文由 Samitha Chathuranga 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您不知道图像中的行数,您可以使用
cv::partition
函数在等价组上拆分行。我建议您执行以下程序:
使用
cv::partition
拆分行。您需要指定一个好的谓词函数。这实际上取决于您从图像中提取的行,但我认为它应该检查以下条件:例如,它可以实现如下:
猜猜你的台词在
vector<Vec4i> lines;
。接下来,您应该调用cv::partition
如下:您需要调用
cv::partition
一次,它将聚集所有行。向量labels
将存储它所属的簇的每个行标签。参见 文档cv::partition
我注意到您示例中的所有线条都是水平或垂直的。在这种情况下,您可以计算所有线段中心和“边界”点的平均值,然后通过中心点绘制由“边界”点限制的水平或垂直线。
请注意
cv::partition
需要 O(N^2) 时间,因此如果您处理大量行,可能需要很长时间。我希望它会有所帮助。我将这种方法用于类似的任务。