DynaSLAM-11 DynaSLAM中RGB-D运行流程(Ⅰ):调用Mask 初始化R-CNN网络

news2025/1/16 18:55:42

目录

1.执行例程rgbd_tum

2.SegmentDynObject::SegmentDynObject方法

3. SegmentDynObject::GetSegmentation

4.初始化SLAM系统


1.执行例程rgbd_tum

/home/lhwnb/Desktop/slam/DynaSLAM/Examples/RGB-D/rgbd_tum 
/home/lhwnb/Desktop/slam/DynaSLAM/Vocabulary/ORBvoc.txt 
/home/lhwnb/Desktop/slam/DynaSLAM/Examples/RGB-D/TUM1.yaml 
/home/lhwnb/Desktop/slam/DynaSLAM/dataset/rgbd_dataset_freiburg1_xyz/ 
/home/lhwnb/Desktop/slam/DynaSLAM/dataset/assciation.txt 
/home/lhwnb/Desktop/slam/DynaSLAM/dataset/mask/ 
/home/lhwnb/Desktop/slam/DynaSLAM/dataset/output/

        执行例程的时候输入到CLion中的程序实参是这样的:

        分别对应着RGB例程的可执行文件、ORB字典的路径、相机的配置文件、数据集、深度图和RGB图的对齐文件、mask目录(可选)、output目录(可选)。

        如果不指定mask目录和output目录,则程序的执行和ORB-SLAM2无区别。

        通过LoadImage函数将RGB图像读入vstrImageFilenamesRGB中,深度图读入vstrImageFilenamesD中,时间戳读入vTimestamps中。

        随后测试Mask R-CNN网络是否可用:

    // Initialize Mask R-CNN
    DynaSLAM::SegmentDynObject *MaskNet;
    if (argc==6 || argc==7)
    {
        cout << "Loading Mask R-CNN. This could take a while..." << endl;
        MaskNet = new DynaSLAM::SegmentDynObject();
        cout << "Mask R-CNN loaded!" << endl;
    }
%YAML:1.0
py_path: "./src/python/"
module_name: "MaskRCNN"
class_name: "Mask"
get_dyn_seg: "GetDynSeg"

       主要是加载了几个参数:

        @py_path : src/python目录

        @module_name : MaskRCNN文件

         @class_name:Mask类

         @get_dyn_seg:GetDynSeg MaskRCNN.py中Mask类的方法

        

2.SegmentDynObject::SegmentDynObject方法

SegmentDynObject::SegmentDynObject(){
    std::cout << "Importing Mask R-CNN Settings..." << std::endl;
    ImportSettings();
    std::string x;
    setenv("PYTHONPATH", this->py_path.c_str(), 1);
    x = getenv("PYTHONPATH");
    Py_Initialize();
    this->cvt = new NDArrayConverter();
    this->py_module = PyImport_ImportModule(this->module_name.c_str());
    assert(this->py_module != NULL);
    this->py_class = PyObject_GetAttrString(this->py_module, this->class_name.c_str());
    assert(this->py_class != NULL);
    this->net = PyInstance_New(this->py_class, NULL, NULL);
    assert(this->net != NULL);
    std::cout << "Creating net instance..." << std::endl;
    cv::Mat image  = cv::Mat::zeros(480,640,CV_8UC3); //Be careful with size!!
    std::cout << "Loading net parameters..." << std::endl;
    GetSegmentation(image);
}

        SegmentDynObject::SegmentDynObject方法是加载Mask R-CNN网络的参数并测试网络是否有效并实例化GetDynSeg方法,如果python部分没配置正确的画在这里会报段错误。

        setenv起到改变或增加环境变量的作用,用法如下:

        int setenv(const char *name,const char * value,int overwrite);

        @name为环境变量名称字符串。
        @value则为变量内容。

        @overwrite用来决定是否要改变已存在的环境变量。

        如果overwrite不为0,则改变环境变量原有内容,原有内容会被改为参数value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。
        @return 执行成功则返回0,有错误发生时返回-1。
        这是例子:

#include<stdlib.h>
main()
{
  char * p;
  if((p=getenv(“USER”)))
      printf(“USER =%s\n”,p);
  setenv(“USER”,”test”,1);
  printf(“USER=%s\n”,getenv(“USEr”));
  unsetenv(“USER”);
  printf(“USER=%s\n”,getenv(“USER”));
}

        执行结果:USER = root        USER = test          USER = (null)

        py_module 的类型是PyObject *类型,通过PyImport_ImportModule方法读入src/python目录下的MaskRCNN.py文件,如果读入文件为空报错。

        py_class 的类型是PyObject *类型,通过PyObject_GetAttrString方法导入已导入模块(MaskRCNN.py)中的方法或类(MaskRCNN.py中的Mask类)。

        net  的类型是PyObject *类型,通过PyInstance_New方法使用类构造对象。

        这样我们顺利地构造了MaskRCNN.py中的Mask类。

        下面我们创建网络实例:Creating net instance....,首先创建一个480*640的空白图像。

        调用GetSegmentation函数对该张图片进行处理。

3. SegmentDynObject::GetSegmentation

cv::Mat SegmentDynObject::GetSegmentation(cv::Mat &image,std::string dir, std::string name){
    cv::Mat seg = cv::imread(dir+"/"+name,CV_LOAD_IMAGE_UNCHANGED);
    if(seg.empty()){
        PyObject* py_image = cvt->toNDArray(image.clone());
        assert(py_image != NULL);
        PyObject* py_mask_image = PyObject_CallMethod(this->net, const_cast<char*>(this->get_dyn_seg.c_str()),"(O)",py_image);
        seg = cvt->toMat(py_mask_image).clone();
        seg.cv::Mat::convertTo(seg,CV_8U);//0 background y 1 foreground
        if(dir.compare("no_save")!=0){
            DIR* _dir = opendir(dir.c_str());
            if (_dir) {closedir(_dir);}
            else if (ENOENT == errno)
            {
                const int check = mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
                if (check == -1) {
                    std::string str = dir;
                    str.replace(str.end() - 6, str.end(), "");
                    mkdir(str.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
                }
            }
            cv::imwrite(dir+"/"+name,seg);
        }
    }
    return seg;
}

        本方法将传入的image调用MaskRCNN.py中的GetDynSeg方法进行语义分割,得到动态掩码图。

图 - 图中白色的为先验动态物体  0 for background and 1 for foreground

         首先将image图片转换成tensor格式存储在py_image在,判断是否读取成功。

        通过PyObject_CallMethod方法调用(this -> net 是MaskRCNN.py中Mask类实例化的一个对象,this->get_dyn_seg 是该类中的一个方法求得图像的mask信息,再将其转化成图片格式保存起来。返回图像。

        现在Mask R-CNN网络初始化完毕,屏幕输出Mask net loaded!。

4.初始化SLAM系统

        这部分和双目相同,详情见博客:

DynaSLAM-8 DynaSLAM中双目运行流程(Ⅱ):初始化SLAM系统部分System.ccicon-default.png?t=N0U7https://blog.csdn.net/qq_41694024/article/details/128843822        初始化

    // Dilation settings
    int dilation_size = 15;
    cv::Mat kernel = getStructuringElement(cv::MORPH_ELLIPSE,
                                           cv::Size( 2*dilation_size + 1, 2*dilation_size+1 ),
                                           cv::Point( dilation_size, dilation_size ) );

        关于Dilate它的本质是取邻域的最大值(是和像素值有关的)。

    if (argc==7)
    {
        std::string dir = string(argv[6]);
        mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
        dir = string(argv[6]) + "/rgb/";
        mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
        dir = string(argv[6]) + "/depth/";
        mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
        dir = string(argv[6]) + "/mask/";
        mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
    }

        如果输入的参数是7个,即调用Mask R-CNN网络的情况下,创建几个目录:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/198059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多线程与线程池demo

第一步&#xff1a;切割数据的方法 public static List<List<Integer>> getProcessData(Integer batchSize) {List<Integer> originData new ArrayList<>();for (int i 0; i < 100; i) {originData.add(i);}List<List<Integer>> proc…

深度学习笔记:神经网络的学习(2)

本章上一篇可见链接 https://blog.csdn.net/Raine_Yang/article/details/128682091?spm1001.2014.3001.5501 梯度下降法&#xff08;gradient descend&#xff09; 神经网络学习的目标是找到使损失函数最小的参数&#xff08;权重和偏置&#xff09;。通过求得损失函数&#…

【JavaEE】快速了解什么是Maven?

✨哈喽&#xff0c;大家好&#xff0c;我是辰柒&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:学习如何使用maven&#xff01; &#x1f680;&#x1f680;代码存放仓库github&#xff1a;JavaEE代码&#xff01; ⛵⛵作者简介&#xff…

C++STL——stack与queue

stack与queuestack与queuepriority_queue容器适配器vector与list的反向迭代器模拟实现仿函数deque(了解)stack与queue模拟实现priority_queue模拟实现stack与queue 这两个就是之前数据结构学过的栈和队列&#xff0c;只不过多了几个接口。 stack&#xff1a; queue&#xff…

【MySQL】MySQL 8 的 JSON 新特性详解(1)JSON 数据类型

目录一、概述二、MySQL 8 的环境搭建三、创建数据库、数据表并插入默认数据四、JSON格式数据的增加和查询1. 增加一条带JOSN格式的数据2.查询JSON内数据3.带筛选条件的查询五、总结一、概述 你好&#xff0c;我是小雨青年&#xff0c;一名使用MySQL 8 的程序员。 MySQL 8 引入…

Hadoop安装(二) --- Hadoop安装

目录 Hadoop安装&#xff08;一&#xff09;---JDK安装 修改hadoop313的权限 更改配置文件 配置core-site.xml 配置hadoop-env.sh 配置hdfs-site.xml 配置mapred-site.xml 配置yarn-site.xml 配置环境 刷新当前的shell环境 初始化 启动所有 SH 修改hadoop31…

Android Studio 从安装到第一个Android 应用Demo

安装Android Studio 安装需要 上网 &#xff0c;我这挺顺利的&#xff0c;就是在官网下载安装包&#xff0c;一路 Next&#xff0c;大概连下载总共半个小时。 第一个应用 参考官方教程&#xff1a;https://developer.android.com/codelabs/basic-android-kotlin-compose-firs…

Redis最佳实践

一、Redis键值设计 1.1、优雅的key结构 Redis的key&#xff0c;最佳实践约定&#xff1a; 遵循基本格式&#xff1a;【业务名称】:【数据名】:【id】长度不超过44字节不包含特殊字符 好处 可读性强避免key冲突方便管理更节省内存 1.2、拒绝BigKey BigKey通常以Key的大小和…

SOLIDWORKS PDM的智能报表自动生成工具

一、SOLIDWORKS企业高级报表软件介绍&#xff1a; SolidKits.Reports&#xff08;企业高级报表&#xff09;是一款无缝集成于SOLIDWORKS PDM的智能报表自动生成工具&#xff0c;可以自动生成企业所需的各类报表数据&#xff0c;涵盖结构数据报表、离散数据报表、变更数据报表、…

rocketmq源码-consumer负载均衡逻辑

前言 这篇笔记主要记录consumer在启动过程中&#xff0c;负载均衡的逻辑&#xff0c;多个消费者组成一个消费者组&#xff0c;对于集群模式&#xff0c;同一个消费者组中的多个消费者共同消费一个topic下的所有消息&#xff0c;所以每个consumer可能会处理N个messageQueue&…

【4】KVM管理 | 虚拟机的管理 | 克隆 | 快照

目录 1、虚机基本管理 2、虚机的克隆 3、增量镜像 4、虚机快照 1、虚机基本管理 查看正在运行的虚机 [rootlocalhost ~]# virsh list Id Name State ----------------------------------------------------查看所有的虚机 [rootlocalhost ~…

Apache Oozie(1):Apache Oozie简介

1 Oozie 概述 Oozie 是一个用来管理 Hadoop 生态圈 job 的工作流调度系统。由Cloudera 公司贡献给 Apache。Oozie 是运行于 Java servlet 容器上的一个 java web 应用。Oozie 的目的是按照 DAG&#xff08;有向无环图&#xff09;调度一系列的 Map/Reduce或者Hive 等任务。Ooz…

Java SE 进阶(二)之 HashSet底层原理

文章目录前言HashSet底层原理1.哈希表2.哈希值3.底层原理4.回答三个问题前言 关于Set和HashSet的API使用可参见 集合基础入门&#xff08;Collection&#xff0c;ArrayList&#xff0c;HashSet&#xff0c;HashMap&#xff09; HashSet底层原理 1.哈希表 HashSet集合底层采…

Vue组件 —— 单文件组件

追溯vue组件问题 在未讲项目之前&#xff0c;在 这一篇内容当中就讲到了组件引入使用&#xff0c;有内置的组件和动态组件以及封装一个swiper组件&#xff0c;组件也分为全局组件和局部组件&#xff0c;在讲在项目当中去使用组件之前先简单的回顾一下组件的编写&#xff1a; &…

89.【SpringBoot-02】

SpringBoot聊一聊如何构建一个网站(十四)、.SpringBoot整合数据库操作1.整合JDBC(1).SpringData简介(2).整合JDBC(3).JdbcTemplate ⭐2. 整合Druid数据源 &#xff08;德鲁伊&#xff09;(1).Druid简介(2).配置数据源(3).配置Druid数据源监控(4).配置Druid数据源过滤器(5).注解…

Echarts的Y轴添加定值横线的示例

第010个点击查看专栏目录Echarts折线图的y轴要画一条横线&#xff0c;主要是在series中设置markLine的图表标线参数&#xff0c;具体的参考源代码。文章目录示例效果示例源代码&#xff08;共142行&#xff09;相关资料参考专栏介绍示例效果 示例源代码&#xff08;共142行&…

怎么在Windows电脑更新 DirectX ?

玩游戏的人应该都对DirectX不陌生&#xff0c;它可以提高游戏或多媒体程序的运行效率&#xff0c;增强3d图形和声音效果。但很多人都不知道DirectX该如何更新&#xff0c;这篇文章将以Win10为例&#xff0c;教大家怎么在电脑上更新DirectX。 一、检查当前DirectX版本 如果你不…

简单聊一聊组件封装

封装一个思维导图组件 最近封装了一个简单的思维导图组件&#xff0c;在此简单记录一下心里历程 组件样式 组件结构设计 节点之间的线分成三部分&#xff0c;分别是竖线左边的横线A、竖线B、竖线右边的横线C&#xff0c;所以一个节点可以包含以下几个元素&#xff1a; 横线…

VBA提高篇_18 VBA代码录制优化Select(tion)及表格合并Merge(cells()/Rows()/Columns()

文章目录1. Cells(1,1)2. Rows(Str)和Columns(Str)3. VBA合并单元格3.1 Range.MergeCells属性:3.2 Range.Merge/UnMerage属性:3.3 Range.Merge(参数True/False)3.4 操作合并/取消合并单元格的两种方法4. Select / Selection 和 录制宏的代码优化4.1 Select / Selection4.2 录制…

anconda的pip下载包出现的问题

问题一: 在anconda里面如何创建新的python环境(也就是更换新的python版本) 1.先打开anconda软件,创建需要的环境 2. 环境创建好之后,去pycharm里面进行配置解释器 3. 这样就可以用了 问题二:pip的安装软件时出现包找不到的问题? 注意:因为我们刚刚创建了一个python环境,等…