RGB-D点云生成

bin文件夹下为生成的可执行文件generate_cloud,执行时和data文件放在同一文件夹下。

图像数据来自小觅相机。

src下的源码,包括generatePointCloud.cpp和CMakeLists.txt

// C++ 标准库
#include <iostream>
#include <string>
//#include <unistd.h>
using namespace std;

// OpenCV 库
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
//#include <pcl/visualization/cloud_viewer.h>

// PCL 库
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

// 定义点云类型
typedef pcl::PointXYZRGBA PointT;
typedef pcl::PointCloud<PointT> PointCloud; 

//pcl::visualization::CloudViewer viewer("pcd viewer");  

// 相机内参
const double camera_factor = 1000;
/*
const double camera_cx = 325.5;
const double camera_cy = 253.5;  //nyuv2数据集:http://cs.nyu.edu/~silberman/datasets/
const double camera_fx = 518.0;
const double camera_fy = 519.0;
*/
const double camera_cx = 682.3;
const double camera_cy = 254.9;
const double camera_fx = 979.8;  //小觅
const double camera_fy = 942.8;

// 主函数
int main( int argc, char** argv )
{
    // 读取./data/rgb.png和./data/depth.png,并转化为点云

    // 图像矩阵
    cv::Mat rgb, depth;
    // 使用cv::imread()来读取图像
    // API: http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imread#cv2.imread
    rgb = cv::imread( "./data/rgb.png" );
    // rgb 图像是8UC3的彩色图像
    // depth 是16UC1的单通道图像,注意flags设置-1,表示读取原始数据不做任何修改
    depth = cv::imread( "./data/depth.png", -1 );

    // 点云变量
    // 使用智能指针,创建一个空点云。这种指针用完会自动释放。
    PointCloud::Ptr cloud ( new PointCloud );
    // 遍历深度图
    for (int m = 0; m < depth.rows; m++)
        for (int n=0; n < depth.cols; n++)
        {
            // 获取深度图中(m,n)处的值
            ushort d = depth.ptr<ushort>(m)[n];
            // d 可能没有值,若如此,跳过此点
            if (d == 0 || d >= 4096)
                continue;

            //获得一个点的位置与颜色
            // d 存在值,则向点云增加一个点
            PointT p;
            // 计算这个点的空间坐标
            p.z = double(d) / camera_factor;
            p.x = (n - camera_cx) * p.z / camera_fx;
            p.y = (m - camera_cy) * p.z / camera_fy;
            // 从rgb图像中获取它的颜色
            // rgb是三通道的BGR格式图,所以按下面的顺序获取颜色
            p.b = rgb.ptr<uchar>(m)[n*3];
            p.g = rgb.ptr<uchar>(m)[n*3+1];
            p.r = rgb.ptr<uchar>(m)[n*3+2];

            // 把p加入到点云中
            cloud->points.push_back( p );
        }
/*
//    viewer.showCloud(cloud);
//    sleep(100);////#include <unistd.h>
//    return 0;
*/
    // 设置并保存点云
    cloud->height = 1;
    cloud->width = cloud->points.size();
    cout<<"point cloud size = "<<cloud->points.size()<<endl;
    cloud->is_dense = false;
    pcl::io::savePCDFile( "./pointcloud.pcd", *cloud );
    // 清除数据并退出
    cloud->points.clear();
    cout<<"Point cloud saved."<<endl;
    return 0;
}

CMakeLists.txt

# 增加PCL库的依赖
FIND_PACKAGE( PCL REQUIRED )

list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4") # use this in Ubuntu 16.04
# 增加opencv的依赖
FIND_PACKAGE( OpenCV REQUIRED )

# 添加头文件和库文件
ADD_DEFINITIONS( ${PCL_DEFINITIONS} )
INCLUDE_DIRECTORIES( ${PCL_INCLUDE_DIRS}  )
LINK_LIBRARIES( ${PCL_LIBRARY_DIRS} )

ADD_EXECUTABLE( generate_cloud generatePointCloud.cpp )
TARGET_LINK_LIBRARIES( generate_cloud ${OpenCV_LIBS}
    ${PCL_LIBRARIES} )

和src文件夹在同一文件夹下的CMakeLists.txt

CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )
PROJECT( slam )

SET(CMAKE_CXX_COMPILER "g++")
SET( CMAKE_BUILD_TYPE Debug  )
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include )
LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib)

ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src )

编译后可执行文件在bin中。

学习链接: http://www.cnblogs.com/gaoxiang12/p/4652478.html

原文地址:https://www.cnblogs.com/112358nizhipeng/p/9217145.html

时间: 2024-11-05 19:29:00

RGB-D点云生成的相关文章

9个优秀网上免费标签云生成工具

9个优秀网上免费标签云生成工具 Wordle Wordle是产生“词云:.不同的字体,布局和配色方案,你可以调整你的云..您可以打印出来,或将它们保存到Wordle画廊与朋友分享. tagCloud发生器 只需几步下载表格,这可以产生HTML和Flash在线标签云. ImageChef 您可以创建不同的风格和异形词云,并作为明信片发送给您的朋友等. ABCya A字云是一个字频的图形表示.您可以键入或粘贴到自己的主页上显示框的文字和按箭头按钮来查看生成的字云方向.使用云以上的图形按钮,可以改变一

彩色点云生成mesh的纹理

上一篇文章 https://www.cnblogs.com/lovebay/p/11423576.html ,我们使用MPA算法实现了 点云生成mesh,但仅仅实现mesh的顶点着色,为了让mesh有更丰富更真实的纹理信息,这篇文章将实现密集的彩色点云为mesh生成高清的纹理,实现方法如下: 第一步:mesh的法线估计(正确的法向) 第二步:mesh批量分割(得到多个mesh小块),分割原则:同一个mesh小块,在某个方向的投影可见的. 第三步:将多个mesh小块批量生成高清纹理. 第四步:将多

从当当客户端api抓取书评到词云生成

看了好几本大冰的书,感觉对自己的思维有不少的影响.想看看其他读者的评论.便想从当当下手抓取他们评论做个词云.想着网页版说不定有麻烦的反爬,干脆从手机客户端下手好了.果其不然,找到一个书评的api.发送请求就有详情的json返回,简直不要太方便... 要是对手机客户端做信息爬取,建议安装一个手机模拟器. 思路: 在安装好的手机模拟器设置好用来抓包的代理,我用的charles.记得安装证书,不然抓不了https的数据包. 然后安装当当客户端,打开进到书评页面. 然后成功在charles找到了这个接口

[python] 词云:wordcloud包的安装、使用、原理(源码分析)、中文词云生成、代码重写

词云,又称文字云.标签云,是对文本数据中出现频率较高的“关键词”在视觉上的突出呈现,形成关键词的渲染形成类似云一样的彩色图片,从而一眼就可以领略文本数据的主要表达意思.常见于博客.微博.文章分析等. 除了网上现成的Wordle.Tagxedo.Tagul.Tagcrowd等词云制作工具,在python中也可以用wordcloud包比较轻松地实现(官网.github项目): from wordcloud import WordCloud import matplotlib.pyplot as pl

中文词频统计与词云生成

https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2822 中文词频统计 1. 下载一长篇中文小说. 2. 从文件读取待分析文本. 3. 安装并使用jieba进行中文分词. pip install jieba import jieba jieba.lcut(text) 4. 更新词库,加入所分析对象的专业词汇. jieba.add_word('天罡北斗阵')  #逐个添加 jieba.load_userdict(word_dict) 

Rplidar学习(五)—— rplidar使用cartographer_ros进行地图云生成

一.Cartographer简介 Cartographer是google开源的通用2D和3D定位与地图同步构建的SLAM工具,并提供ROS接口.官网地址:https://github.com/googlecartographer 二.安装方法 1.安装全部依赖项 sudo apt-get update sudo apt-get install -y cmake g++ git google-mock libboost-all-dev libeigen3-dev libgflags-dev lib

python生成词云

期末复习比较忙过段时间来专门写scrapy框架使用,今天介绍如何用python生成词云,虽然网上有很多词云生成工具,不过自己用python来写是不是更有成就感. 今天要生成的是励志歌曲的词云,百度文库里面找了20来首,如<倔强>,海阔天空是,什么的大家熟悉的. 所要用到的python库有 jieba(一个中文分词库).wordcould .matplotlib.PIL.numpy. 首先我们要做的是读取歌词.我将歌词存在了文件目录下励志歌曲文本中. 现在来读取他 #encoding=gbk l

抓取网易云音乐歌曲热门评论生成词云

前言 抓数据 抓包分析 加密信息处理 抓取热门评论内容 词云 词云运行效果 总结 前言 网易云音乐一直是我向往的"神坛",听音乐看到走心的评论的那一刻,高山流水.于是今天来抓取一下歌曲的热门评论.并做成词云来展示,看看相对于这首歌最让人有感受的评论内容是什么. 做成词云的好处就是直观以及美观, 其他的我也想不出来有什么了. 抓数据 要想做成词云,首先得有数据才行.于是需要一点点的爬虫技巧. 抓包分析 加密信息处理 抓取热门评论内容 抓包分析 使用Chrome控制台.我们可以轻松的找到评

使用爬虫抓取网易云音乐热门评论生成好玩的词云

互联网爬虫是一个很有意思的技术,借由爬虫,我们可以做到很多好玩的事情--这其中就包括爬取评论. 词云就是个更好玩的技术,通过技术方法分析词语出现频率,生成可视化的图形,将文字内容用图形呈现,想想就很意思. 这次,我们就试着把这两个技术结合起来吧. 前言 网易云音乐一直是我向往的"神坛",听音乐看到走心的评论的那一刻,高山流水.于是今天来抓取一下歌曲的热门评论.并做成词云来展示,看看相对于这首歌最让人有感受的评论内容是什么. 做成词云的好处就是直观以及美观, 其他的我也想不出来有什么了.