【opencv中两个LSD直线检测算法的区别与应用】

文章目录


边缘检测: 传统的直线检测方法一般采用边缘检测算法提取二值边缘图像,然后利用Hough变换将表示每条直线属性的参数投影到Hough空间中。该线检测方法是一种全局拟合算法。缺点是依赖于边缘检测算法的准确性,在边缘密集的地方容易出现异常检测
LSD检测 LSD算法是一种基于梯度信息的直线检测方法,具有检测速度快、参数自适应、精度可达到亚像素级的特点。其主要思想是将局部区域内具有相同梯度方向的像素进行合并,以达到直线检测的目的

opencv中两个LSD直线检测算法的区别与应用
同样是Line Segment Detector(lsd)算法,opencv中提供了两种实现,并且位于不同的模块。在OpenCV 4.0版本及更高版本中,LSDDetector类的构造函数中没有LSDOptions参数。相反,它被重构为BinaryDescriptor::Params参数。因此,如果你的OpenCV版本高于4.0,那么在构造LSDDetector对象时,应该使用BinaryDescriptor::Params参数,而不是LSDOptions参数。下面分别介绍它们的使用方法:

  1. LineSegmentDetector
    由于源码许可证问题 OpenCV 3.4.6-3.4.15、4.1.0-4.5.3中无法使用这个方法

使用该类检测直线并显示的代码如下:

import cv2

if __name__ == '__main__':
   img = cv2.imread("test.jpg")
   gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   gray_img = cv2.GaussianBlur(gray_img, (3,3), 2.0)
   #LineSegmentDetector
   lsd = cv2.createLineSegmentDetector(refine=cv2.LSD_REFINE_NONE, scale=0.8, ang_th=35)  
   lines_detected, width, prec, nfa = lsd.detect(gray_img)
   #lsd.drawSegments(img,lines_detected)
   #绘制检测结果
   for dline in lines_detected:
       x0 = int(round(dline[0][0]))
       y0 = int(round(dline[0][1]))
       x1 = int(round(dline[0][2]))
       y1 = int(round(dline[0][3]))
       cv2.line(mask, (x0, y0), (x1,y1), 255, 1, cv2.LINE_AA)
   cv2.imshow("Detected lines", img)
   cv2.waitKey(0)
   cv.destroyAllWindows()

c++示例代码如下(lsd_lines.cpp):

#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【网络星空】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值