- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
该类用于实现 LSD (Line Segment Detector) 直线段检测算法。LSD 是一种快速、准确的直线检测方法,能够在不依赖边缘检测的前提下直接从图像中提取出直线段。
它是 OpenCV 的 line_descriptor 模块的一部分,常用于计算机视觉任务如图像拼接、SLAM、特征匹配等。
主要功能:
- 从灰度图像中检测直线段;
- 支持多尺度和多金字塔层处理;
- 输出结构化信息:线段起点、终点、长度、响应值等;
- 可与 BinaryDescriptor 配合使用,进行线段描述符提取和匹配;
公共成员函数
- 创建 LSDDetector 实例
Ptr<LSDDetector> lsd = LSDDetector::createLSDDetector();
说明:
- 静态工厂方法,用于创建一个默认配置的 LSD 检测器;
- 返回智能指针 Ptr。
- detect() 方法:检测线段
void detect( const Mat& image, CV_OUT std::vector<KeyLine>& keylines,
int scale, int numOctaves, const Mat& mask = Mat() );
参数说明:
参数 | 类型 | 含义 |
---|---|---|
image | const Mat& | 输入图像(通常为单通道灰度图) |
keylines | std::vector& | 输出的线段列表 |
scale | int | 图像缩放比例(尺度空间参数) |
numOctaves | int | 构建的金字塔层数(尺度空间层级数) |
mask | const Mat&(可选) | 感兴趣区域掩码 |
代码示例
#include <opencv2/line_descriptor.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace cv::line_descriptor;
int main()
{
// 加载图像
Mat image = imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", IMREAD_GRAYSCALE );
if ( image.empty() )
{
std::cerr << "无法加载图像!" << std::endl;
return -1;
}
// 创建 LSDDetector
Ptr< LSDDetector > lsd = LSDDetector::createLSDDetector();
// 存储线段
std::vector< KeyLine > keylines;
// 设置参数
int scale = 2; // 尺度
int num_octaves = 1; // 金字塔层数
// 检测线段
lsd->detect( image, keylines, scale, num_octaves );
std::cout << "检测到线段数量: " << keylines.size() << std::endl;
// 可视化线段
Mat colorImage;
cvtColor( image, colorImage, COLOR_GRAY2BGR );
for ( const auto& kl : keylines )
{
Point pt1( kl.startPointX, kl.startPointY );
Point pt2( kl.endPointX, kl.endPointY );
line( colorImage, pt1, pt2, Scalar( 0, 0, 255 ), 1 ); // 红色线段
}
imshow( "Detected Lines", colorImage );
waitKey( 0 );
return 0;
}