slam 单目稠密深度详解

视觉SLAM之单目稠密重建 参考高翔的slam十四讲,单目相机在已知轨迹下的稠密深度估计。 数据集参考: 将使用 REMODE[113, 109] 的测试数据集。它提供了一架无人机采集 的单目俯视图像,共有 200 张,同时提供了每张图像的真实位姿。 http://rpg.ifi.uzh.ch/datasets/remode_test_data.zip 处下载。 下载慢的可以去本人上传的资源处下载。 解压后,将在 test_-data/Images 中有从 0 至 200 的所有图像,并在 test_data 目录下可以看到一个文本 阅读详情

单目计算深度比较复杂,一般可以用RGB-D相机直接得到深度,但还是练习一下。

因为是稠密重建,对每个像素都算深度,所以就不是提取特征了。

仅凭一幅图像无法估计出深度,要用不同视角下的图像来估计。
特征点匹配法中,是根据不同视角中同一特征点的不同位置来进行三角测量估计深度,
但是稠密重建是不用特征点的,要对每个像素都进行匹配,然后进行三角测量。怎么匹配呢,用极线搜索和块匹配。

什么是极线搜索,如下(贴一张别人的图):
在这里插入图片描述首先说神马是极线,相机1中的某像素p1, 它可能的深度是,比如[0.1, 5](范围是图上的d), 然后p1的像素坐标结合这个最小和最大深度(d的两头),形成了俩位置,这俩位置映射到相机2的两个点,这两个点形成的线段就是极线。

那搜索呢,就是在极线这条线段上,搜索和p1一样的点,怎么判断一样,就是用各种相似度函数,这里用了NCC(后面说),只搜索一个点鲁棒性不行,就搜索一个块,块的大小自己定义。

搜索到p2点和p1点匹配度高之后,用三角测量估计p的深度,
现把图片1当作p1所在的图片,要估计图片1中所有像素的深度,目前有不同视角下拍的图片2来匹配p2,估计深度。
仅一张图片2,深度肯定是不够稳定的,
那么就来多张不同视角下的图片3,4,5…,
每张都和p1匹配,再估计图片1中所有像素的深度,于是得到了很多张不同的深度图。

那这么多张估计出来的深度图,总要融合成一个深度图吧,毕竟只要估计一张图片1的深度。
下面就是高斯融合了。

高斯融合就是假设深度d是服从高斯分布的,初始均值是 μ \mu μ, 方差是 σ \sigma σ,
然后根据图片2,3,4…得到了新的深度均值方差: μ o b s \mu_{obs} μobs​, σ o b s \sigma_{obs} σobs​,

根据高斯分布的乘积,得到融合公式
σ o b s 2 μ + σ 2 μ o b s σ 2 + σ o b s 2 \frac{ \sigma ^{2}_{obs}\mu + \sigma ^{2}\mu_{obs} }{\sigma ^{2} + \sigma ^{2}_{obs}} σ2+σobs2​σobs2​μ+σ2μobs​​
注意,因为每个像素都要算深度,所以这个均值,方差都是图像大小的矩阵。

最后得到的 μ \mu μ就是要得到的深度图。

接下来问题来了, μ o b s \mu_{obs} μobs​和 σ o b s \sigma_{obs} σobs​怎么算。
μ o b s \mu_{obs} μobs​就是本次估计的深度,因为估计的时候就是求的平均值(后面代码会说)
σ o b s \sigma_{obs} σobs​要根据不确定性公式算,
在这里插入图片描述先上结论: σ o b s = ∥ p ∥ − ∥ p ′ ∥ \sigma_{obs} = \left \| p \right \| - \left \| p' \right \| σobs​=∥p∥−∥p′∥,
其中p指的是图中的 O 1 P O_{1}P O1​P向量,p’指的是 O 1 P ′ O_{1}P' O1​P′向量
那么问题回归到P和P’两个点怎么算出来。

首先p1对应的p2点是通过极线搜索出来的,通过p1, p2两点三角测量得到p1的估计位置P,
然后把p2沿极线移动一个像素,得到p2’,
再根据p1, p2’这两个点再估计一个位置P’。

而实际上不需要估计两次,在移动p2得到p2’后,
根据图上标的一些边和角,得到如下关系
a = p − t a = p - t a=p−t   (向量减)
α = a r c c o s < p , t > \alpha = arccos<p, t> α=arccos<p,t>
β = a r c c o s < p , − t > \beta = arccos<p, -t> β=arccos<p,−t>
β ′ = a r c c o s < O 2 p 2 ′ , − t > \beta' = arccos<O_{2}p_{2}', -t> β′=arccos<O2​p2′​,−t>
γ = π − α − β \gamma = \pi - \alpha - \beta γ=π−α−β   (三角形内角和=180度)

然后根据正弦定理:
∥ p ′ ∥ s i n β ′ = ∥ t ∥ s i n γ \frac{\left \| p' \right \| }{sin\beta'} = \frac{\left \| t \right \| }{sin\gamma} sinβ′∥p′∥​=sinγ∥t∥​

就得到了
∥ p ′ ∥ = ∥ t ∥ s i n β ′ s i n γ \left \| p' \right \| = \left \| t \right \|\frac{sin\beta' }{sin\gamma} ∥p′∥=∥t∥sinγsinβ′​

注意这个t是相机位姿变换T的平移部分。

至于三角测量具体怎么算,这个在代码中注释。

下面一步一步完成上面的过程。
首先初始化上面的 μ \mu μ和 σ \sigma σ矩阵

double init_depth = 3.0;  //深度初始值
double init_cov2 = 3.0;   //方差初始值
Mat depth(height, width, CV_64F, init_depth);   //深度图
Mat depth_cov2(height, width, CV_64F, init_cov2);  //深度图方差

由p1估计p2是需要相机的位姿的,这个位姿从data中读取
这是第一幅图的相机位姿。

SE3d pose_ref_TWC = poses_TWC[0];

第一幅图像

Mat ref = imread(color_image_files[0], 0);  //灰度图

接下来是遍历所有的图像(不同位姿下拍的图片)
我们称第一幅图像为ref, TWC指从current相机坐标系到world坐标系的变换矩阵T,
那么p1到world坐标系,再到p2, 就需要一个把ref坐标系变换到current相机坐标系的变换T_C_R。
它是由ref的T_W_C(current to world)左乘相机2的T_C_W(world to current)。

for(int index = 1; index < color_image_files.size(); index ++) {
    cout << "*** loop " << index << " ***" << endl;
    Mat curr = imread(color_image_files[index], 0);
    if(curr.data == nullptr) continue;
    SE3d pose_curr_TWC = poses_TWC[index];   //当前坐标系到世界坐标系的变换矩阵T
    SE3d pose_T_C_R = pose_curr_TWC.inverse() * pose_ref_TWC;  //左乘,ref->world->cur: T_C_W * T_W_R = T_C_R
    update(ref, curr, pose_T_C_R, depth, depth_cov2);
}

好了位姿解决了,下面就是update中需要做的极线搜索和高斯融合了。

Vector2d pt_curr;  //当前位置
Vector2d epipolar_direction;  //极线方向
bool ret = epipolarSearch(
        ref,
        curr,
        T_C_R,
        Vector2d(x, y),
        depth.ptr<double>(y)[x],
        sqrt(depth_cov2.ptr<double>(y)[x]),
        pt_curr,
        epipolar_direction
        );
if(ret == false)  continue;  //匹配失败

//匹配成功,更新深度滤波器
updateDepthFilter(Vector2d(x, y), pt_curr, T_C_R, epipolar_direction, depth, depth_cov2);

极线搜索,具体写在注释里

//极线搜索
bool epipolarSearch(
    const Mat &ref, const Mat &curr,
    const SE3d &T_C_R, const Vector2d &pt_ref,
    const double &depth_mu, const double &depth_cov,
    Vector2d &pt_curr, Vector2d &epipolar_direction) {

    Vector3d f_ref = px2cam(pt_ref);   //转归一化相机坐标(X/Z, Y/Z, 1)
    f_ref.normalize();  //单位向量
    Vector3d P_ref = f_ref * depth_mu;  //(X/Z, Y/Z, 1) * Z = (X, Y, Z), 参考帧的P向量

    Vector2d px_mean_curr = cam2px(T_C_R * P_ref); //投到第2个相机的像素坐标,书上的p2点
    double d_min = depth_mu - 3 * depth_cov;  //小概率事件左边mu - 3*sigma
    double d_max = depth_mu + 3 * depth_cov;  //小概率事件右边mu + 3*sigma
    if(d_min < 0.1) d_min = 0.1;  //实际情况考虑,不会再近了

    //因为已知位姿,把P点按深度范围投影到p2,可得到极线
    Vector2d px_min_curr = cam2px(T_C_R * (f_ref * d_min));  //按深度d_min投影的p2点
    Vector2d px_max_curr = cam2px(T_C_R * (f_ref * d_max));  //按深度d_max投影的p2点

    Vector2d epipolar_line = px_max_curr - px_min_curr;  //极线
    epipolar_direction = epipolar_line;   //向量形式
    epipolar_direction.normalize();   //按长度归一化,得到单位向量

    double half_length = 0.5 * epipolar_line.norm();    //极线线段的半长度
    if(half_length > 100) half_length = 100;    //不需要搜索太多

    // 在极线上搜索,以深度均值点(p2)为中心,左右各取半长度
    double best_ncc = -1.0;
    Vector2d best_px_curr;
    for(double l = -half_length; l <= half_length; l += 0.7) { // l+=sqrt(2)/2
        Vector2d px_curr = px_mean_curr + l * epipolar_direction;  //px_mean_curr:按深度均值计算出的p1点直接投影到p2
        if(!inside(px_curr)) continue;
        //计算NCC
        double ncc = NCC(ref, curr, pt_ref, px_curr);
        if(ncc > best_ncc) {
            best_ncc = ncc;
            best_px_curr = px_curr;
        }
    }
    if(best_ncc < 0.85f) return false;   //大于阈值才认为是匹配
    pt_curr = best_px_curr;  //通过引用形参传递匹配点
    return true;
}

块匹配在NCC函数里

double NCC(
        const Mat &ref, const Mat &curr,
        const Vector2d &pt_ref, const Vector2d &pt_curr) {

    double mean_ref = 0;
    double mean_curr = 0;
    vector<double> values_ref, values_curr;  //参考帧和当前帧的均值
    //以参考点p1, p2为中心,块扫描,像素值归一化
    for(int x = -ncc_window_size; x <= ncc_window_size; x ++) {
        for(int y = -ncc_window_size; y <= ncc_window_size; y ++) {
            double value_ref = double(ref.ptr<uchar>(int(pt_ref(1, 0) + y))[int(pt_ref(0, 0) + x)]) / 255.0;
            mean_ref += value_ref;

            //pt_curr是极线搜索的坐标,不是整数,用到双线性插值
            double value_curr = getBilinearInterpolatedValue(curr, pt_curr + Vector2d(x, y));
            mean_curr += value_curr;

            values_ref.push_back(value_ref);  //块区域内每个像素点的值
            values_curr.push_back(value_curr);
        }
    }
    //块区域内的像素均值
    mean_ref /= ncc_area;
    mean_curr /= ncc_area;

    //计算去均值的NCC
    double numerator = 0, demoniator1 = 0, demoniator2 = 0;
    for(int i = 0; i < values_ref.size(); i++) {
        //套NCC公式,用的是去均值的NCC
        double n = (values_ref[i] - mean_ref) * (values_curr[i] - mean_curr);
        numerator += n;
        demoniator1 += (values_ref[i] - mean_ref) * (values_ref[i] - mean_ref);
        demoniator2 += (values_curr[i] - mean_curr) * (values_curr[i] - mean_curr);
    }
    return numerator / sqrt(demoniator1 * demoniator2 + 1e-10);   //防止分母为0
}

高斯融合,里面包含了三角测量,三角测量公式的推导写在注释里。

bool updateDepthFilter(
    const Vector2d &pt_ref,
    const Vector2d &pt_curr,
    const SE3d &T_C_R,
    const Vector2d &epipolar_direction,
    Mat &depth,
    Mat &depth_cov2) {

    //三角化计算深度
    SE3d T_R_C = T_C_R.inverse();
    Vector3d f_ref = px2cam(pt_ref);   //p1的归一化相机坐标
    f_ref.normalize();  //O1P的单位方向向量
    Vector3d f_curr = px2cam(pt_curr);  //p2的归一化相机坐标
    f_curr.normalize();  //O2P的单位方向向量

    //三角测量法计算深度
    // 方程
    // d_ref * f_ref = d_cur * ( R_RC * f_cur ) + t_RC
    // f2 = R_RC * f_cur
    // 转化成下面这个矩阵方程组
    // => [ f_ref^T f_ref, -f_ref^T f2 ] [d_ref]   [f_ref^T t]
    //    [ f_2^T f_ref, -f2^T f2      ] [d_cur] = [f2^T t   ]
    //这里我要注释一下是怎么转化的,依据是什么
    //三角测量公式为s2x2 = s1Rx1 + t, 也就是两个相机估的p位置一样,s2为p2深度,s1为p1深度,x1,x2为特征点p1,p2的归一化坐标(书上177页)
    //现在把相机2当成ref,倒推相机1下p的深度,
    //所以 d_ref * f_ref = d_cur * ( R_RC * f_cur ) + t_RC
    //等式两边左乘f_ref^T, 得到d_ref * f_ref^T * f_ref = d_cur * f_ref^T * f2 + f_ref^T * t_RC, 其中f2 = R_RC * f_cur
    //等式两边左乘f2^T, 得到d_ref * f2^T * f_ref = d_cur * f2^T * f2 + f2^T * t_RC, 其中f2 = R_RC * f_cur
    //整理一下就得到上面的矩阵方程组
    Vector3d t = T_R_C.translation();   //第2个相机到第1个相机的平移,三角测量公式里的t,同时还是两个相机的平移
    Vector3d f2 = T_R_C.so3() * f_curr;  //O2P的方向旋转到第1个相机,代表三角测量公式里的Rx1
    Vector2d b = Vector2d(t.dot(f_ref), t.dot(f2));
    Matrix2d A;
    A(0, 0) = f_ref.dot(f_ref); //点乘,相当于f_ref^T * f_ref
    A(0, 1) = -f_ref.dot(f2);
    A(1, 0) = -A(0, 1);
    A(1, 1) = -f2.dot(f2);
    Vector2d ans = A.inverse() * b;  //矩阵规模小,直接求逆
    Vector3d xm = ans[0] * f_ref;  //相机1估计的p位置
    Vector3d xn = ans[1] * f2 + t;  //T_R_C.so3() * (ans[1] * f_curr) + t, 相机2估计的p位置变换回相机1的坐标系下
    Vector3d p_esti = (xm + xn) / 2.0;   //p的位置取两者的平均
    double depth_estimation = p_esti.norm();  //深度值,2范数,平方和开方,即mu_obs

    //计算不确定性(以一个像素为误差)
    Vector3d p = f_ref * depth_estimation;  //p的位置,O1P向量
    Vector3d a = p - t;    //O2P向量
    double t_norm = t.norm();
    double a_norm = a.norm();
    double alpha = acos(f_ref.dot(t)/t_norm); //acos要求取值在[-1,1],所以要用单位方向向量来算acos<p,t>
    double beta = acos(-a.dot(t)/(a_norm * t_norm)); //acos<a, -t>
    Vector3d f_curr_prime = px2cam(pt_curr + epipolar_direction);  //p2沿极线方向移动一个像素得到p2'
    f_curr_prime.normalize();  //得到单位方向向量
    double beta_prime = acos(f_curr_prime.dot(-t) / t_norm);   //acos<O2p2', -t>
    double gamma = M_PI - alpha - beta_prime;
    double p_prime =  t_norm * sin(beta_prime) / sin(gamma);   //移动一个像素以后新的p的深度估计
    double d_cov = p_prime - depth_estimation;
    double d_cov2 = d_cov * d_cov;

    //高斯融合
    double mu = depth.ptr<double>(int(pt_ref(1, 0)))[int(pt_ref(0, 0))];  //深度文件中的深度值
    double sigma2 = depth_cov2.ptr<double>(int(pt_ref(1, 0)))[int(pt_ref(0, 0))];

    double mu_fuse = (d_cov2 * mu + sigma2 * depth_estimation) / (sigma2 + d_cov2); //融合后的mu
    double sigma_fuse2 = (sigma2 * d_cov2) / (sigma2 + d_cov2);  //融合后的sigma

    depth.ptr<double>(int(pt_ref(1, 0)))[int(pt_ref(0, 0))] = mu_fuse;
    depth_cov2.ptr<double>(int(pt_ref(1, 0)))[int(pt_ref(0, 0))] = sigma_fuse2;

    return true;
}

完整版代码参考链接

基于深度学习的SLAM概述 目的 本博客总结最近看的几篇关于深度学习的SLAM以及基于深度学习的稠密重建,简要对比记录特点 对比 年份 名称 类型 框图 前端 输出 地图 方法 特点 回环 2021 DROID-SLAM mono-VSLAM 全图像素点+稠密光流匹配 输出每个关键帧的位姿和稠密深度图像 全局场景稠密点云地图 RAFT稠密光流+稠密BA+重投影误差 GPU显存占用较大(前端实时需要8GGPU显存,后端由于需要存储所有图像的featuremap,因此,显存占用会很大,5000帧需要24GB),位姿和全局 阅读详情

相关推荐

视觉SLAM笔记(61) 单目稠密建图

立体视觉、极线搜索与块匹配、高斯分布的深度滤波器

氢键H-H 1万+

《增强现实:原理、算法与应用》读书笔记(7)稠密深度估计

《增强现实:原理、算法与应用》读书笔记(7)稠密深度估计 增强现实技术除了要恢复相机参数和场景的稀疏结构,有时候为了更好地处理遮挡关系和合成阴影,还需要恢复出场景的稠密三维结构。因此,稠密深度估计也是增强现实技术中很重要的一环。 深度计算方法有很多种,常见的主要有立体匹配法、光度立体视觉法、色度成形法、散焦推断法以及基于深度学习的方法等,其中最常用的就是立体匹配的方法。 立体匹配是利用多视图几何原理,从不同视角拍摄的多幅图像,通过匹配恢复出场景的三维信息。 双视图立体匹配 利用相机模仿人类的双目视觉系统,从

weixin_42708301的博客 932

视觉SLAM笔记(62) 单目稠密重建

稠密深度估计、像素梯度的问题、逆深度、 图像间的变换、并行化:效率的问题、其他的改进

氢键H-H 1万+

视觉slam中的一种单目稠密建图方法

之所以只讲单目的稠密建图,这是因为,首先,对于RGBD图,我们已知所有点的深度,可以直接生成稠密的点云。其次,对于稀疏地图,其实很多VO中已经完成了稀疏地图的构建,但是稀疏地图只能用于定位,不能用于导航避障之类的工作。所以很多slam系统中会额外进行稠密地图、甚至语义地图的构建。 单目稠密建图 通常在单目VO中,我们通过特征点匹配与三角测量可以获得稀疏地图点的深度,现在我们想要建立稠密的地图,这意味着我们需要获得图片中所有像素点的深度。那么首先我们需要做的一点就是确定第一幅图的某个像素出现在其.

sky的博客 6338

ORB_SLAM2稠密点云构建.rar

readme链接:https://blog.youkuaiyun.com/qq_34289112/article/details/92561229

SLAM单目稠密重建数据集

将使用 REMODE[113, 109] 的测试数据集。它提供了一架无人机采集 的单目俯视图像,共有 200 张,同时提供了每张图像的真实位姿。 http://rpg.ifi.uzh.ch/datasets/remode_test_data.zip 处下载。 下载慢的可以去本人上传的资源处下载。 解压后,将在 test_-data/Images 中有从 0 至 200 的所有图像,并在 test_data 目录下可以看到一个文本文件,它记录了每张图像对应的位姿。

视觉SLAM⑫----建图(未完)

1.理解单目SLAM中稠密深度估计的原理 2.通过实验了解单目稠密重建的过程 3.了解几种RGB-D重建中的地图形式

qq_41694024的博客 8946

VIL-SLAM论文翻译:Stereo Visual Inertial LiDAR Simultaneous Localization and Mapping

文章目录写在前面摘要1.引言2.相关工作3.系统概述4.视觉前端5.双目视觉惯性里程计A. IMU预积分因子B. 非结构化视觉因子C. 优化和边缘化6. 激光建图A. LiDAR扫描去畸变B. 帧到地图配准7. LiDAR增强的闭环A. 回环检测B. 回环约束C. 全局位姿图优化D. 重定位8. 实验结果A.平台和软件B.测试和结果C. EuRoCMAV数据集测试9.结论 写在前面 写作参考: robot L 开源代码: 开源代码链接 论文原文: 原文链接 摘要 SLAM是移动和空中机器人的一项基本任务

JaydenQ的博客 2320

单目图像深度估计 - SLAM辅助篇:MegaDepth

单目图像深度估计 - SLAM辅助篇:MegaDepth 今天的论文笔记是关于以下这篇Paper: [1] MegaDepth-Learning Single-View Depth Prediction from Internet Photos, CVPR, 2018 [Project Page] CVPR的单目深度估计论文有很多,粗略的看了一圈,决定写这篇。之前的博客里写到过说目前所有的计算机视觉相关的深度学习方法都有一个共同的问题——对数据集的依赖。在单目图像深度估计来看呢,就是基于室内数据集NYUDe

qunniem的博客 4686

5分钟搞定PaddleOCR PP-OCRv5环境搭建:从安装到第一个识别Demo

本文提供了一份详细的PaddleOCR PP-OCRv5环境搭建与快速入门指南。通过清晰的步骤,指导读者在5分钟内完成从创建Python虚拟环境、安装PaddlePaddle框架和PaddleOCR库,到编写并运行第一个OCR识别Demo的全过程,帮助开发者快速体验最新的PP-OCRv5模型的文字识别能力。

sprite的博客 1266

用STM32F407做个USB声卡:从CubeMX配置到播放录音全功能实战(附源码)

本文详细介绍了如何使用STM32F407开发板实现USB音频设备的全功能实战,包括CubeMX配置、硬件连接、音频流处理和性能优化。通过双缓冲DMA机制和音频数据处理流程,开发者可以构建高质量的USB声卡系统,适用于录音和播放场景。附源码,助力快速上手STM32音频开发。

weixin_30301449的博客 516

经典文献阅读之--NICER-SLAM (RGB神经隐式的稠密的SLAM)

我们在图2中提供了NICER-SLAM流程的概述。给定RGB视频作为输入,我们通过端到端优化同时估计准确的三维场景几何形状和颜色,以及相机跟踪。图二显示了NICER-SLAM的系统概述。我们的方法仅采用RGB流作为输入,并输出相机姿态以及用于几何和颜色的学习分层场景表示。为了实现端到端的联合映射和跟踪,我们渲染预测的颜色、深度、法线,并根据输入RGB和单目线索进行优化。此外,我们进一步通过RGB变形损失和光流损失强化几何一致性。我们使用分层神经隐式表示来表示场景的几何形状和外观(第3节)。

lovely_yoshino的博客 1275

PyTorch ModelNet点云数据集加载实战:从下载到Dataset类完整实现

在三维视觉与点云处理领域,数据集是算法研发的基石。ModelNet作为三维物体分类的基准数据集,其地位类似于图像领域的MNIST,是入门和评估模型性能的通用标准。理解其数据格式与加载原理,是进行点云分类、分割等任务的关键前置步骤。通过PyTorch的Dataset类,开发者可以构建高效的数据管道,将原始点云文件转换为神经网络可直接处理的张量格式,这一过程涉及数据采样、归一化、特征组装等核心操作,直接影响模型的训练效率和最终性能。本文聚焦于ModelNet10/40数据集,详细解析其目录结构,并提供一套稳健的

weixin_29032337的博客 280

SLAM14讲学习笔记(九)单目稠密重建、深度滤波器详解与补充

这次的笔记我把13讲的部分内容总结一下。 虽然slam的名字叫同步定位与构图,但是书中建图的内容却少的可怜。据此高博给出了自己的解释,意为在定位的过程中,我确定了很多特征点的世界坐标,那这个过程其实就是建图了。一个点云中,每个已知世界坐标系的特征点给它的位置塞一个点,那这不就是建图吗?从这角度来说倒也没有太大的问题。但是作为用户,对于地图的要求是不一样的,比如希望地图应该是稠密的。而基于特征点方...

微鉴道长的博客 5560

DeerFlow 在 Windows 上的安装与启动详细步骤

DeerFlow Windows安装与启动指南 DeerFlow是基于LangGraph的AI Agent系统,包含后端服务和前端界面。后端安装需Python 3.12+,创建虚拟环境后安装依赖,需注意解决langgraph版本冲突问题(推荐1.0.8版本)。配置文件中需设置模型参数(如本地Qwen3-32B-AWQ模型)和sandbox配置。启动分为两步:LangGraph Server(端口2024)和Backend Gateway(端口8001)。前端要求Node.js 22+和pnpm,配置.env

笨小孩 581

STC15W204S最小系统开发指南:从串口通讯到自动热加载全流程

本文详细介绍了STC15W204S最小系统的完整开发流程。从芯片资源解析、最小系统搭建、串口通讯驱动编写(使用Timer2生成波特率),到实现基于魔术值触发的自动热加载功能,并最终集成Keil与STC-ISP软件,构建高效的自动化开发工作流,显著提升嵌入式调试效率。

a1b2c的博客 391

5个实战案例解析:如何用深度学习提升SLAM的精度与鲁棒性(附代码)

本文通过五个实战案例,深入解析了如何利用深度学习技术提升SLAM(即时定位与地图构建)系统的精度与鲁棒性。内容涵盖无监督尺度恢复、语义融合、端到端视觉惯性里程计、动态场景处理及智能回环检测,并提供了关键代码与调优技巧,为构建下一代高鲁棒性感知系统提供实用指南。

grass的博客 454

python爬虫抖音 个人资料 仅供学习参考 切勿用于商业

本文仅供学习参考 切勿用于商业 本次爬取使用fiddler+模拟器(下载抖音APP)+pycharm 1. 下载最新版本的fiddler(自行百度下载),以及相关配置 1.1.依次点击,菜单栏-Tools-Options-HTTPS,如图1红框打钩,HTTPS旁边Connections配置,如图2红框打钩 1.2.再次点击HTTPS栏,点击Actions选择第二个…to ...

dbva7063的博客 1491

DeepFactors 单目SLAM建图模块拆解:Keyframe-Frame两级结构与Work队列调度设计全解

DeepFactors 是一个实时概率密度单目 SLAM 系统,用紧凑的代码向量(compact code)表示每帧的深度信息,基于 GTAM/ISAM2 因子图实现增量式稠密建图。本文聚焦它的建图模块(mapping):为什么要把"帧"分成 Keyframe 与 Frame 两级?又是怎么用 Work 工作队列把多尺度优化、位姿精化这些异步任务优雅地调度起来的。 [![DeepFactors

gitblog_01184的博客 993

github创建账号第一步始终出错

github创建账号总结:第一次注册GitHub,填好用户名邮箱密码后进入下一步就卡在哪里,上面还提示Unable to verify your captcha response等,进入网址的解决办法以及下载其他的浏览器也无法解决,用手机浏览器抱着试一试的心态竟然成功了,分享给大家。手机下载谷歌浏览器,进入GitHub正常注册,能向下继续,邮箱验证完以后再用电脑登陆就ok啦

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 4373

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

告别传统SLAM的坑:用DROID-SLAM搞定单目、双目和RGB-D相机(附保姆级环境配置)

本文深入解析DROID-SLAM如何突破传统SLAM技术瓶颈,实现单模型支持单目、双目和RGB-D相机的全模态应用。通过可微分循环优化架构和稠密束调整层,DROID-SLAM显著提升定位精度和稳定性。文章还提供详细的避坑指南和实战技巧,帮助开发者高效部署和优化这一深度学习驱动的SLAM解决方案。

weixin_30564901的博客 207

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LingBot-Depth-ViT-L14多场景应用:AR实时遮挡、VR空间锚定、机器人SLAM前处理

本文介绍了如何在星图GPU平台上一键自动化部署lingbot-depth-pretrain-vitl-14 V1.0镜像,快速获得强大的单目深度估计与补全能力。该模型能基于普通RGB图像或融合稀疏深度数据,生成精确的稠密深度图,其核心应用场景之一是为AR应用提供实时、准确的虚拟物体遮挡处理,从而提升沉浸感。

weixin_28931449的博客 603

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

单目稠密重建地图

单目稠密重建-slam14讲前言一、运行程序代码详解二、极线搜索三、更新深度滤波器 前言 一、运行程序代码详解 判断是否读取数据集 读取数据集包括图片和世界坐标系到相机坐标的位姿 bool ret = readDatasetFiles( argv[1], color_image_files, poses_TWC ); 对整个深度图进行更新 bool update(const Mat& ref, const Mat& curr, const SE3& ..

weixin_41962807的博客 409

SLAM14讲CH13建图实践笔记

重点: 理解单目 SLAM 中稠密深度估计的原理。 通过实验了解单目稠密重建的过程。 了解几种 RGB-D 重建中的地图形式。 各种地图示意: 1. 单目稠密重建 首先,我们对图像提取特征,并根据描述子计算了特征之间的匹配。换言之,通过特征,我们对某一个空间点进行了跟踪,知道了它在各个图像之间的位置。 然后,由于我们无法仅用一张图像确定特征点的位置,所以必须通过不同视角下的观测,估计它的深度,原理即前面讲过的三角测量。 用到知识:极限搜索和快匹配技术+深度滤波器技术。 单目稠密重建实践: 数据集: h

weixin_45080292的博客 866

[论文阅读-NeRF+SLAM]NeRF-SLAM:使用神经辐射场表征的实时稠密单目SLAM系统

包含公式推导的NeRF-SLAM详解、论文阅读笔记。应该是当前SOTA的方法!

weixin_42262385的博客 2819

经典文献阅读之--NeRF-SLAM(单目稠密重建)

NeRF 是 2020 年 ECCV 上获得最佳论文荣誉提名的工作,其影响力是十分巨大的,不论是后续的学术论文还是商业落地,都引起了大量从业人员的关注。NeRF 将隐式表达推上了一个新的高度,仅用 2D 的 posed images 作为监督,即可表示复杂的三维场景,在新视角合成这一任务上的表现是非常 impressive 的。当然 NeRF 在其他领域也逐渐开始展露头角,作为新兴的方向,势必也会和传统方法发生碰撞融合,产生新的火花。在B站中有比较详细的课程。

lovely_yoshino的博客 1万+
上一篇: ceres库,g2o库做BA问题,效果对比
下一篇: 提交github的一些糟心
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值