`
小斤陈
  • 浏览: 33427 次
社区版块
存档分类
最新评论

Kinect开发教程八:OpenNI2显示深度、彩色及融合图像

 
阅读更多

      在《Kinect开发教程二:OpenNI读取深度图像与彩色图像并显示》中,小斤介绍了OpenNI读取深度与彩色图像数据的方法,并且借助OpenCV进行显示。

      OpenNI2在接口上与OpenNI有了较大变化,具体更新可以查看《OpenNI Migration Guide》。从获取深度,彩色传感器的数据而言,小斤觉得调用更为直观,但对于Kinect,一大缺憾是不支持OpenNI2提供的深度与彩色图像配准的方法(体现在下文中的device.isImageRegistrationModeSupported()方法)。

      但使用Kinect的童鞋也不必沮丧,在OpenNI2.1 beta中,小斤看到了新增的convertDepthToColorCoordinates()方法可以做一些深度与彩色坐标数据的转化,它的效果应该 是与device.setImageRegistrationMode( IMAGE_REGISTRATION_DEPTH_TO_COLOR )类似的,有兴趣的童鞋可以尝试一下。

      在显示方面,小斤还是使用OpenCV,这次是使用OpenCV的C++接口进行操作。

    /************************* 
    OpenNI2 Deep, Color and Fusion Image 
    Author: Xin Chen, 2013.2 
    Blog: http://blog.csdn.net/chenxin_130 
    *************************/  
      
    #include <stdlib.h>  
    #include <iostream>  
    #include <string>  
    #include "OpenNI.h"  
    #include "opencv2/core/core.hpp"  
    #include "opencv2/highgui/highgui.hpp"  
    #include "opencv2/imgproc/imgproc.hpp"  
    using namespace std;  
    using namespace cv;  
    using namespace openni;  
      
    void CheckOpenNIError( Status result, string status )  
    {   
        if( result != STATUS_OK )   
            cerr << status << " Error: " << OpenNI::getExtendedError() << endl;  
    }  
      
    int main( int argc, char** argv )  
    {  
        Status result = STATUS_OK;    
          
        //OpenNI2 image  
        VideoFrameRef oniDepthImg;  
        VideoFrameRef oniColorImg;  
      
        //OpenCV image  
        cv::Mat cvDepthImg;  
        cv::Mat cvBGRImg;  
        cv::Mat cvFusionImg;  
          
        cv::namedWindow("depth");  
        cv::namedWindow("image");  
        cv::namedWindow("fusion");  
        char key=0;  
      
        //【1】  
        // initialize OpenNI2  
        result = OpenNI::initialize();  
        CheckOpenNIError( result, "initialize context" );    
      
        // open device    
        Device device;  
        result = device.open( openni::ANY_DEVICE );  
      
        //【2】  
        // create depth stream   
        VideoStream oniDepthStream;  
        result = oniDepthStream.create( device, openni::SENSOR_DEPTH );  
      
        //【3】  
        // set depth video mode  
        VideoMode modeDepth;  
        modeDepth.setResolution( 640, 480 );  
        modeDepth.setFps( 30 );  
        modeDepth.setPixelFormat( PIXEL_FORMAT_DEPTH_1_MM );  
        oniDepthStream.setVideoMode(modeDepth);  
        // start depth stream  
        result = oniDepthStream.start();  
       
        // create color stream  
        VideoStream oniColorStream;  
        result = oniColorStream.create( device, openni::SENSOR_COLOR );  
        // set color video mode  
        VideoMode modeColor;  
        modeColor.setResolution( 640, 480 );  
        modeColor.setFps( 30 );  
        modeColor.setPixelFormat( PIXEL_FORMAT_RGB888 );  
        oniColorStream.setVideoMode( modeColor);  
          
    //【4】  
        // set depth and color imge registration mode  
        if( device.isImageRegistrationModeSupported(IMAGE_REGISTRATION_DEPTH_TO_COLOR ) )  
        {  
            device.setImageRegistrationMode( IMAGE_REGISTRATION_DEPTH_TO_COLOR );  
        }  
        // start color stream  
        result = oniColorStream.start();    
      
        while( key!=27 )   
        {    
            // read frame  
            if( oniColorStream.readFrame( &oniColorImg ) == STATUS_OK )  
            {  
                // convert data into OpenCV type  
                cv::Mat cvRGBImg( oniColorImg.getHeight(), oniColorImg.getWidth(), CV_8UC3, (void*)oniColorImg.getData() );  
                cv::cvtColor( cvRGBImg, cvBGRImg, CV_RGB2BGR );  
                cv::imshow( "image", cvBGRImg );  
            }  
        
            if( oniDepthStream.readFrame( &oniDepthImg ) == STATUS_OK )  
            {  
                cv::Mat cvRawImg16U( oniDepthImg.getHeight(), oniDepthImg.getWidth(), CV_16UC1, (void*)oniDepthImg.getData() );  
                cvRawImg16U.convertTo( cvDepthImg, CV_8U, 255.0/(oniDepthStream.getMaxPixelValue()));  
                //【5】  
                // convert depth image GRAY to BGR  
                cv::cvtColor(cvDepthImg,cvFusionImg,CV_GRAY2BGR);  
                cv::imshow( "depth", cvDepthImg );  
            }  
            //【6】  
            cv::addWeighted(cvBGRImg,0.5,cvFusionImg,0.5,0,cvFusionImg);  
            cv::imshow( "fusion", cvFusionImg );  
            key = cv::waitKey(20);  
        }  
      
        //cv destroy  
        cv::destroyWindow("depth");  
        cv::destroyWindow("image");  
        cv::destroyWindow("fusion");  
      
        //OpenNI2 destroy  
        oniDepthStream.destroy();  
        oniColorStream.destroy();  
        device.close();  
        OpenNI::shutdown();  
      
        return 0;  
    }  

 小斤由上到下解释一把:

      【1】使用OpenNI::initialize()方法进行初始化,对于错误处理,可以使用OpenNI::getExtendedError()方法。在这里,Device对象打开任意一个可用设备。

      【2】在OpenNI2中,可以通过创建VideoStream视频流对象来读取设备的深度图像和色彩图像数据。

      【3】对于VideoStream视频流对象,我们可以设备它的Mode,包括分辨率,FPS,像素格式等等。对于像素格式的类型,可以使用 VideoStream的getSensorInfo()方法获得,目前Kinect只有PIXEL_FORMAT_DEPTH_1_MM可供选择。

      【4】如果设备支持深度与彩色图像配准的话,小斤在这里使用OpenNI2自带的接口进行配准。在while循环中,各个VideoStream对象通过readFrame()来读取对应的图像数据。

      【5】将OpenNI的图像数据转换为OpenCV可显示的图像格式。对于彩色图像,可以先将数据塞入OpenCV三通道(8位)RGB对象,再转换到 BGR来显示。对于深度图像,先放入单通道(16位)对象(这是因为深度数据的值域较大),最近将深度值等比例缩小到[0,255]的值域中,作为灰度图 显示。

      【6】最后的图像融合,由于addWeighted()方法需要两个输入图像是同一类型,所以小斤首先将深度灰度图(单通道),转化为BGR图像,这样就 与彩色图像一致了。再通过该方法进行融合,小斤使用的比例是0.5,0.5,也就是融合图像的每个像素点的值,都是(深度图像该点的像素值*0.5)+ (彩色图像该点的像素值*0.5)。

 

----------------------------------

作者:小斤(陈忻)

新浪围脖:@小斤陈

本文属于原创文章,如需转载引用请注明原文作者和链接,谢谢。

分享到:
评论

相关推荐

    OpenNI读取深度图像与彩色图像并显示,OpenCV调用openpose模型对OpenNI彩色图像进行姿态估计

    3. 使用OpenCV的函数显示深度图像和彩色图像。 4. 对彩色图像进行预处理,如调整尺寸以匹配OpenPose模型的输入要求。 5. 使用OpenCV的dnn模块加载OpenPose模型,运行模型并获取关键点坐标。 6. 在原始彩色图像上绘制...

    kinect彩色图像对齐到深度并显示结果

    在本文中,我们将深入探讨如何将Kinect v1.8传感器获取的彩色图像与深度图像进行对齐,并在OpenCV库的帮助下显示它们的结果。这个过程称为彩色-深度配准,对于理解和处理来自Kinect的数据至关重要。 首先,让我们...

    读取并显示Kinect彩色图和深度图的三种方法:代码

    读取并显示kinect彩色和深度信息的三种方式。 1.KinectSDK+MFC 方法是:利用KinectSDK读出彩色图和深度图,利用MFC窗显示 2.KinectSDK+OpenCV 方法是:利用KinectSDK读出彩色图和深度图,利用openCV显示 3.OpenNI和...

    kinect-v2彩色深度配准并修复深度图像并获取三维坐标

    Kinect V2是一款先进的传感器设备,它能够捕获高质量的彩色图像、深度图像以及红外图像。在处理这些数据时,一个常见的任务是进行彩色深度配准,即将深度图像与彩色图像对应起来,以便更好地理解场景的三维结构。在...

    Kinect运用OpenNI产生点云

    OpenNI是一个开源的开发平台,它为自然用户界面(NUI)提供了一种标准化的方式来访问各种设备,如Kinect,以获取深度图像和其他传感器数据。 在描述中提到的链接是一个CSDN博客文章,可能详细解释了如何通过OpenNI...

    OpenNI2 for Window

    3. **数据流管理**:OpenNI2可以同时处理多个数据流,如深度图像、颜色图像和骨骼跟踪数据,方便进行复杂的计算机视觉和运动分析任务。 4. **简单的编程接口**:使用C++和C#的API,开发者可以快速集成OpenNI2到他们...

    kinectV2.0深度图像与彩色图像的坐标映射

    4. **显示结果**:在同一个窗口中,同时显示深度图像和对应的彩色图像,用鼠标选取深度图像的点,实时显示其在彩色图像上的位置以及对应的深度值。 实现这个项目通常会使用编程语言如C++或Python,结合Kinect的官方...

    Unity结合Kinect2体感开发:KinectForWindows_UnityPro

    "Unity结合Kinect2体感开发:KinectForWindows_UnityPro"项目旨在利用这些技术,打造一种全新的交互方式。 首先,我们来看一下Unity3D。它是一款基于C#编程语言的可视化开发工具,支持实时3D渲染,拥有丰富的内置...

    Kinect采集深度和彩色图像并同时保存

    标题"Kinect采集深度和彩色图像并同时保存"涉及的是使用Kinect设备同时获取其深度图像和彩色图像,并进行实时保存的技术。深度图像记录了场景中每个像素点与Kinect传感器的距离信息,而彩色图像则提供了一个RGB色彩...

    基于Kinect的openNI开发包

    1. **openNI框架**:openNI提供了统一的API,使得开发者可以轻松地访问和处理来自Kinect的原始数据,如RGB图像、深度图和骨架信息。 2. **Kinect传感器**:Kinect能捕捉到3D空间中的深度信息,通过算法计算出人体的...

    OPENNI2 Kinect.dll

    总结来说,"OPENNI2 Kinect.dll"是用于处理和对齐Kinect设备的深度图和彩色图像的优化库,它简化了开发者的工作,让他们能更方便地利用Kinect的强大功能。通过学习如何使用这个库,开发者可以创建出具有高级视觉处理...

    Kinect+OpenNI获取深度图和颜色图

    网上有不少使用Qt做界面,OpenNI为库来开发kinect。或许大家的第一个问题就是询问该怎样使用Kinect来获取颜色信息图和深度信息图呢?这一节就是简单来回答这个问题的。 使用OpenNI读取颜色图和深度图的步骤如下(这...

    openNI的kinect开发

    2. **Kinect硬件**:理解kinect的工作原理,包括其红外投影系统和阵列摄像头,如何生成深度图像和彩色图像。 3. **骨骼追踪**:openNI的骨骼追踪功能可以识别和追踪人体20个关节,形成完整的骨骼模型,是姿势识别的...

    openni kinect开发

    2. **数据流处理**:OpenNI支持实时处理来自传感器的数据,包括颜色图像、深度图像以及骨骼跟踪信息。这些数据流可以被用来构建各种应用场景,如虚拟现实、机器人导航、医疗影像分析等。 3. **骨架追踪**:OpenNI能...

    kinectV2获取深度图像和彩色图像

    Kinect V2是一款由微软开发的体感设备,主要用于捕捉人体动作、深度信息以及色彩信息。在编程领域,开发者可以通过SDK来访问这些数据,实现各种有趣的应用,如虚拟现实、体感游戏、人机交互等。本文将详细介绍如何...

    ubuntu openni2

    例如,你可以尝试`NiViewer`,这是一个简单的可视化工具,可以显示来自OpenNI2设备的深度和彩色图像: ```bash sudo apt-get install openni2-tools openni2-launch ``` 如果一切正常,你应该能看到一个显示来自...

    Kinect v2开发教程完整版C++

    • K4W v2 C++ Part 2:使用OpenCV 显示深度影像 • K4W v2 C++ Part 3:读取彩色影像与红外线影像 • K4W v2 C++ Part 4:读取人体位置(Body Index) • K4W v2 C++ Part 5:简单的去背程式 • K4W v2 C++ Part 6...

    Kinect开发Openni,SimpleOpenni

    标题中的“Kinect开发OpenNI,SimpleOpenNI”是指使用OpenNI框架来开发与Microsoft Kinect相关的应用程序。OpenNI(Open Natural Interaction)是一个开源框架,它为开发者提供了与各种传感器交互的接口,包括微软的...

Global site tag (gtag.js) - Google Analytics