c++ - Kinect SDK 2.0 处理和获取深度帧

标签 c++ kinect handle

我实际上正在使用 Kinect V2(用于 Xbox One 的那个)并且我正在尝试获得深度流。我想看看Kinect的深度传感器看到了什么。但是我没有成功打开一个流。我只成功地用另一段代码打开了一个框架,但没有打开视频。通过一些研究,我尝试使用句柄,但我编写的代码不会在屏幕上打印代码末尾的“stream”行。我正在使用 VS2012,代码是 C++。

我想我有这个是因为我不知道如何正确使用句柄...如果有人可以帮助我并向我解释什么是句柄而不是指向某物的指针,那就太好了。谢谢

这是我的代码:

HRESULT hr=S_OK; WAITABLE_HANDLE *stream=nullptr; IKinectSensor* kinectSensor=nullptr;

if( SUCCEEDED(hr) )
{
    std::cout << "Success IKinectSensor::GetDefaultSensor" << std::endl;
}

else
{
    std::cout << "Failed IKinectSensor::GetDefaultSensor" << std::endl;
}

std::cout << "Opening sensors" << std::endl;
if(kinectSensor != NULL)
{
    hr = kinectSensor->Open();

    Sleep(sleeptime*5);
    if( SUCCEEDED( hr ) )
    {
        std::cout << "Success IKinectSensor::Open" << std::endl;
    }

    else
    {
        std::cout << "Failed IKinectSensor::Open" << std::endl;
    }
}

hr = kinectSensor->OpenMultiSourceFrameReader(FrameSourceTypes_Depth | FrameSourceTypes_Color , &multiSourceReader);
if( SUCCEEDED(hr) )
{
    std::cout << "reader open" << std::endl;

    hr = multiSourceReader->SubscribeMultiSourceFrameArrived(stream);
    if( SUCCEEDED(hr) )
    {
        std::cout << "stream" << std::endl;
    }
} 

最佳答案

我没有使用 handle 。请参阅下面的代码片段,了解从多源帧阅读器获取深度帧并使用 OpenCV 显示它。

#include <Kinect.h>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

// helper function
template <class Interface> inline void safe_release(Interface **ppT)
{
    if (*ppT)
    {
        (*ppT)->Release();
        *ppT = NULL;
    }
}

bool setup_kinect_sensor_and_acquire_frame()
{
    IKinectSensor* kinect_sensor

    // initialize kinect sensor
    HRESULT hr = GetDefaultKinectSensor(&kinect_sensor);
    if (FAILED(hr) || !kinect_sensor)
    {
        safe_release(&p_multisource_frame);
        return false;
    }

    kinect_sensor->Open();
    if (FAILED(hr))
    {
        return false;
    }

    // initialize kinect multisource frame reader
    IMultiSourceFrameReader* kinect_multisource_reader;
    hr = kinect_sensor->OpenMultiSourceFrameReader(FrameSourceTypes_Depth, &kinect_multisource_reader;);
    if (FAILED(hr))
    {
        safe_release(&kinect_multisource_reader);
        return false;
    }

    // acquire multisource frame
    IMultiSourceFrame* p_multisource_frame = NULL;
    HRESULT hr = kinect_multisource_reader->AcquireLatestFrame(&p_multisource_frame);
    if (FAILED(hr))
    {
        safe_release(&p_multisource_frame);
        return false;
    }

    // get depth frame
    IDepthFrameReference* p_depth_frame_ref = NULL;
    hr = p_multisource_frame->get_DepthFrameReference(&p_depth_frame_ref);
    if (FAILED(hr))
    {
        safe_release(&p_depth_frame_ref);
        return false;
    }

    IDepthFrame* p_depth_frame = NULL;
    IFrameDescription* p_frame_description = NULL;
    int width = 0;
    int height = 0;
    unsigned short depth_min_distance = 0;
    unsigned short depth_max_distance = 0;
    unsigned short* p_depth_buffer = NULL;

    hr = p_depth_frame_ref->AcquireFrame(&p_depth_frame);
    if (SUCCEEDED(hr))
    {
        hr = p_depth_frame->get_FrameDescription(&p_frame_description);
    }
    if (SUCCEEDED(hr))
    {
        hr = p_frame_description->get_Width(&width);
    }
    if (SUCCEEDED(hr))
    {
        hr = p_frame_description->get_Height(&height);
    }
    if (width != 512 || height != 424)
    {
        safe_release(&p_depth_frame);
        safe_release(&p_frame_description);
        return false;
    }

    // process depth frame
    if (SUCCEEDED(hr))
    {
        hr = p_depth_frame->get_DepthMinReliableDistance(&depth_min_distance);
    }
    if (SUCCEEDED(hr))
    {
        hr = p_depth_frame->get_DepthMaxReliableDistance(&depth_max_distance);
    }
    if (SUCCEEDED(hr))
    {   
        int size = 512 * 424;
        p_depth_buffer = new unsigned short[size];
        hr = p_depth_frame->CopyFrameDataToArray(size, p_depth_buffer);
        if (SUCCEEDED(hr))
        {
            cv::Mat depth_map(cv::Size(DEPTH_WIDTH, DEPTH_HEIGHT), CV_16UC1, p_depth_buffer);
            double scale = 255.0 / (depth_max_distance - depth_min_distance);
            depth_map.convertTo(depth_frame, CV_8UC1, scale);
            cv::imshow("depth", depth_map);
        }
    }

    // Clean up depth frame
    safe_release(&p_depth_frame_ref);
    safe_release(&p_depth_frame);
    safe_release(&p_frame_description);
    if (p_depth_buffer != NULL) {
        delete[] p_depth_buffer;
        p_depth_buffer = NULL;
    }
    if (FAILED(hr))
    {
        return false;
    }
    else
    {
        return true;
    }
}

关于c++ - Kinect SDK 2.0 处理和获取深度帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31296485/

相关文章:

c++ - 将 const std::shared_ptr<const T> 转换为 boost::shared_ptr<T>

c++ - 我正在制作一个问答游戏,但我无法让第二个问题正常工作

c++ - std::array 的这个 union 的公共(public)初始序列有问题吗?

visual-studio-2012 - 尝试在 Visual Studio C# 中使用 Microsoft.Kinect 命名空间

opencv - 嘈杂的Kinect彩色(RGB)图像

matlab - 在MATLAB中使用连续 slider 的值

matlab - 为迭代函数组合定义泛型函数

c++ - OpenGL 上的多个视口(viewport)

c++ - WinAPI:OpenProcess() 返回错误 5,并为主机进程启用了 SeDebugPrivilege

visual-studio-2010 - 构建时被另一个进程锁定的输出文件