修改交互功能

This commit is contained in:
liuyunhui
2025-10-17 23:46:55 +08:00
parent d170370c52
commit b2f7e625d7
23 changed files with 192 additions and 35 deletions
@@ -1124,6 +1124,134 @@ UTextureRenderTarget2D* UNeoKinectManager::CreateTexture(int32 Width, int32 Heig
return Texture;
}
long long lastTime = 0;
long long currentTime = 0;
long long GetCurrentTimeInMilliseconds()
{
// 使用std::chrono获取当前时间点
auto now = std::chrono::high_resolution_clock::now();
// 将时间点转换为时间戳(自纪元以来的持续时间)
auto duration = now.time_since_epoch();
// 将持续时间转换为毫秒
auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();
return milliseconds;
}
cv::RNG rng(12345); // 固定种子
cv::Scalar color(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
void changeColor(cv::Mat& src)
{
for (int i = 0; i < src.rows; i++) {
for (int j = 0; j < src.cols; j++) {
cv::Vec4b& pixel = src.at<cv::Vec4b>(i, j);
//if (pixel[0] <= 50 || pixel[1] <= 50 || pixel[2] <= 50)
{
pixel[0] = color[0]; // B通道
pixel[1] = color[1]; // G通道
pixel[2] = color[2]; // R通道
// A通道保持不变
}
//else
//{
// pixel[0] = 0; // B通道
// pixel[1] = 0; // G通道
// pixel[2] = 0; // R通道
//}
}
}
}
void changeColor2(cv::Mat& src)
{
for (int i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
cv::Vec4b& pixel = src.at<cv::Vec4b>(i, j);
if (pixel[0] > 0 || pixel[1] > 0 || pixel[2] > 0)
{ // 检查R通道(OpenCV中BGR顺序)
pixel[0] = color[0]; // B通道
pixel[1] = color[1]; // G通道
pixel[2] = color[2]; // R通道
// A通道保持不变
}
else
{
pixel[0] = 0; // B通道
pixel[1] = 0; // G通道
pixel[2] = 0; // R通道
}
}
}
}
void combine(cv::Mat& src, cv::Mat& dst)
{
for (int i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
const cv::Vec4b& pixel = src.at<cv::Vec4b>(i, j);
if (pixel[0] > 0 || pixel[1] > 0 || pixel[2] > 0)
{ // 检查R通道(OpenCV中BGR顺序)
cv::Vec4b& detPixel = dst.at<cv::Vec4b>(i, j);
detPixel = pixel;
}
}
}
}
void merge(cv::Mat& src1, cv::Mat& src2, cv::Mat& dst)
{
for (int i = 0; i < src1.rows; i++)
{
for (int j = 0; j < src1.cols; j++)
{
const cv::Vec4b& pixel1 = src1.at<cv::Vec4b>(i, j);
const cv::Vec4b& pixel2 = src2.at<cv::Vec4b>(i, j);
if (pixel1[0] > 0 || pixel1[1] > 0 || pixel1[2] > 0)
{
cv::Vec4b& detPixel = dst.at<cv::Vec4b>(i, j);
detPixel = pixel1;
}
if (pixel2[0] > 0 || pixel2[1] > 0 || pixel2[2] > 0)
{
cv::Vec4b& detPixel = dst.at<cv::Vec4b>(i, j);
detPixel = pixel2;
}
}
}
}
void scalar(cv::Mat& src, cv::Mat& dst)
{
cv::Rect roi(16, 9, src.cols - 16, src.rows - 9);
cv::Mat roiMat = src(roi);
cv::resize(roiMat, dst, src.size(), 0, 0, cv::INTER_CUBIC);
}
void applyMosaic(cv::Mat& image, int blockSize = 10) {
for (int y = 0; y < image.rows; y += blockSize) {
for (int x = 0; x < image.cols; x += blockSize) {
cv::Rect block(x, y, cv::min(blockSize, image.cols - x),
cv::min(blockSize, image.rows - y));
cv::Scalar _color = cv::mean(image(block));
cv::rectangle(image, block, _color, cv::FILLED);
}
}
}
cv::Mat rawImg = cv::Mat::zeros(cv::Size(1920, 1080), CV_8UC1);
cv::Mat result = cv::Mat::zeros(cv::Size(960, 540), CV_8UC1);
cv::Mat dst1 = cv::Mat::zeros(cv::Size(960, 540), CV_8UC1);
cv::Mat dst2 = cv::Mat::zeros(cv::Size(960, 540), CV_8UC1);
cv::Mat showMat = cv::Mat::zeros(cv::Size(960, 540), CV_8UC1);
void UNeoKinectManager::UpdateFrames()
{
// if the game thread issued a shutdown, the textures may become invalid at any time
@@ -1142,24 +1270,23 @@ void UNeoKinectManager::UpdateFrames()
{
ThreadBuffer.Lock();
{
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);
if (i == static_cast<int32>(EKinectFrame::BodyIndex_ColorSpace))
{
memcpy(rawImg.data, Buffer, FrameData.Height * FrameData.Width * FrameData.PixelSize);
cv::resize(rawImg, dst1, 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);
cv::resize(processedImage, processedImage, cv::Size(FrameData.Width, FrameData.Height), 0, 0, cv::INTER_CUBIC);
cv::morphologyEx(dst1, dst1, cv::MORPH_OPEN, kernel); // 去噪
cv::morphologyEx(dst1, dst1, cv::MORPH_CLOSE, kernel); // 填充
cv::GaussianBlur(dst1, dst1, cv::Size(5, 5), 1.0);
//applyMosaic(rawImg, 32);
cv::resize(dst1, rawImg, 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
rawImg.data
);
}
else