capture RGBD data with opencv4.1.1 from XTION2 on windows 10

本文是基于该文进行改进的:https://blog.youkuaiyun.com/laukal/article/details/81154965

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
 
PROJECT(TESTOPENNI)
 
FIND_PACKAGE(OpenCV REQUIRED)

INCLUDE_DIRECTORIES("D:/Program Files/OpenNI2/Include")
LINK_DIRECTORIES("D:/Program Files/OpenNI2/Lib")
 
ADD_EXECUTABLE(TESTOPENNI test.cpp)
 
target_link_libraries(TESTOPENNI
${OpenCV_LIBS}
OpenNI2
)

test.cpp

// YeOpenNI2SimpleUsingOpenCV.cpp : 定义控制台应用程序的入口点。
//
 
#include <iostream>
#include "OpenNI.h"
 
// 载入OpenCV头文件
#include "opencv2/opencv.hpp"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
 
using namespace std;
using namespace openni;
using namespace cv;
 
int main( int argc, char** argv )
{
    // 初始化OpenNI环境
    OpenNI::initialize();
 
    // 声明并打开Device设备,我用的是Kinect。
    Device devAnyDevice;
    devAnyDevice.open(ANY_DEVICE );
 
    // 创建深度数据流
    VideoStream streamDepth;
    streamDepth.create( devAnyDevice, SENSOR_DEPTH );
 
    // 创建彩色图像数据流
    VideoStream streamColor;
    streamColor.create( devAnyDevice, SENSOR_COLOR );
 
    // 设置深度图像视频模式
    VideoMode mModeDepth;
    // 分辨率大小
    mModeDepth.setResolution( 640, 480 );
    // 每秒30帧
    mModeDepth.setFps( 30 );
    // 像素格式
    mModeDepth.setPixelFormat( PIXEL_FORMAT_DEPTH_1_MM );
 
    streamDepth.setVideoMode( mModeDepth);
    
    // 同样的设置彩色图像视频模式
    VideoMode mModeColor;
    mModeColor.setResolution( 640, 480 );
    mModeColor.setFps( 30 );
    mModeColor.setPixelFormat( PIXEL_FORMAT_RGB888 );
 
    streamColor.setVideoMode( mModeColor);
 
    // 图像模式注册
    if( devAnyDevice.isImageRegistrationModeSupported(
        IMAGE_REGISTRATION_DEPTH_TO_COLOR ) )
    {
        devAnyDevice.setImageRegistrationMode( IMAGE_REGISTRATION_DEPTH_TO_COLOR );
    }
        
    // 打开深度和图像数据流
    streamDepth.start();
    streamColor.start();

    // 创建OpenCV图像窗口
    namedWindow( "Depth Image",  cv::WindowFlags::WINDOW_AUTOSIZE);
    namedWindow( "Color Image",  cv::WindowFlags::WINDOW_AUTOSIZE);
 
    // 获得最大深度值
    int iMaxDepth = streamDepth.getMaxPixelValue();
 
    // 循环读取数据流信息并保存在VideoFrameRef中
    VideoFrameRef  frameDepth;
    VideoFrameRef  frameColor;
 
    while( true )
    {
        // 读取数据流
        streamDepth.readFrame( &frameDepth );
        streamColor.readFrame( &frameColor );
 
        
        // 将深度数据转换成OpenCV格式
        const cv::Mat mImageDepth( frameDepth.getHeight(), frameDepth.getWidth(), CV_16UC1, (void*)frameDepth.getData());
        std::cout<<"depth height"<<frameDepth.getHeight()<<" width "<<frameDepth.getWidth()<<std::endl;
        // 为了让深度图像显示的更加明显一些,将CV_16UC1 ==> CV_8U格式
        cv::Mat mScaledDepth;
        mImageDepth.convertTo( mScaledDepth, CV_8U, 255.0 / iMaxDepth );
        // 显示出深度图像
        cv::imshow( "Depth Image", mScaledDepth );
 
        // 同样的将彩色图像数据转化成OpenCV格式
        const cv::Mat mImageRGB(frameColor.getHeight(), frameColor.getWidth(), CV_8UC3, (void*)frameColor.getData());
        // 首先将RGB格式转换为BGR格式
        std::cout<<" color height "<<frameColor.getHeight()<<" width "<<frameColor.getWidth()<<std::endl;
        cv::Mat cImageBGR;
        cv::cvtColor( mImageRGB, cImageBGR, cv::COLOR_RGB2BGR);
        // 然后显示彩色图像
        cv::imshow( "Color Image", cImageBGR );
		cv::waitKey(30);
      } 
    // 关闭数据流
    streamDepth.destroy();
    streamColor.destroy();
 
    // 关闭设备
    devAnyDevice.close();
 
    // 最后关闭OpenNI
    openni::OpenNI::shutdown();
 
    return 0;
}

注意生成exe后,把相关的dll文件放在同一目录下
在这里插入图片描述

其中OpenNI2文件夹长这样
在这里插入图片描述

OpenNI2可以从华硕的官网下载:https://www.asus.com/3D-Sensor/Xtion-2/HelpDesk_Download/

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值