RGBD slam 学习, qt 工程环境配置.md

  1. 参考链接: http://blog.csdn.net/jasmine_shine/article/details/50973748
    配置工程实现高翔师兄博客第二讲功能,Qt的关键字提醒功能更方便开发:http://www.cnblogs.com/gaoxiang12/p/4652478.html
  2. 工程配置:
    新建 qt console 程序,删除默认main函数内容,写入练习程序:
// C++ 标准库
#include 
#include 
using namespace std;

// OpenCV 库
#include 
#include 

// PCL 库
#include 
#include 

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

// 相机内参
const double camera_factor = 1000;
const double camera_cx = 325.5;
const double camera_cy = 253.5;
const double camera_fx = 518.0;
const double camera_fy = 519.0;

// 主函数 
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(m)[n];
            // d 可能没有值,若如此,跳过此点
            if (d == 0)
                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(m)[n*3];
            p.g = rgb.ptr(m)[n*3+1];
            p.r = rgb.ptr(m)[n*3+2];

            // 把p加入到点云中
            cloud->points.push_back( p );
        }
    // 设置并保存点云
    cloud->height = 1;
    cloud->width = cloud->points.size();
    cout<<"point cloud size = "<points.size()<is_dense = false;
    pcl::io::savePCDFile( "./data/pointcloud.pcd", *cloud );
    // 清除数据并退出
    cloud->points.clear();
    cout<<"Point cloud saved."<return 0;
}
  1. 在 .pro 文件中写入文件目录和依赖项,qt 默认没有开启 C++ 标准。 相关路径可能会有少许差别,在自己ubuntu中相关路径下找到对应文件核对下。
QMAKE_CXXFLAGS += -std=c++11
INCLUDEPATH +=  /usr/include  \
                /usr/include/opencv  \
                /usr/include/opencv2 \
                /usr/include/pcl-1.7 \
                /usr/include/eigen3  \
                /usr/include/boost \

LIBS += /usr/lib/x86_64-linux-gnu/libopencv_video.so  \
        /usr/lib/x86_64-linux-gnu/libopencv_objdetect.so \
        /usr/lib/x86_64-linux-gnu/libopencv_ml.so  \
        /usr/lib/x86_64-linux-gnu/libopencv_legacy.so \
        /usr/lib/x86_64-linux-gnu/libopencv_core.so \
        /usr/lib/x86_64-linux-gnu/libopencv_features2d.so  \
        /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so \
        /usr/lib/x86_64-linux-gnu/libopencv_highgui.so \
        /usr/lib/x86_64-linux-gnu/libopencv_gpu.so \
        /usr/lib/x86_64-linux-gnu/libopencv_flann.so   \
        /usr/lib/x86_64-linux-gnu/libopencv_contrib.so \
        /usr/lib/x86_64-linux-gnu/libopencv_calib3d.so  \
        /usr/lib/libpcl_common.so.1.7 \
        /usr/lib/libpcl_io.so.1.7 \
        /usr/lib/libpcl_io_ply.so.1.7 \
        /usr/lib/x86_64-linux-gnu/libboost_system.so
  1. 将例程中的图片数据放入 qt 工程build-rgbdslam-Desktop_Qt_5_5_1_GCC_64bit-Debug目录中,例程中的读取存放文件路径也要有相应更改。
rgb=cv::imread("rgb.png");
depth=cv::imread("depth.png",-1);
pcl::io::savePCDFile("pointcloud.pcd",*cloud);
  1. bulid 后查看点云图像, terminator 进入build-rgbdslam-Desktop_Qt_5_5_1_GCC_64bit-Debug目录中运行
$: pcl_viewer pointcloud.pcd

你可能感兴趣的:(SLAM,qt,opencv,pcl,slam,ubunrtu)