kinect/codes/AzureKinectForUE/Source/AzureKinect/Public/AzureKinectDevice.h

149 lines
3.9 KiB
C
Raw Normal View History

2024-03-06 15:31:40 +00:00
#pragma once
#include "CoreMinimal.h"
#include "Engine/TextureRenderTarget2D.h"
#include "Animation/SkeletalMeshActor.h"
#include "k4a/k4a.hpp"
#include "k4abt.hpp"
#include "AzureKinectEnum.h"
#include "AzureKinectDeviceThread.h"
#include "AzureKinectDevice.generated.h"
USTRUCT(BlueprintType)
struct FAzureKinectSkeleton
{
GENERATED_BODY()
UPROPERTY(BlueprintReadWrite)
int32 ID;
UPROPERTY(BlueprintReadWrite)
TArray<FTransform> Joints;
};
DECLARE_LOG_CATEGORY_EXTERN(AzureKinectDeviceLog, Log, All);
UCLASS(BlueprintType, hidecategories=(Object))
class AZUREKINECT_API UAzureKinectDevice : public UObject
{
GENERATED_BODY()
public:
UAzureKinectDevice();
UAzureKinectDevice(const FObjectInitializer& ObjectInitializer);
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "IO")
UTextureRenderTarget2D* DepthTexture;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "IO")
UTextureRenderTarget2D* ColorTexture;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "IO")
UTextureRenderTarget2D* InflaredTexture;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "IO")
UTextureRenderTarget2D* BodyIndexTexture;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Config")
EKinectDepthMode DepthMode;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Config")
EKinectColorResolution ColorMode;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Config")
EKinectRemap RemapMode;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Config")
EKinectFps Fps;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Config")
EKinectSensorOrientation SensorOrientation = EKinectSensorOrientation::DEFAULT;
UPROPERTY(BlueprintReadWrite, Category = "Config")
int32 DeviceIndex;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Config")
bool bSkeletonTracking;
UFUNCTION(BlueprintCallable, Category = "IO")
static int32 GetNumConnectedDevices();
UFUNCTION(BlueprintCallable, Category = "IO")
void LoadDevices();
/**
* Call "open" and "start_camara" to Native Kinect Device
* and return result. Then start a thread for Kinect's data feed.
* Device Index should be specified in advance;
*/
UFUNCTION(BlueprintCallable, Category = "IO")
bool StartDevice();
/**
* Call "stop_camara" and "close" to Native Kinect Device,
* and release all instaces about Native Kinect.
*/
UFUNCTION(BlueprintCallable, Category = "IO")
bool StopDevice();
/**
* Check if Kinect Device is open.
*/
UFUNCTION(BlueprintCallable, Category = "IO")
bool IsOpen() const { return bOpen; }
/**
* Return a number of Skeletons currently aquired and stored.
*/
UFUNCTION(BlueprintCallable, Category = "Skeletons")
int32 GetNumTrackedSkeletons() const;
/**
* Return an array of Skeletons currently aquired and stored.
*/
UFUNCTION(BlueprintCallable, Category = "Skeletons")
const TArray<FAzureKinectSkeleton>& GetSkeletons() const;
/**
* Return a Skeleton struct by Index (not Skeleton ID).
* If given Index is out of range, return a null struct.
*/
UFUNCTION(BlueprintCallable, Category = "Skeletons")
FAzureKinectSkeleton GetSkeleton(int32 Index) const;
/**
* Update and process raw feed from Kinect Device asynchronously.
* Should be called out of main thread.
*/
void UpdateAsync();
TArray<TSharedPtr<FString>> DeviceList;
private:
bool bOpen;
void CaptureColorImage();
void CaptureDepthImage();
void CaptureInflaredImage();
void CaptureBodyIndexImage(const k4abt::frame& BodyFrame);
static FTransform JointToTransform(const k4abt_joint_t& Joint, int32 Index);
void UpdateSkeletons();
void CalcFrameCount();
k4a::device NativeDevice;
k4a::capture Capture;
std::chrono::milliseconds FrameTime;
k4a::image RemapImage;
k4a::calibration KinectCalibration;
k4a::transformation KinectTransformation;
k4abt::tracker BodyTracker;
FAzureKinectDeviceThread* Thread;
int32 NumTrackedSkeletons;
TArray<FAzureKinectSkeleton> Skeletons;
};