用c或c++通过kinect直接把深度图像保存到电脑里,求具体的方法和代码。

发布网友 发布时间:2022-04-24 08:57

我来回答

2个回答

热心网友 时间:2023-10-09 05:40

#include <iostream>
#include <sstream>

// NuiApi.hの前にWindows.hをインクルードする
#include <Windows.h>
#include <NuiApi.h>

#include <opencv2/opencv.hpp>
//error処理
#define ERROR_CHECK( ret ) \
if ( ret != S_OK ) { \
std::stringstream ss;\
ss << "failed " #ret " " << std::hex << ret << std::endl;\
throw std::runtime_error( ss.str().c_str() );\
}
const NUI_IMAGE_RESOLUTION CAMERA_RESOLUTION = NUI_IMAGE_RESOLUTION_0x480;//解像度の宣言
class KinectSample//
{
private:
INuiSensor* kinect;//kinectを操作するためのインタフェース(接口)
HANDLE imageStreamHandle;//?
DWORD width;//Double Word(4*8=32) 幅
DWORD height;//高さ

public:
KinectSample()
{
}
~KinectSample()
{
// 终了処理
if ( kinect != 0 ) {
kinect->NuiShutdown();//闭める
kinect->Release();//
}

}
void initialize()//初期化
{
createInstance();
// Kinectの设定を初期化する
ERROR_CHECK( kinect->NuiInitialize( NUI_INITIALIZE_FLAG_USES_COLOR ) );//rgbカメラのみ使用するためNUI_INITIALIZE_FLAG_USES_COLORのみ指定する、RGBカメラの动作を开始する
// RGBカメラを初期化する
ERROR_CHECK( kinect->NuiImageStreamOpen( NUI_IMAGE_TYPE_COLOR,
CAMERA_RESOLUTION, 0, 2, 0, &imageStreamHandle ) );//RGBカメラのストリーム(Stream)を开始する、NuiImageStreamOpen()関数を呼び出す   ???
// 指定した解像度の、画面サイズを取得する
::NuiImageResolutionToSize(CAMERA_RESOLUTION, width, height );

}
void run()
{
cv::Mat image;
//Main loop
while ( 1 ) {
drawRgbImage( image );

// 画像を表示する
cv::imshow( "Kinect Sample", image );

// 终了のためのキー入力チェック兼、表示のためのウェイト
int key = cv::waitKey( 10 );
if ( key == 'q' ) {
break;
}
}

}

private:

void createInstance()
{
// 接続されているKinectの数を取得する
int count = 0;
ERROR_CHECK( ::NuiGetSensorCount( &count ) );//台数
if ( count == 0 ) {
throw std::runtime_error( "Kinect を接続してください" );
}

// 最初のKinectのインスタンスを作成する
ERROR_CHECK( ::NuiCreateSensorByIndex( 0, &kinect ) );

// Kinectの状态を取得する
HRESULT status = kinect->NuiStatus();
if ( status != S_OK ) {
throw std::runtime_error( "Kinect が利用可能ではありません" );
}
}
void drawRgbImage( cv::Mat& image )
{
// RGBカメラのフレームデータを取得する
NUI_IMAGE_FRAME imageFrame = { 0 };
ERROR_CHECK( kinect->NuiImageStreamGetNextFrame( imageStreamHandle, INFINITE, &imageFrame ) );
// 画像データを取得する
NUI_LOCKED_RECT colorData;
imageFrame.pFrameTexture->LockRect( 0, &colorData, 0, 0 );
// 画像データをコピーする
image = cv::Mat( height, width, CV_8UC4, colorData.pBits );
// フレームデータをする
ERROR_CHECK( kinect->NuiImageStreamReleaseFrame( imageStreamHandle, &imageFrame ) );

}

};

void main()
{

try {
KinectSample kinect;
kinect.initialize();
kinect.run();

}
catch ( std::exception& ex ) {
std::cout << ex.what() << std::endl;

}
}

热心网友 时间:2023-10-09 05:40

depth map can be stored in a 0 * 480 2d array
simply write that array to a text file

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com