爷青没!OpenCV 4.x之后竟然没了LSD算法!

在使用OpenCV 4.x系列的版本时,想利用LSD算法检测图像中的直线段,结果给我出来个这么玩意。
在这里插入图片描述
这个错误基本上是dll内部的问题,毕竟错误发生在OpenCV内部,一般遇到这个问题,我基本上是这样↓
在这里插入图片描述
没办法,只能看OpenCV源码来研究发生了啥,突然发现2010年经典的LSD算法没了!!!!!
在这里插入图片描述
这可是大事啊,但是OpenCV为了弥补这个问题,在opencv contrib扩展中的ximgproc模块中给出了一个LineSegmentDetector类,来替代LSD算法。

该算法来自于2014年ICRA的一篇论文《Outdoor place recognition in urban environments using straight lines
》,勉强能冲,不不,勉强够用。
在这里插入图片描述

为了更好的过渡到新版本,利用其检测算法,我们下面做个对比。

这个是LSD算法的代码用法。

cv::Ptr<cv::LineSegmentDetector> lsd = cv::createLineSegmentDetector(cv::LSD_REFINE_ADV);
std::vector<cv::Vec4f> lines_std;
lsd->detect(quad, lines_std);
lsd->drawSegments(quadrgb, lines_std);

这个是FLD算法的代码用法,在用这个代码时候,记得添加头文件#include <opencv2/ximgproc.hpp>

cv::Ptr<cv::ximgproc::FastLineDetector> fld = cv::ximgproc::createFastLineDetector();
std::vector<cv::Vec4f> lines_std;
fld->detect(quad, lines_std);
fld->drawSegments(quadrgb, lines_std);

从代码上来看,还好,只需要修改一行代码就能用,从工程的角度出发暂且够用。

下面问题来了,既然代码已经换了,效果肯定不同,在其他人的分析中,指出了FLD算法检测结果与LSD结果相似,但是速度更快,替换满足大部分需求

那么是否满足我的需求呢,我拿张图片测试下,左图是2010年的LSD算法,右图是2014年的FLD算法,尽管速度快乐,但明显丢了许多关键直线。(因为我的图特别模糊,LSD不是基于Canny的,FLD基于Canny的,必然失败)

在这里插入图片描述 在这里插入图片描述

这样肯定不能说是完全替代品呀!!!
在这里插入图片描述

最后个人来说很关键的个人总结

无论是LSD算法还是FLD算法,在大图的检测上肯定是FLD更有优势,但是,对于特别模糊的目标,或小目标,LSD是具有很大的优势的,目前来说,LSD不能被替代,所以目前的办法只能从OpenCV以前的代码中挖出源码,或者从github上下载源码移植了

希望以后能出来个更有效的直线段检测算法,o(╥﹏╥)o。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值