opencv3.4使用lsd线段检测提示异常解决办法

本文解决了使用OpenCV 3.4中LineSegmentDetector (LSD)遇到的许可问题及Canny函数错误,并提供了解决方案,通过移植opencv 3.1的lsd.cpp和precomp.hpp文件来修复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一下午被opencv3.4里面lsd提示异常(因为许可问题)拖住了

#include <opencv2/core/core.hpp>
#include <opencv2/core/utility.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgcodes.hpp>
#include <iostream>
#include <string>
 
using namespace std;
using namespace cv;
 
int main()
{
    cv::Mat srcImage = cv::imread();
    Canny(srcImage,srcImage,50,200,3);
    
    #if 1
        Ptr<LineSegmentDetector> lsd = createLineSegmentDetector(LSD_REFINE_STD);
    #else
        Ptr<LineSegmentDetector> lsd = createLineSegmentDetector(LSD_REFINE_NONE);
    #endif
        double start = double(getTickCount());
        vector<Vec4f> vecLines;
        double times = (double(getTickCount()) - start) * 1000 / getTickFrequency();
        std::cout<<"times:" <<times<<"ms"<<std::endl;
        cv::Mat reslineMat(srcImage);
        lsd->drawSegments(reslineMat,vecLines);
        cv::imshow("reslineMat",reslineMat);
        cv::waitKey();
        return 0;
}

附上代码出处

https://blog.csdn.net/qq_35789421/article/details/89208349

以上代码编译是有问题的:
(1)Canny(srcImage,srcImage,50,200,3); 提示异常,要新创建一个Mat对象替换第二个参数
(2)Ptr lsd = createLineSegmentDetector(LSD_REFINE_STD); 提示异常,这就是因为lsd许可问题了
【解决办法】
下载opencv3.1,在…\opencv-3.1.0\modules\imgproc\src路径下复制lsd.cpp和precomp.hpp文件到工程目录下,再在解决方案里导入这两个文件,编译,注释掉precomp.hpp里面报错的头文件,就可以了。

最后开心地得到了结果:
在这里插入图片描述

<think>好的,我需要回答用户关于在OpenCV 3.4.16中使用LSD线段检测的问题。首先,用户提供的引用内容中提到,OpenCV 3.4.16支持LSD,但可能在4.x版本中被移除,所以需要确保用户正确使用该版本。 根据引用[2],用户提到在ORB_SLAM2中添加线特征时使用OpenCV提取LSD线特征,这给了我一个线索,可能需要使用cv::createLineSegmentDetector函数。在OpenCV 3.4.16中,这个函数应该是可用的,但需要注意命名空间和参数是否正确。 我需要提供一个示例代码,包括读取图像、转换为灰度图、检测线段、绘制结果和显示。同时,要确保代码语法正确,特别是使用正确的命名空间cv,并处理可能的异常,比如文件路径错误。 另外,用户可能需要了解LSD的参数调节,比如scale、sigma_scale等参数的作用,以及如何调整它们以适应不同的图像场景。比如,scale参数控制检测的尺度,较小的值可以检测更细的线段,但可能增加噪声。sigma_scale用于高斯滤波,影响降噪效果。 还要注意引用来源,在回答中提到的关键点需要标注引用,比如提到LSDOpenCV 3.4.16中的存在性时引用[1]和[2],下载资源时引用[3]。最后,生成相关问题,帮助用户进一步了解应用场景、替代方法、参数调节和与其他版本的区别。</think>### OpenCV 3.4.16中LSD线段检测使用方法 在OpenCV 3.4.16中,`LSD`(Line Segment Detector)是一个高效的线段检测算法,可用于提取图像中的直线特征。以下是具体实现步骤和示例代码: --- #### **步骤说明** 1. **环境准备** 确保已正确安装OpenCV 3.4.16版本(下载地址见引用[^3]),并配置到项目中。 2. **核心函数** 使用`cv::createLineSegmentDetector`创建线段检测器对象,并通过`detect`方法获取线段信息。 3. **参数说明** - `scale`: 图像缩放因子(默认`0.8`) - `sigma_scale`: 高斯滤波标准差(默认`0.6`) - 其他参数如角度阈值、密度阈值等可根据需求调整。 --- #### **代码示例** ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { // 读取图像并转为灰度图 cv::Mat image = cv::imread("test.jpg"); if (image.empty()) { std::cerr << "无法加载图像" << std::endl; return -1; } cv::Mat gray; cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY); // 创建LSD检测器 cv::Ptr<cv::LineSegmentDetector> lsd = cv::createLineSegmentDetector(cv::LSD_REFINE_STD); // 检测线段 std::vector<cv::Vec4f> lines; lsd->detect(gray, lines); // 绘制线段 cv::Mat result = image.clone(); lsd->drawSegments(result, lines); // 显示结果 cv::imshow("LSD Result", result); cv::waitKey(0); return 0; } ``` --- #### **关键说明** 1. **输出格式** 检测到的线段以`std::vector<cv::Vec4f>`存储,每个元素表示线段起点和终点的坐标:$(x_1, y_1, x_2, y_2)$。 2. **性能优化** - 对于高分辨率图像,可先缩小尺寸提升速度。 - 通过调整`scale`和`sigma_scale`平衡检测精度与噪声抑制[^2]。 3. **兼容性注意** OpenCV 4.x中移除了`LSD_REFINE_STD`等参数,若需升级版本需改用其他算法(如EDLines)[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值