爷青没!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。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-6488186.html
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网进行投诉反馈,一经查实,立即删除!