win10如何保存通过libreenect2传输的深度图像数据?

我在安装并运行了libfreenect2控制了两台kinect v2设备后,从相机向电脑传输了RGB图和深度图,请问是否有方法可以将这些图像数据保存在本地?
我的设备是win10,软件是VS2017。
如果有,是否有比较详细的教程,对编程理解较浅,感激不尽。

如果是单张图像,可以使用opencv的 imwrite 函数,如果保存连续的图像序列,可以使用opencv的 VideoWriter 类

OpenCV中保存不同深度图像的技巧
可以参考下

libfreenect2的回调函数中,将RGB图和深度图数据保存到指定的文件中。


#include <fstream>  
#include <libfreenect2/libfreenect2.hpp>  
  
// 创建用于保存图像数据的目录  
const std::string save_dir = "path/to/save/directory";  
  
// libfreenect2的回调函数  
void callback(const libfreenect2::Frame* frame, const libfreenect2::Frame* depth) {  
    // 获取RGB图和深度图的数据  
    const uint8_t* rgb_data = frame->data(0);  
    const uint16_t* depth_data = depth->data();  
      
    // 创建文件名并指定保存路径  
    std::string rgb_file = save_dir + "/rgb.bin";  
    std::string depth_file = save_dir + "/depth.bin";  
      
    // 打开文件并保存数据  
    std::ofstream out_rgb(rgb_file, std::ios::out | std::ios::binary);  
    std::ofstream out_depth(depth_file, std::ios::out | std::ios::binary);  
      
    if (out_rgb && out_depth) {  
        // 保存RGB图数据  
        out_rgb.write(reinterpret_cast<const char*>(rgb_data), frame->width * frame->height * 3);  
          
        // 保存深度图数据  
        out_depth.write(reinterpret_cast<const char*>(depth_data), depth->width * depth->height * sizeof(uint16_t));  
    }  
      
    // 关闭文件  
    out_rgb.close();  
    out_depth.close();  
} 

#include <libreenect2/sync/depth_processor.h>  
#include <opencv2/opencv.hpp>  
  
int main()  
{  
    // 初始化libreenect2  
    reenect2::InitResult initResult = reenect2::Reenect2::Instance().Init();  
    if (!initResult.isSuccess())  
    {  
        std::cerr << "未能初始化libreenect2." << std::endl;  
        return -1;  
    }  
  
    // 获取深度处理器  
    auto depthProcessor = reenect2::Sync::DepthProcessor::Instance();  
  
    // 设置深度相机参数  
    depthProcessor->SetDeviceIndex(0);  
    depthProcessor->SetDepthFormat(reenect2::DepthFormat:: ARG_11BIT_UNCOMPRESSED);  
  
    // 获取深度图像数据  
    auto depthMap = depthProcessor->GetDepthMap();  
  
    // 转换为OpenCV格式  
    cv::Mat depthImage(depthMap->height, depthMap->width, CV_16UC1, (void*)depthMap->data);  
  
    // 保存深度图像  
    cv::imwrite("depth_image.png", depthImage);  
  
    // 释放资源  
    reenect2::Reenect2::Instance().Shutdown();  
  
    return 0;  
}

可以使用OpenCV库来保存

参考如下:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <libfreenect2/libfreenect2.hpp>
#include <libfreenect2/frame_listener_impl.h>

int main()
{
    // 初始化libfreenect2
    libfreenect2::Freenect2 freenect2;
    libfreenect2::Freenect2Device* device = nullptr;
    libfreenect2::PacketPipeline* pipeline = nullptr;

    if (freenect2.enumerateDevices() == 0)
    {
        std::cout << "No Kinect v2 devices found!" << std::endl;
        return -1;
    }

    // 打开设备
    std::string serial = freenect2.getDefaultDeviceSerialNumber();
    device = freenect2.openDevice(serial, pipeline);

    if (device == nullptr)
    {
        std::cout << "Failed to open Kinect v2 device!" << std::endl;
        return -1;
    }

    // 创建RGB和深度帧监听器
    libfreenect2::SyncMultiFrameListener listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth);
    
    // 启动监听器
    device->setColorFrameListener(&listener);
    device->setIrAndDepthFrameListener(&listener);

    // 开始接收帧数据
    device->start();

    // 创建OpenCV窗口用于显示图像(可选)
    cv::namedWindow("RGB Image", cv::WINDOW_NORMAL);
    cv::namedWindow("Depth Image", cv::WINDOW_NORMAL);

    // 循环读取帧数据并保存图像
    while (true)
    {
        libfreenect2::FrameMap frames;
        listener.waitForNewFrame(frames);

        libfreenect2::Frame* rgb_frame = frames[libfreenect2::Frame::Color];
        libfreenect2::Frame* depth_frame = frames[libfreenect2::Frame::Depth];

        cv:Mat rgb_image(rgb_frame->height, rgb_frame->width, CV_8UC4, rgb_frame->data);
        cv:Mat depth_image(depth_frame->height, depth_frame->width, CV_32FC1, depth_frame->data);

        cv:imwrite("rgb_image.png", rgb_image);  // 保存RGB图像为png格式文件
        cv:imwrite("depth_image.png", depth_image);  // 保存深度图像为png格式文件

        listener.release(frames);

        cv:imshow("RGB Image", rgb_image);  // 显示RGB图像(可选)
        cv:imshow("Depth Image", depth_image);  // 显示深度图像(可选)

        if (cv:waitKey(1) == 'q') break;  // 按下'q'键退出循环
    }

    device->stop();
    device->close();

    return 0;
}

采用chatgpt:
在Windows 10上使用libfreenect2保存通过Kinect v2传输的RGB图像和深度图像数据,你可以使用OpenCV库来完成。下面是一个简单的示例代码,展示了如何保存RGB图像和深度图像数据到本地文件。

首先,确保你已经安装了libfreenect2和OpenCV,并在Visual Studio 2017项目中配置了正确的包含目录和库文件。

#include <iostream>
#include <fstream>
#include <opencv2/opencv.hpp>
#include <libfreenect2/libfreenect2.hpp>
#include <libfreenect2/frame_listener_impl.h>
#include <libfreenect2/registration.h>

int main()
{
    // 创建libfreenect2实例
    libfreenect2::Freenect2 freenect2;
    libfreenect2::Freenect2Device* device = nullptr;

    // 检查是否有可用的Kinect v2设备
    if (freenect2.enumerateDevices() == 0)
    {
        std::cerr << "No Kinect v2 devices found!" << std::endl;
        return -1;
    }

    // 打开第一个Kinect v2设备
    std::string serial = freenect2.getDefaultDeviceSerialNumber();
    device = freenect2.openDevice(serial);
    if (device == nullptr)
    {
        std::cerr << "Failed to open Kinect v2 device!" << std::endl;
        return -1;
    }

    // 配置深度图和RGB图像的监听器
    libfreenect2::SyncMultiFrameListener listener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth);
    device->setColorFrameListener(&listener);
    device->setIrAndDepthFrameListener(&listener);

    // 开始采集数据
    device->start();

    // 创建OpenCV窗口
    cv::namedWindow("RGB Image");
    cv::namedWindow("Depth Image");

    // 循环读取和保存图像数据,按Esc键退出
    while (true)
    {
        // 获取最新的帧数据
        libfreenect2::FrameMap frames;
        listener.waitForNewFrame(frames);
        libfreenect2::Frame* colorFrame = frames[libfreenect2::Frame::Color];
        libfreenect2::Frame* depthFrame = frames[libfreenect2::Frame::Depth];

        // 将帧数据转换为OpenCV格式
        cv::Mat rgbImage(colorFrame->height, colorFrame->width, CV_8UC4, colorFrame->data);
        cv::Mat depthImage(depthFrame->height, depthFrame->width, CV_32FC1, depthFrame->data);

        // 显示RGB图像和深度图像
        cv::imshow("RGB Image", rgbImage);
        cv::imshow("Depth Image", depthImage);

        // 保存RGB图像和深度图像到本地文件
        cv::imwrite("rgb_image.png", rgbImage);
        cv::imwrite("depth_image.png", depthImage);

        // 释放帧数据
        listener.release(frames);

        // 检测按键,如果按下Esc键则退出循环
        char key = cv::waitKey(1);
        if (key == 27)
            break;
    }

    // 停止采集数据,关闭设备
    device->stop();
    device->close();

    return 0;
}

这段代码使用libfreenect2库打开第一个可用的Kinect v2设备,并配置了RGB图像和深度图像的监听器。然后,它进入一个循环,在每次循环中获取最新的帧数据,将其转换为OpenCV格式并显示在窗口中。同时,它还将RGB图像和深度图像保存到名为"rgb_image.png"和"depth_image.png"的本地文件中。按下Esc键将退出循环。

请确保将代码中的OpenCV和libfreenect2的头文件和库文件正确配置到你的Visual Studio 2017项目中,并根据需要进行修改和扩展。

TechWhizKid参考GPT回答:

  • 首先安装libfreenect2并将其集成到你的VS2017环境中。同时也要安装OpenCV库。
  • 以下是一个简单的示例程序,它会显示深度图像,并将深度图像保存为图片文件。这个程序是基于libfreenect2的示例程序Protonect修改的。

  • 要替换其中的"<文件路径>"为你希望保存图像的实际路径。

#include <iostream>
#include <opencv2/opencv.hpp>
#include <libfreenect2/libfreenect2.hpp>
#include <libfreenect2/frame_listener_impl.h>
#include <libfreenect2/registration.h>
#include <libfreenect2/packet_pipeline.h>
#include <libfreenect2/logger.h>

using namespace std;
using namespace cv;

int main() {
    libfreenect2::Freenect2 freenect2;
    libfreenect2::Freenect2Device *dev = 0;
    libfreenect2::PacketPipeline *pipeline = 0;

    pipeline = new libfreenect2::OpenGLPacketPipeline();
    dev = freenect2.openDefaultDevice(pipeline);

    if (dev == 0) {
        cout << "failure opening device!" << endl;
        return -1;
    }

    libfreenect2::SyncMultiFrameListener listener(libfreenect2::Frame::Depth);
    libfreenect2::FrameMap frames;

    dev->setColorFrameListener(&listener);
    dev->setIrAndDepthFrameListener(&listener);
    dev->start();

    while (true) {
        listener.waitForNewFrame(frames);
        libfreenect2::Frame *depth = frames[libfreenect2::Frame::Depth];

        Mat depthMat = Mat(depth->height, depth->width, CV_32FC1, depth->data) / 4500.0f;

        imshow("Depth", depthMat);

        // 保存深度图像
        imwrite("<文件路径>/depth.png", depthMat * 255);

        int key = waitKey(1);
        if (key == 'q') break;

        listener.release(frames);
    }

    dev->stop();
    dev->close();

    return 0;
}
  • 这个程序将深度图像保存为PNG格式的图片,你可以更改文件路径和格式以满足你的需求。

  • 这个程序将原始的深度数据除以4500,这样深度图像的亮度会比较合适,你也可以根据你的需要调整这个值。在保存图片之前,程序将深度图像的数据乘以255,因为imwrite函数需要8位的数据。如果你希望保存原始的深度数据,你可以将数据保存为CSV或者二进制文件。

可以使用OpenCV库来保存从Kinect设备获取的RGB图像和深度图像数据。以下是一种保存图像数据的示例代码:

1.首先,确保已经安装了OpenCV库。可以在VS2017的项目中添加OpenCV库并进行配置。

2.在自己的代码中,包括OpenCV库的头文件。

#include <opencv2/opencv.hpp>

3.初始化OpenCV并创建一个Mat对象来保存RGB图像和深度图像数据。

cv::Mat rgbImage;     // 用于保存RGB图像数据
cv::Mat depthImage;   // 用于保存深度图像数据

4.在从Kinect设备获取到图像数据后,将数据保存到Mat对象中。

// 从摄像头获取到rgbData和depthData

// 将rgbData数据复制到rgbImage中
rgbImage = cv::Mat(cv::Size(width, height), CV_8UC3, rgbData);

// 将depthData数据复制到depthImage中
depthImage = cv::Mat(cv::Size(width, height), CV_32FC1, depthData);

5.使用OpenCV的imwrite函数将Mat对象保存为图像文件。您可以在本地指定保存的路径和图像命名。

cv::imwrite("path/to/save/rgbImage.jpg", rgbImage);       // 保存RGB图像为jpg文件
cv::imwrite("path/to/save/depthImage.png", depthImage);   // 保存深度图像为png文件

这样,就可以将从Kinect设备获取的RGB图像和深度图像数据保存在本地。请替换示例代码中的路径和文件名为自己想要保存的路径和文件名。