Kinect2点云配准

使用opencv对Kinect2相机采集的深度图像和彩色图像实现配准

使用opencv对Kinect2采集的深度图像和彩色图像进行配准结果进行显示。

opencv的数据结构

在进行kinect2相机实现点云的配准过程中,使用opencv创建了Mat类型的数据,mat类型数据创建过程中,Mat i_depthToRgb(424, 512, CV_8UC4);//高
需要指定图像的宽(512)和高(424),同时还需要指定数据类型,本例中指定的数据类型为CV_8UC4。本例中使用的数据类型为CV_8UC4,8U表示无符号整型,使用Kinect2获得的彩色图像为4通道(ColorImageFormat_Bgra),其中C4表示的就是四个通道。在进行点云映射过程中使用函数MapDepthFrameToColorSpace实现,进行显示配准之后的点云显示过程中使用代码以下进行显示。对于i_depthToRgb.data和ColorImg.data之间的转换使用Mat::data指针实现。通过遍历的方式实现。同时在进行图像数据转换的过程中也可以使用data 指针的复制实现ma类型的初始化, cv::Mat mcolorImage(cColorHeight, cColorWidth, CV_8UC4, pBuffer);// pBuffer为Kinect相机采集的RGBQUAD
结构的颜色图像,通过以上方式实现imshow的显示。Opencv中的数据类型文档中介绍的共有30种。同时也可以使用宏定义自行增加数据类型,增加数据类型的方法可以查看链接。可以使用转换函数converto实现数据类型的转换。数据类型的含义和具体转换方式可通过链接查看OpenCV中Mat数据类型及相互转换使用imshow进行显示图像时,需要将像素值映射到[0,255],不同数据类型显示时需要进行转换。

实现采集和映射的代码


#include <stdio.h>
#include <Kinect.h>
#include <windows.h>
#include <opencv2/opencv.hpp>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <strstream>
using namespace cv;
using namespace std;
void app()
{
    IKinectSensor* m_pKinectSensor;
    IDepthFrameReader* m_pDepthFrameReader;
    IDepthFrameSource* pDepthFrameSource = NULL;
    IColorFrameReader* ColorFrameReader = NULL;
    IColorFrameSource* ColorFrameSource = NULL;
    IFrameDescription* FrameDescription = NULL;
    GetDefaultKinectSensor(&m_pKinectSensor);
    //打开传感器
    m_pKinectSensor->Open();
    m_pKinectSensor->get_DepthFrameSource(&pDepthFrameSource);
    m_pKinectSensor->get_ColorFrameSource(&ColorFrameSource);
    pDepthFrameSource->OpenReader(&m_pDepthFrameReader);
    ColorFrameSource->OpenReader(&ColorFrameReader);

    while (true)
    {
        IDepthFrame* pDepthFrame = NULL;
        IColorFrame* pColorFrame = NULL;
        while (pDepthFrame == NULL) {
            m_pDepthFrameReader->AcquireLatestFrame(&pDepthFrame);
        }
        pDepthFrameSource->get_FrameDescription(&FrameDescription);
        int depth_width, depth_height;
        FrameDescription->get_Width(&depth_width);
        FrameDescription->get_Height(&depth_height);
        Mat DepthImg(depth_height, depth_width, CV_16UC1);
        pDepthFrame->CopyFrameDataToArray(depth_height * depth_width, (UINT16*)DepthImg.data);

        //转换为8位图像
        DepthImg.convertTo(DepthImg, CV_8UC1, 255.0 / 4500);
        //均衡化
        //equalizeHist(DepthImg, DepthImg);
        while (pColorFrame == NULL) {
            ColorFrameReader->AcquireLatestFrame(&pColorFrame);
        }
        pColorFrame->get_FrameDescription(&FrameDescription);
        int CWidth, CHeight;
        FrameDescription->get_Width(&CWidth);
        FrameDescription->get_Height(&CHeight);
        Mat ColorImg(CHeight, CWidth, CV_8UC4);
        pColorFrame->CopyConvertedFrameDataToArray(CWidth * CHeight * 4, (BYTE*)ColorImg.data, ColorImageFormat_Bgra);
        //显示图像
        imshow("depthImg", DepthImg);
        cv::namedWindow("ColorImg",0);
        cv::resizeWindow("ColorImg",CWidth/3 ,CHeight/3);
        imshow("ColorImg", ColorImg);
        //实现匹配并显示
        UINT16* depthData = new UINT16[424 * 512];
        pDepthFrame->CopyFrameDataToArray(424 * 512, depthData);
        ICoordinateMapper* m_pCoordinateMapper;
        m_pKinectSensor->get_CoordinateMapper(&m_pCoordinateMapper);
        ColorSpacePoint* m_pColorCoordinates = new ColorSpacePoint[ 512* 424];
        HRESULT hr = m_pCoordinateMapper->MapDepthFrameToColorSpace(512 * 424, depthData, 512 * 424, m_pColorCoordinates);
        Mat i_depthToRgb(424, 512, CV_8UC4);//高*宽
        if (SUCCEEDED(hr))
        {
            for (int i = 0; i < 512 * 424; i++)
            {
                ColorSpacePoint p = m_pColorCoordinates[i];
                if (p.X != -std::numeric_limits<float>::infinity() && p.Y != -std::numeric_limits<float>::infinity())
                {
                    int colorX = static_cast<int>(p.X + 0.5f);
                    int colorY = static_cast<int>(p.Y + 0.5f);

                    if ((colorX >= 0 && colorX < 1920) && (colorY >= 0 && colorY < 1080))
                    {
                        i_depthToRgb.data[i * 4] = ColorImg.data[(colorY * 1920 + colorX) * 4];
                        i_depthToRgb.data[i * 4 + 1] = ColorImg.data[(colorY * 1920 + colorX) * 4 + 1];
                        i_depthToRgb.data[i * 4 + 2] = ColorImg.data[(colorY * 1920 + colorX) * 4 + 2];
                        i_depthToRgb.data[i * 4 + 3] = ColorImg.data[(colorY * 1920+ colorX) * 4 + 3];
                    }
                }
            }
        }
        imshow("rgb2depth", i_depthToRgb);

        DepthImg.release();
        ColorImg.release();

        if (pDepthFrame)
            pDepthFrame->Release();
        if (pColorFrame)
            pColorFrame->Release();

        if (27 == waitKey(1))
            break;
    }
}

int main()
{
    app();
}

ColorImg.data中像素储存的方式可以认为是一个向量,向量的长度为512 * 424,从而实现索引。代码内容参考了以下博主

https://blog.csdn.net/tengfei461807914/article/details/80615721
https://blog.csdn.net/jiaojialulu/article/details/53088170

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Azure Kinect是一款由微软推出的先进计算机视觉和人机交互设备,它集成了高分辨率RGB相机、深度传感器和麦克风阵列。Azure Kinect的核心技术是通过深度传感器和相机捕捉现实世界的深度和图像信息,以生成点云数据。 点云是由大量三维点组成的数据集,每个点都具有坐标、颜色和其他属性。Azure Kinect通过其深度传感器捕捉物体的几何形状和纹理信息,并通过RGB相机捕捉物体的颜色信息。然后,将这些信息结合起来,生成一个包含三维点的点云。 利用Azure Kinect的点云数据,可以进行各种计算机视觉和图像处理任务。例如,可以利用点云数据进行物体识别、姿态识别、场景重建等。通过分析和处理点云数据,可以提取出对象的形状、表面转移、位置等信息。 Azure Kinect的点云功能广泛应用于虚拟现实、增强现实、人机交互、机器人导航和自动驾驶等领域。在虚拟现实中,可以利用点云数据重建出真实世界的场景,提供更逼真的虚拟体验。在人机交互中,可以通过识别人体姿态、识别手势等,实现更自然、智能的人机交互。在自动驾驶中,可以通过点云数据识别和检测交通障碍物,以实现智能化的导航。 总之,Azure Kinect通过其强大的点云功能,为计算机视觉和图像处理提供了优秀的工具和平台,为各种应用场景提供了更加精确和准确的数据支持。 ### 回答2: Azure Kinect是由微软公司开发的一种深度摄像头,它运用了先进的计算机视觉技术,可以实时捕捉和跟踪人体和环境的动作、姿势和形态。Azure Kinect还提供了点云功能,可以将捕捉到的三维信息转化为点云数据,并通过编程进行处理和分析。 点云是一种用于描述物体表面几何形状的表示方法,它由一系列的点坐标构成。通过Azure Kinect捕捉到的深度图像可以转化为点云数据,从而更详细地描述环境和物体的形状。点云数据可以用于虚拟现实、增强现实、机器人导航、三维重建等领域。 利用Azure Kinect的点云功能,可以进行各种有趣的应用。例如,可以通过点云数据生成高精度的三维模型,从而实现真实感十足的虚拟现实体验。另外,点云数据还可以用于人体姿势识别和动作捕捉,可以应用于体育培训、运动分析等领域。 在机器人导航方面,点云数据可以用于建立环境地图,并进行感知和避障。通过分析点云数据,机器人可以检测到障碍物的位置和形状,从而进行路径规划和避障。此外,通过点云数据还可以实现三维重建,将真实世界复制到虚拟环境中,并进行各种分析和展示。 总而言之,Azure Kinect的点云功能可以将捕捉到的三维信息转化为有用的点云数据,并通过编程进行处理和分析。它为虚拟现实、增强现实、机器人导航、三维重建等领域的应用提供了强大的支持。 ### 回答3: Azure Kinect是由微软开发的一种深度学习感知设备,它集成了深度摄像机和语音识别技术,具有强大的计算能力和高精度的感知能力。它可以通过捕捉实时的三维点云数据来检测和识别物体、人脸、动作等,可应用于多种场景,如虚拟现实、增强现实、人脸识别、人体姿势分析等。 点云是由多个三维点组成的数据集合,每个点包含位置和颜色信息。Azure Kinect可以通过深度摄像机获取场景中的点云数据,然后通过处理算法进行分析和处理。点云数据可以用于创建三维模型、重建实际场景、测量物体形状和尺寸等。 使用Azure Kinect进行点云分析可以帮助我们更好地理解和识别场景中的物体和人体动作。通过对点云数据进行处理和分析,可以实现物体的实时检测、跟踪和识别,进而应用于安防监控、人机交互、机器人导航等领域。 而且,点云数据还可以用于三维重建和建模。通过对点云进行处理和优化,可以生成高精度的三维模型和场景重建结果。这对于虚拟现实、增强现实等应用具有重要的意义,可以提供更真实、沉浸式的用户体验。 综上所述,Azure Kinect和点云分析是一种强大的感知技术和数据处理方法。它们可以应用于多个领域,提供更精确、全面的场景理解和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值