【图像处理】Kinect相机获取初始PCL点云数据并生成PCD文件(整合了大量的有效资源和博客!!!)不定时更新~

一、前言

前段时间做了一个关于图像处理的项目,最近把之前所用到的一些好的东西给,以及我的一些小经验放到这里。其实对于当时没有接触过图像处理的我来说,遇到了不少的问题,图像处理现在的发展也是大好的,所以我希望借此机会,能将我的一点拙见分享给大家,更希望帮到更多的人。

主要是用了Kinect V2获取RGB和深度图像,降噪和滤波之后转为初始的点云数据,了解过点云的大佬们都知道,点云中有一种特殊的文本格式(.pcd)。

主要用到的工具:Kinect相机、PCL点云库、OpenCV、OpenGL(用于显示图像)、Visual Stdio 2017

====2020-10更新

推荐大家看看这两个大佬的文章!特别有帮助!:

https://cloud.tencent.com/developer/user/5926470

https://www.cnblogs.com/gaoxiang12/


首先列出几个有用的网站和博客供大家参考:

1、点云中国官网 : http://www.pclcn.org/

2、点云库官方网站(英文,但是里面包含了很多例程,可以助你一臂之力):http://pointclouds.org/

3、点云库的安装和环境配置:https://blog.csdn.net/weixin_41991128/article/details/83864713

4、OpenGL的安装和环境配置:https://blog.csdn.net/AvatarForTest/article/details/79199807

5、OpenCV的安装和环境配置:https://blog.csdn.net/weixin_41991128/article/details/83656543

6、OpenCV教程(很详细的资料整合):

7、OpenGL官方文档(中文):https://learnopengl-cn.readthedocs.io/zh/latest/

8、Kinect相机初体验:https://www.xuebuyuan.com/582609.html

9、点云处理:http://www.p-chao.com/pointcloud/

二、具体的代码实现

1、Kinect相机的配置

Kinect相机的Window下环境配置请参考:https://blog.csdn.net/qq_37059483/article/details/77855398

在VS中也需要进行相应的设置:

包含目录加上: 
$ "安装kinect SDK时的安装目录"\inc; 
库目录加上: 
$ "安装kinect SDK时的安装目录"\lib\x64;(注意x64/x86)

附加依赖项加上:

kinect20.lib

先使用OpenCV + Kinect 实现以下获取原始的彩色,深度,红外数据。

参考博客:https://blog.csdn.net/jiaojialulu/article/details/53087988

#include "kinect.h"
#include <iostream>
#include <opencv2/core/core.hpp>  
#include <opencv2\opencv.hpp>
#include <opencv2/highgui/highgui.hpp>  
using namespace cv;
using namespace std;

// 安全释放指针
template<class Interface>
inline void SafeRelease(Interface *& pInterfaceToRelease)
{
    if (pInterfaceToRelease != NULL)
    {
        pInterfaceToRelease->Release();
        pInterfaceToRelease = NULL;
    }
}

int main()
{
    // 获取Kinect设备
    IKinectSensor* m_pKinectSensor;
    HRESULT hr;
    hr = GetDefaultKinectSensor(&m_pKinectSensor);
    if (FAILED(hr))
    {
        return hr;
    }

    IMultiSourceFrameReader* m_pMultiFrameReader;
    if (m_pKinectSensor)
    {
        hr = m_pKinectSensor->Open();
        if (SUCCEEDED(hr))
        {
            // 获取多数据源到读取器  
            hr = m_pKinectSensor->OpenMultiSourceFrameReader(
                FrameSourceTypes::FrameSourceTypes_Color |
                FrameSourceTypes::FrameSourceTypes_Infrared |
                FrameSourceTypes::FrameSourceTypes_Depth,
                &m_pMultiFrameReader);
        }
    }

    if (!m_pKinectSensor || FAILED(hr))
    {
        return E_FAIL;
    }
    // 三个数据帧及引用
    IDepthFrameReference* m_pDepthFrameReference;
    IColorFrameReference* m_pColorFrameReference;
    IInfraredFrameReference* m_pInfraredFrameReference;
    IInfraredFrame* m_pInfraredFrame;
    IDepthFrame* m_pDepthFrame;
    IColorFrame* m_pColorFrame;
    // 三个图片格式
    Mat i_rgb(1080, 1920, CV_8UC4);      //注意:这里必须为4通道的图,Kinect的数据只能以Bgra格式传出
    Mat i_depth(424, 512, CV_8UC1);
    Mat i_src_depth(424, 512, CV_16UC1);
    Mat i_ir(424, 512, CV_16UC1);

    UINT16 *depthData = new UINT16[424 * 512];
    IMultiSourceFrame* m_pMultiFrame = nullptr;
    while (true)
    {
        // 获取新的一个多源数据帧
        hr = m_pMultiFrameReader->AcquireLatestFrame(&m_pMultiFrame);
        if (FAILED(hr) || !m_pMultiFrame)
        {
            //cout << "!!!" << endl;
            continue;
        }

        // 从多源数据帧中分离出彩色数据,深度数据和红外数据
        if (SUCCEEDED(hr))
            hr = m_pMultiFrame->get_ColorFrameReference(&m_pColorFrameReference);
        if (SUCCEEDED(hr))
            hr = m_pColorFrameReference->AcquireFrame(&m_pColorFrame);
        if (SUCCEEDED(hr))
            hr = m_pMultiFrame->get_DepthFrameReference(&m_pDepthFrameReference);
        if (SUCCEEDED(hr))
            hr = m_pDepthFrameReference->AcquireFrame(&m_pDepthFrame);
        if (SUCCEEDED(hr))
            hr = m_pMultiFrame->get_InfraredFrameReference(&m_pInfraredFrameReference);
        if (SUCCEEDED(hr))
            hr = m_pInfraredFrameReference->AcquireFrame(&m_pInfraredFrame);

        // color拷贝到图片中
        UINT nColorBufferSize = 1920 * 1080 * 4;
        if (SUCCEEDED(hr))
            hr = m_pColorFrame->CopyConvertedFrameDataToArray(nColorBufferSize, reinterpret_cast<BYTE*>(i_rgb.data), ColorImageFormat::ColorImageFormat_Bgra);

        // depth拷贝到图片中
        if (SUCCEEDED(hr))
        {
            hr = m_pDepthFrame->CopyFrameDataToArray(424 * 512, depthData);
            hr = m_pDepthFrame->CopyFrameDataToArray(424 * 512, reinterpret_cast<UINT16*>(i_src_depth.data));
        }

        // infrared拷贝到图片中
        if (SUCCEEDED(hr))
        {
            hr = m_pInfraredFrame->CopyFrameDataToArray(424 * 512, reinterpret_cast<UINT16*>(i_ir.data));
        }

        Mat i_rgb_resize = i_rgb.clone();       // 缩小方便看
        cv::resize(i_rgb_resize, i_rgb_resize,Size(512, 424));
        // 显示
        imshow("rgb", i_rgb_resize);
        if (waitKey(1) == VK_ESCAPE)
            break;
        imshow("i_src_depth", i_src_depth);
        if (waitKey(1) == VK_ESCAPE)
            break;
        imshow("ir", i_ir);
        if (waitKey(1) == VK_ESCAPE)
            break;

        // 释放资源
        SafeRelease(m_pColorFrame);
        SafeRelease(m_pDepthFrame);
        SafeRelease(m_pInfraredFrame);
        SafeRelease(m_pColorFrameReference);
        SafeRelease(m_pDepthFrameReference);
        SafeRelease(m_pInfraredFrameReference);
        SafeRelease(m_pMultiFrame);
    }
    // 关闭窗口,设备
    cv::destroyAllWindows();
    m_pKinectSensor->Close();
    std::system("pause");
    return 0;
}

二、获取原始点云数据

待更新~~~

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_ClivenZ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值