发布网友 发布时间: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