Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- AR
- 반응형레이아웃
- TextMeshPro 한글
- Depth camera
- Rewired
- RenderStreaming
- webview
- kinect v2
- 커스텀쉐이더
- 구글플레이스토어
- muilt controller
- 랜더스트리밍
- AssetBundle
- web3D
- WebGL
- Unity
- apk
- Specular Highlights
- untiy
- Android
- unityhub
- Unity VisualStudio
- 듀얼쇼크4
- android app bundle
- DS4
- 역직렬화 오류
- 유니티
- Environment Reflections
- 에셋번들
- TextMeshPro
Archives
- Today
- Total
기억저장고
[Unity] 키넥트(Kinect V2) Depth Camera 이미지 세팅하는법 본문
1. 키넥트 Window Unity Pro 패키지 설치
[키넥트 기본앱 - 키넥트 동작 확인용]
https://www.microsoft.com/en-us/download/details.aspx?id=44561
[키넥트 유니티패키지 - 유니티 개발용]
https://learn.microsoft.com/ko-kr/windows/apps/design/devices/kinect-for-windows
2. 코드 작성
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Windows.Kinect;
using UnityEngine.UI;
public class KinectColorDepth : MonoBehaviour
{
private KinectSensor sensor;
private MultiSourceFrameReader frameReader;
// Depth 값을 표시할 텍스처 크기
private const int depthWidth = 512;
private const int depthHeight = 424;
private ushort[] depthData = new ushort[depthWidth * depthHeight];
private byte[] depthBytes = new byte[depthWidth * depthHeight * 4]; // RGBA 값
[Header("색상 Graident")]
public Gradient gradient;
[Header("결과값")]
public Texture2D resultTexture;
public RawImage resultImg;
private void Awake()
{
resultTexture = new Texture2D(depthWidth, depthHeight, TextureFormat.RGBA32, false);
resultImg.texture = resultTexture;
}
private void Start()
{
StartKinect();
}
private void Update()
{
UpdateKinect();
}
private void StartKinect()
{
sensor = KinectSensor.GetDefault();
if (sensor != null)
{
sensor.Open();
frameReader = sensor.OpenMultiSourceFrameReader(FrameSourceTypes.Color | FrameSourceTypes.Depth);
}
}
private void UpdateKinect()
{
var pMultiSourceFrame = frameReader.AcquireLatestFrame();
if (pMultiSourceFrame != null)
{
using (DepthFrame depthFrame = pMultiSourceFrame.DepthFrameReference.AcquireFrame())
{
if (depthFrame != null)
{
depthFrame.CopyFrameDataToArray(depthData);
// Depth 값을 컬러로 변환하고 텍스처에 적용
CreateDepthTexture();
}
}
}
}
private void CreateDepthTexture()
{
for (int i = 0; i < depthData.Length; i++)
{
ushort depth = depthData[i];
float normal = (depth >= ushort.MaxValue ? 1 : (depth / 2048f)); // Depth 값 정규화
//Depth에 따라 Color 값 변경
Color keyColor = gradient.Evaluate(normal);
depthBytes[i * 4] = (byte)(keyColor.r * 255);// R
depthBytes[i * 4 + 1] = (byte)(keyColor.g * 255); ; // G
depthBytes[i * 4 + 2] = (byte)(keyColor.b * 255); ; // B
depthBytes[i * 4 + 3] = 255; // A
}
// Texture2D에 RGBA 데이터 적용
resultTexture.LoadRawTextureData(depthBytes);
resultTexture.Apply();
//노이즈 제거
//RemoveNoise(t2);
}
}
[결과값]
--
*블러링된 값이 필요하면 OpenCV For Unity 사용
- Depth카메라 이미지 주변이 지글거리므로, Blur를 해줘서, 주변을 뭉개서 지글거림을 없앨 수 있다.
using OpenCVForUnity.CoreModule;
using OpenCVForUnity.ImgprocModule;
using OpenCVForUnity.UnityUtils;
//노이즈 제거
void RemoveNoise(Texture2D inputTex)
{
//Texture Mat으로 변환
Mat inputMat = new Mat(inputTex.height, inputTex.width, CvType.CV_8UC4);
Utils.texture2DToMat(inputTex, inputMat);
Mat outputMat = new Mat();
// 그레이스케일로 변환
Imgproc.cvtColor(inputMat, outputMat, Imgproc.COLOR_RGBA2GRAY);
// 노이즈 제거
Imgproc.medianBlur(outputMat, outputMat, 3);//미디언 블러 (3 > 블러의 정도)
//결과
Mat reulstMat = new Mat(inputTex.height, inputTex.width, CvType.CV_8UC4);
Imgproc.cvtColor(outputMat, reulstMat, Imgproc.COLOR_GRAY2RGB); // 그레이스케일로 변환
Utils.matToTexture2D(reulstMat, resultTexture);
}
블러를 했을떄 주변에 자글거리는게 없어진다.
'Unity' 카테고리의 다른 글
[Unity] SpriterRender에 그림자 넣는법 (0) | 2025.01.02 |
---|---|
AssetBundle 유니티 에디터 안 켜고 만들기 (0) | 2024.10.04 |
Unity VisualStudio 연결 안될 경우(External Tool에서도 안될경우) (0) | 2024.03.08 |
[Untiy] URP – 커스텀쉐이더에서 Environment Reflections, Specular Highlights 조절하는법 (0) | 2024.02.22 |
WebGL RendertTexture.Create failed: requested size is too large 오류 해결방법 (0) | 2023.11.24 |
Comments