diff --git a/SpaceStudioClient/Content/Blueprints/UI/M_KinentBodys.uasset b/SpaceStudioClient/Content/Blueprints/UI/M_KinentBodys.uasset index 3b737f0..bd06038 100644 --- a/SpaceStudioClient/Content/Blueprints/UI/M_KinentBodys.uasset +++ b/SpaceStudioClient/Content/Blueprints/UI/M_KinentBodys.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a828bacc8a754e9865143d5823ebb0c4f77dc62373805325acfae7e9e9771abd -size 11442 +oid sha256:f8909626f21b120afe8868fb147dcd463af600916bfe016d8ea21634a4b789f4 +size 11410 diff --git a/SpaceStudioClient/Content/Blueprints/UI/WB_Wall_A.uasset b/SpaceStudioClient/Content/Blueprints/UI/WB_Wall_A.uasset index 32cc23b..d87287e 100644 --- a/SpaceStudioClient/Content/Blueprints/UI/WB_Wall_A.uasset +++ b/SpaceStudioClient/Content/Blueprints/UI/WB_Wall_A.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:80654cf84fdde5ec7aaac9e61b46e8b0a0395168e52af3888949d5856c573272 -size 184808 +oid sha256:d418a2e73a02e1574989b6925469099947601f2cf00b2315f09e2ae7755bbe79 +size 185362 diff --git a/SpaceStudioClient/Plugins/NeoKinectUnreal/Source/NeoKinectUnreal/NeoKinectUnreal.Build.cs b/SpaceStudioClient/Plugins/NeoKinectUnreal/Source/NeoKinectUnreal/NeoKinectUnreal.Build.cs index a0fef70..6c8860c 100644 --- a/SpaceStudioClient/Plugins/NeoKinectUnreal/Source/NeoKinectUnreal/NeoKinectUnreal.Build.cs +++ b/SpaceStudioClient/Plugins/NeoKinectUnreal/Source/NeoKinectUnreal/NeoKinectUnreal.Build.cs @@ -19,6 +19,8 @@ public class NeoKinectUnreal : ModuleRules { "Core", "CoreUObject", + "OpenCV", + "OpenCVHelper" // ... add other public dependencies that you statically link with here ... }); @@ -34,13 +36,14 @@ public class NeoKinectUnreal : ModuleRules string neoKinectPath = Path.Combine(thirdPartyPath, "NeoKinect"); string kinectPath = Path.Combine(thirdPartyPath, "Kinect"); + //string openCVPath = Path.Combine(thirdPartyPath, "OpenCV"); - PublicSystemLibraryPaths.Add(Path.Combine(neoKinectPath, "Lib")); + PublicSystemLibraryPaths.Add(Path.Combine(neoKinectPath, "Lib")); PublicIncludePaths.Add(Path.Combine(neoKinectPath, "Inc")); PublicSystemLibraryPaths.Add(Path.Combine(kinectPath, "Lib")); PublicIncludePaths.Add(Path.Combine(kinectPath, "Inc")); - const string FaceLibraryName = "Kinect20.Face"; + const string FaceLibraryName = "Kinect20.Face"; // Add static libraries PublicSystemLibraries.AddRange(new[] @@ -48,14 +51,14 @@ public class NeoKinectUnreal : ModuleRules "NeoKinect.lib", "Kinect20.lib", FaceLibraryName + ".lib" - }); + }); // Add dynamic libraries const string KinectFaceDllName = FaceLibraryName + ".dll"; PublicDelayLoadDLLs.AddRange(new[] { KinectFaceDllName - }); + }); // Define library name for code to be able to check for its presence PrivateDefinitions.Add("KINECT_FACE_DLL_NAME=\"" + KinectFaceDllName + "\""); @@ -64,5 +67,6 @@ public class NeoKinectUnreal : ModuleRules const string ProjectDLLDir = "$(ProjectDir)/Binaries/Win64"; RuntimeDependencies.Add(Path.Combine(ProjectDLLDir, KinectFaceDllName)); RuntimeDependencies.Add(Path.Combine(ProjectDLLDir, "NuiDatabase/..."), StagedFileType.NonUFS); - } + + } } diff --git a/SpaceStudioClient/Plugins/NeoKinectUnreal/Source/NeoKinectUnreal/Private/NeoKinectManager.cpp b/SpaceStudioClient/Plugins/NeoKinectUnreal/Source/NeoKinectUnreal/Private/NeoKinectManager.cpp index adc1ee3..d69a056 100644 --- a/SpaceStudioClient/Plugins/NeoKinectUnreal/Source/NeoKinectUnreal/Private/NeoKinectManager.cpp +++ b/SpaceStudioClient/Plugins/NeoKinectUnreal/Source/NeoKinectUnreal/Private/NeoKinectManager.cpp @@ -12,7 +12,9 @@ #include "Engine/TextureRenderTarget2D.h" #include "HAL/PlatformProcess.h" #include "UObject/Package.h" - +#include "PreOpenCVHeaders.h" +#include "opencv2/opencv.hpp" +#include "PostOpenCVHeaders.h" using namespace NeoKinect; //~ STRUCTS METHODS @@ -74,7 +76,6 @@ FFrameTextureData UNeoKinectManager::FramesData[static_cast(EKinectFrame: UNeoKinectManager* UNeoKinectManager::EventsDispatcher = nullptr; FTSTicker::FDelegateHandle UNeoKinectManager::TickerHandle; - #pragma endregion Statics //~ INITIALIZATION / UNINITIALIZATION @@ -238,6 +239,7 @@ void UNeoKinectManager::InitStatics() fd.UFrameType = static_cast(i); fd.BufferSize = fd.Width * fd.Height * fd.PixelSize; } + } #pragma endregion Initialization_Uninitialization @@ -1140,13 +1142,50 @@ void UNeoKinectManager::UpdateFrames() { ThreadBuffer.Lock(); { - RHIUpdateTexture2D( - FrameData.Texture->GetRenderTargetResource()->GetRenderTargetTexture(), - 0, - FUpdateTextureRegion2D(0, 0, 0, 0, FrameData.Width, FrameData.Height), - FrameData.Width * FrameData.PixelSize, - Buffer + if (FrameData.KFrameType == KinectFrameType::BodyIndex) + { + cv::Mat binaryImage(FrameData.Height, FrameData.Width, CV_8UC4); + memcpy(binaryImage.data, Buffer, FrameData.Height * FrameData.Width * FrameData.PixelSize); + cv::Mat processedImage; + cv::resize(binaryImage, processedImage, cv::Size(FrameData.Width / 2, FrameData.Height / 2), 0, 0, cv::INTER_CUBIC); + cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5, 5)); + cv::morphologyEx(processedImage, processedImage, cv::MORPH_OPEN, kernel); // 去噪 + cv::morphologyEx(processedImage, processedImage, cv::MORPH_CLOSE, kernel); // 填充 + cv::GaussianBlur(processedImage, processedImage, cv::Size(5, 5), 1.0); + std::vector> contours; + cv::findContours(processedImage, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); + std::vector> approxContours(contours.size()); + for (size_t j = 0; j < contours.size(); j++) { + cv::approxPolyDP(contours[j], approxContours[j], 2.0, true); + } + double minArea = 500; // 示例阈值 + for (auto it = approxContours.begin(); it != approxContours.end(); ) { + if (cv::contourArea(*it) < minArea) it = approxContours.erase(it); + else ++it; + } + cv::drawContours(processedImage, approxContours, -1, cv::Scalar(0)); + cv::resize(processedImage, processedImage, cv::Size(FrameData.Width, FrameData.Height), 0, 0, cv::INTER_CUBIC); + + + + RHIUpdateTexture2D( + FrameData.Texture->GetRenderTargetResource()->GetRenderTargetTexture(), + 0, + FUpdateTextureRegion2D(0, 0, 0, 0, FrameData.Width, FrameData.Height), + FrameData.Width * FrameData.PixelSize, + processedImage.data ); + } + else + { + RHIUpdateTexture2D( + FrameData.Texture->GetRenderTargetResource()->GetRenderTargetTexture(), + 0, + FUpdateTextureRegion2D(0, 0, 0, 0, FrameData.Width, FrameData.Height), + FrameData.Width * FrameData.PixelSize, + Buffer + ); + } } ThreadBuffer.Unlock(); } diff --git a/SpaceStudioClient/Plugins/NeoKinectUnreal/Source/NeoKinectUnreal/Public/NeoKinectManager.h b/SpaceStudioClient/Plugins/NeoKinectUnreal/Source/NeoKinectUnreal/Public/NeoKinectManager.h index 2e726bf..b4adc0b 100644 --- a/SpaceStudioClient/Plugins/NeoKinectUnreal/Source/NeoKinectUnreal/Public/NeoKinectManager.h +++ b/SpaceStudioClient/Plugins/NeoKinectUnreal/Source/NeoKinectUnreal/Public/NeoKinectManager.h @@ -7,7 +7,6 @@ #include "NeoKinectEnums.h" #include "PixelFormat.h" #include "Containers/Ticker.h" - #include "NeoKinectManager.generated.h" class FKinectThread;