FastLineDetectors opencv-contrib python

cv::ximgproc::FastLineDetectors是opencv-contrib中用于检测直线的模块,该方法能在较短时间内获得精度较高的直线检测结果,且不需要调节参数。本文介绍该功能的使用方法并剖析其输出结果。

本文范例运行环境

python3.6
opencv-contrib-python 4.4.0.44

FastLineDetectors运行必要条件

FastLineDetectors属于opencv-contrib中的模块,需要安装opencv-contrib-python。在python的opencv相关的安装包中,opencv-python 包含主要模块,opencv-contrib-python 包含主要模块以及一些扩展模块。但这两个模块并不兼容,如果已经安装过opencv-python,需要先卸载,再安装opencv-contrib-python。
在opencv4.1.0之前的版本中,有一个LineSegmentDetector模块,功能强大,检测直线非常便捷,但该函数因为版权问题已在4.1.X版本上已移除,故此处不讨论此方案。LineSegmentDetector相关的问题可以参考:

FastLineDetectors应用示例



如以上代码所示,第1~2行导入python包。
第3行读入测试图片,本文中测试图片与代码文件在同一路径,故只有图片名称。更改测试图像时,更改该行代码中的图像名称即可。
第4行将测试图片转换为灰度图。
第6行创建FastLineDetectors检测实例,这里使用的是默认参数,其参数顺序及意义如下:


第8行使用FastLineDetectors检测测试图像中的直线。
第10行根据检测结果绘制直线。
第11~12行用于显示检测结果。

如下动图所示,我选取了俩张图,均使用默认参数来检测,图中的直线基本被检出,说明该函数的通用性还是比较强的。

FastLineDetectors

以其中停车场的图片为例,图中有许多小短线,此时可以更改createFastLineDetector的默认参数,设置直线的长度来对检测直线进行过滤。

FastLineDetectors检测结果详解

通常我们检测直线并不只是为了将其绘制出来而已,我们可能需要知道该直线与其他直线的关系。这时我们就需要能取用检测得到直线两个端点的坐标。

接下来开始解析FastLineDetectors的检测结果,学习如何取用检测直线的端点坐标。

先在【FastLineDetectors应用示例】小节中,在完成直线检测代码之后,添加如下代码,先观察一下FastLineDetectors检测结果的各种属性:


运行后,可以看到FastLineDetectors的检测结果的各种输出为:


然后我们到github查看一下drawSegments的实现函数,如下所示:


上述代码中:

第28~37行用于绘制检测到的直线,其中lines[i][0]~lines[i][3]中存储的四个元素分别为第i条直线端点1的X,Y坐标和端点2的X,Y坐标。

第38行中的变量[draw_arrow],是函数drawSegments的参数之一,默认值为false,用于设定是否在检测直线的其中一个端点处绘制箭头。
根据以上信息,我们推测在python的FastLineDetectors检测结果中,lines[i][0][0]~lines[i][0][3]分别对应第 i 条直线端点1的X,Y坐标和端点2的X,Y坐标。

为了证明上述推测,我们选取下图作为测试图片,修改一下相关代码,实现如下功能:找出检测结果中最长的一根直线,绘制该直线及其两个端点,并且在该直线一个端点处绘制箭头。

FastLineDetctors_parking



上述代码中25行用于计算直线的长度,便于我们找出检测结果中最长的直线。
第34行用最长的直线的两个端点重新构建一个np.array。
第36行绘制最长的直线,并且第三个参数设置为TRUE,即在直线其中一端绘制箭头。

第37~38行,在图中绘制两个端点。

运行结果如下:


FastLineDetectors可以方便的检测图中的直线,并且可以简单的取用直线两个端点的坐标,接下来就可以用它实现更多有趣的功能。

本文到此结束,感谢阅读,欢迎关注。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Fork me on GitHub