线特征LSD提取、LBD描述子匹配实现过程源码

该代码示例展示了如何利用OpenCV库中的LSDDetector和BinaryDescriptor来提取线段特征(LSD),并采用LBD描述子进行匹配。主要步骤包括图片加载、线段检测、描述符计算以及匹配显示。最终,程序筛选出高精度匹配的线段并在图像上绘制匹配结果。

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

使用opencv实现线特征LSD提取、LBD描述子匹配实现:

具体逻辑如下:

1.设置读图的路径

2. 加载图片

3. 创建mask掩代码

4.初始化参数

5.检测LSD线段

6. 计算尺度第一塔的描述

7. 使用尺度第一塔进行特征与描述提取

8.LBD描述子匹配

9.选择高精度匹配 

10.画图显示

完整代码如下:

#include <iostream>
#include <opencv2/opencv_modules.hpp>
#include <opencv2/line_descriptor.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;
using namespace cv::line_descriptor;
using namespace std;

#define MATCHES_DIST_THRESHOLD 25

//主函数
int main(int argc, char** argv)
{
    //1.设置读图的路径
	String image_path1 = "your path1";
	String image_path2 = "your path2";

	if (image_path1.empty() || image_path2.empty())
	{
		return -1;
	}

	//2. 加载图片
	cv::Mat imageMat1 = imread(image_path1, 1);
	cv::Mat imageMat2 = imread(image_path2, 1);
	// 检测路径是否为空
	if (imageMat1.data == NULL || imageMat2.data == NULL)
	{
		std::cout << "Error, images could not be loaded. Please, check their path" << std::endl;
	}

	//3. 创建mask掩代码
	cv::Mat mask1 = Mat::ones(imageMat1.size(), CV_8UC1);
	cv::Mat mask2 = Mat::ones(imageMat2.size(), CV_8UC1);

	// 4.初始化参数
	Ptr<LSDDetector> lsd = LSDDetector::createLSDDetector();
	Ptr<BinaryDescriptor> lbd = BinaryDescriptor::createBinaryDescriptor();// BinaryDescriptor指针默认参数 
	Ptr<BinaryDescriptorMatcher> match1 = BinaryDescriptorMatcher::createBinaryDescriptorMatcher();	//BinaryDescriptorMatcher二值描述子匹配创建 

	//5.检测线段 
	std::vector<KeyLine> klsd1, klsd2;
	Mat lsd_descr1, lsd_descr2;
	lsd->detect(imageMat1, klsd1, 2, 2, mask1);
	lsd->detect(imageMat2, klsd2, 2, 2, mask2);

	//6. 计算尺度第一塔的描述 
	lbd->compute(imageMat1, klsd1, lsd_descr1);
	lbd->compute(imageMat2, klsd2, lsd_descr2);

	//7. 尺度第一塔进行特征与描述提取 
	std::vector<KeyLine> octave0_1, octave0_2;
	Mat leftDescr, rightDescr;
	for (int i = 0; i < (int)klsd1.size(); i++)
	{
		if (klsd1[i].octave == 1)
		{
			octave0_1.push_back(klsd1[i]);
			leftDescr.push_back(lsd_descr1.row(i));
		}
	}

	for (int j = 0; j < (int)klsd2.size(); j++)
	{
		if (klsd2[j].octave == 1)
		{
			octave0_2.push_back(klsd2[j]);
			rightDescr.push_back(lsd_descr2.row(j));
		}
	}

	//8.匹配 
	std::vector<DMatch> lsd_matches;
	match1->match(leftDescr, rightDescr, lsd_matches);

	//9.选择高精度匹配 
	std::vector<DMatch> good_matches;
	for (int i = 0; i < (int)lsd_matches.size(); i++)
	{
		if (lsd_matches[i].distance < MATCHES_DIST_THRESHOLD)
			good_matches.push_back(lsd_matches[i]);
	}

	// 10.画图显示
	cv::Mat lsd_outImg;
	resize(imageMat1, imageMat1, Size(imageMat1.cols/2, imageMat1.rows/2));
	resize(imageMat2, imageMat2, Size(imageMat2.cols/2, imageMat2.rows/2));
	std::vector<char> lsd_mask(lsd_matches.size(), 1);
	drawLineMatches(imageMat1, octave0_1, imageMat2, octave0_2, good_matches, lsd_outImg, 
		            Scalar::all(-1), Scalar::all(-1), lsd_mask, DrawLinesMatchesFlags::DEFAULT);
	imshow("LSD matches", lsd_outImg);
	std::cout << "LSDescriptorMatcher is : " << good_matches.size() << std::endl;
	waitKey(0);

	return 0;
}

### LSD-SLAM中的点线特征使用 #### 理解LSD-SLAM的工作原理 LSD-SLAM是一种直接单目视觉SLAM系统,它不依赖于传统的特征点匹配,而是通过优化光度误差来估计相机运动并构建环境地图。对于每一个新的关键帧\(K_i=(I_i, D_i, V_i)\),即由相机图像、半稠密像素的逆深度及其方差组成的数据集,该算法会尝试找到相对于已有关键帧的最佳相对三维姿态\(\xi_{ji} \in se(3)\)[^3]。 #### 点线特征的作用 尽管LSD-SLAM主要关注的是直接方法而非基于特征的方法,但在某些改进版本或相关工作中引入了点线特征用于增强系统的鲁棒性和精度。具体来说: - **直线段检测**:采用LSD(Line Segment Detector)算法自动识别场景内的显著线条作为结构线索[^1]。 - **描述符生成与匹配**:为了区分不同的线特征,在一些实现中可能应用类似于LBD(Line Band Descriptor)的技术为每条线创建独特的描述向量,并与其他视图中的对应物相匹配[^2]。 #### 实践指南 ##### 安装必要的库和工具包 要开始探索带有点线特性的LSD-SLAM变体,首先要确保安装好ROS(Robot Operating System), OpenCV以及Eigen等基础软件栈。此外还需要下载特定版本的LSD-SLAM源码仓库,如果目标是加入额外的功能,则需进一步配置编译选项以支持这些特性。 ##### 数据准备 准备好适用于测试目的的真实世界视频序列或者合成数据集。理想情况下应选择具有明显几何形状的对象以便更容易地观察到线特征的效果。 ##### 修改默认参数设置 调整`settings.yaml`文件内有关特征提取器的部分,开启对线特征的支持。这通常涉及到指定使用的探测器类型(LSD或其他替代方案)以及设定阈值和其他超参控制哪些边被保留下来参与后续处理过程。 ```yaml line_detector_type: "lsd" min_line_length_pixels: 30 max_line_angle_degrees: 45 ``` ##### 进行实验验证 运行修改后的程序并对结果进行全面分析。注意记录下不同条件下性能指标的变化情况,比如跟踪成功率、重建质量等方面的表现差异。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值