Commit f21dfc57 authored by 16이상민's avatar 16이상민

Extract class because class 'CoordinateMapperManager' has more than 2 features.

Create module because class 'SourceBuffer' and class 'KinectAccessManager' access
Since I have extracted the class, correct the test code for class 'SourceBuffer'
Create the test code for class 'KinectAccessManager'
parent 36e20b59
using UnityEngine.TestTools;
using NUnit.Framework;
using System.Collections;
using KinectModule;
public class KinectAccessManagerTests
{
KinectAccessManager _KinectAccessManager = new KinectAccessManager();
[Test]
public void KinectAccessManagerTestsSimplePasses()
{
// Use the Assert class to test conditions.
_KinectAccessManager.Access();
Assert.IsTrue(_KinectAccessManager.IsAccess, "Kinect Access Error.");
_KinectAccessManager.Dispose();
Assert.IsFalse(_KinectAccessManager.IsAccess, "Kinect Dispose Error.");
}
// A UnityTest behaves like a coroutine in PlayMode
// and allows you to yield null to skip a frame in EditMode
[UnityTest]
public IEnumerator KinectAccessManagerTestsWithEnumeratorPasses()
{
// Use the Assert class to test conditions.
// yield to skip a frame
yield return null;
}
}
fileFormatVersion: 2
guid: 815a622fd2160ac4c9f35d4d3954c0a0
timeCreated: 1515328105
licenseType: Free
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
...@@ -3,39 +3,30 @@ using NUnit.Framework; ...@@ -3,39 +3,30 @@ using NUnit.Framework;
using System.Collections; using System.Collections;
using Windows.Kinect; using Windows.Kinect;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using KinectModule;
public class SourceBufferTests public class SourceBufferTests
{ {
KinectAccessManager _KinectAccessManager = new KinectAccessManager();
SourceBuffer _SourceBuffer = new SourceBuffer(); SourceBuffer _SourceBuffer = new SourceBuffer();
[Test] [Test]
public void SourceBufferTestsSimplePasses() public void SourceBufferTestsSimplePasses()
{ {
// Use the Assert class to test conditions. // Use the Assert class to test conditions.
var sensor = KinectSensor.GetDefault();
Assert.IsNotNull(sensor, "No ready kinect found.");
sensor.Open();
Assert.IsTrue(sensor.IsOpen, "Kinect sensor has problem.");
var coordinateMapper = sensor.CoordinateMapper; _KinectAccessManager.Access();
using (var sourceFrameReader = sensor.OpenMultiSourceFrameReader( Assert.IsTrue(_KinectAccessManager.IsAccess, "Kinect Access Error.");
FrameSourceTypes.Color |
FrameSourceTypes.Depth |
FrameSourceTypes.BodyIndex |
FrameSourceTypes.Body))
{
while (sourceFrameReader == null) ;
var sourceFrame = sourceFrameReader.AcquireLatestFrame(); var sourceFrame = _KinectAccessManager.SourceFrame;
_SourceBuffer.UpdateBuffers(sourceFrame);
_SourceBuffer.UpdateBuffers(sourceFrame); ColorBufferTest(sourceFrame);
BodyIndexBufferTest(sourceFrame);
DepthBufferTest(sourceFrame);
BodyBufferTest(sourceFrame);
ColorBufferTest(sourceFrame); _KinectAccessManager.Dispose();
BodyIndexBufferTest(sourceFrame);
}
sensor.Close();
} }
private void ColorBufferTest(MultiSourceFrame sourceFrame) private void ColorBufferTest(MultiSourceFrame sourceFrame)
...@@ -66,7 +57,7 @@ public class SourceBufferTests ...@@ -66,7 +57,7 @@ public class SourceBufferTests
Assert.AreEqual(bodyIndexBuffer, _SourceBuffer.BodyIndexBuffer, "BodyIndexBufferTest failed."); Assert.AreEqual(bodyIndexBuffer, _SourceBuffer.BodyIndexBuffer, "BodyIndexBufferTest failed.");
} }
private void UpdateDepthBuffer(MultiSourceFrame sourceFrame) private void DepthBufferTest(MultiSourceFrame sourceFrame)
{ {
var depthBuffer = new ushort[SourceBuffer.DepthWidth * SourceBuffer.DepthHeight]; var depthBuffer = new ushort[SourceBuffer.DepthWidth * SourceBuffer.DepthHeight];
using (var depthFrame = sourceFrame.DepthFrameReference.AcquireFrame()) using (var depthFrame = sourceFrame.DepthFrameReference.AcquireFrame())
...@@ -80,7 +71,7 @@ public class SourceBufferTests ...@@ -80,7 +71,7 @@ public class SourceBufferTests
Assert.AreEqual(depthBuffer, _SourceBuffer.DepthBuffer, "DepthBufferTest failed."); Assert.AreEqual(depthBuffer, _SourceBuffer.DepthBuffer, "DepthBufferTest failed.");
} }
private void UpdateBodyBuffer(MultiSourceFrame sourceFrame) private void BodyBufferTest(MultiSourceFrame sourceFrame)
{ {
var bodyBuffer = new Body[SourceBuffer.BodyCount]; var bodyBuffer = new Body[SourceBuffer.BodyCount];
using (var bodyFrame = sourceFrame.BodyFrameReference.AcquireFrame()) using (var bodyFrame = sourceFrame.BodyFrameReference.AcquireFrame())
......
using UnityEngine; using UnityEngine;
using Windows.Kinect; using Windows.Kinect;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System;
public class CoordinateMapperManager : MonoBehaviour public class CoordinateMapperManager : MonoBehaviour
{ {
private KinectSensor _Sensor;
private CoordinateMapper _CoordinateMapper;
private MultiSourceFrameReader _SourceFrameReader;
private DepthSpacePoint[] _DepthCoordinates; private DepthSpacePoint[] _DepthCoordinates;
private SourceBuffer _SourceBuffer; private KinectModule.SourceBuffer _SourceBuffer;
private KinectModule.KinectAccessManager _KinectAccessManager;
long frameCount = 0; long frameCount = 0;
...@@ -31,12 +30,12 @@ public class CoordinateMapperManager : MonoBehaviour ...@@ -31,12 +30,12 @@ public class CoordinateMapperManager : MonoBehaviour
void Awake() void Awake()
{ {
_ColorRGBX = new Texture2D (SourceBuffer.ColorWidth, SourceBuffer.ColorHeight, TextureFormat.RGBA32, false); _ColorRGBX = new Texture2D (KinectModule.SourceBuffer.ColorWidth, KinectModule.SourceBuffer.ColorHeight, TextureFormat.RGBA32, false);
_DepthCoordinates = new DepthSpacePoint[SourceBuffer.ColorWidth * SourceBuffer.ColorHeight]; _DepthCoordinates = new DepthSpacePoint[KinectModule.SourceBuffer.ColorWidth * KinectModule.SourceBuffer.ColorHeight];
InitializeDefaultSensor (); _KinectAccessManager.Access();
} }
void OnGUI () void OnGUI ()
{ {
...@@ -46,39 +45,12 @@ public class CoordinateMapperManager : MonoBehaviour ...@@ -46,39 +45,12 @@ public class CoordinateMapperManager : MonoBehaviour
GUI.Box (new Rect(10, 50, 200, 30), "NULL MSFR Frame"); GUI.Box (new Rect(10, 50, 200, 30), "NULL MSFR Frame");
} }
void InitializeDefaultSensor()
{
_Sensor = KinectSensor.GetDefault();
if (_Sensor == null)
{
//TODO: Popup Modal Window
Debug.LogError("No ready Kinect found!");
Application.Quit();
}
_CoordinateMapper = _Sensor.CoordinateMapper;
_Sensor.Open();
if (!_Sensor.IsOpen)
{
//TODO: Popup Modal Window
Debug.LogError("Kinect sensor has problem!");
Application.Quit();
}
_SourceFrameReader = _Sensor.OpenMultiSourceFrameReader(
FrameSourceTypes.Color |
FrameSourceTypes.Depth |
FrameSourceTypes.BodyIndex |
FrameSourceTypes.Body);
}
void ProcessFrame() void ProcessFrame()
{ {
var DepthData = GCHandle.Alloc(_SourceBuffer.DepthBuffer, GCHandleType.Pinned); var DepthData = GCHandle.Alloc(_SourceBuffer.DepthBuffer, GCHandleType.Pinned);
var pDepthCoordinatesData = GCHandle.Alloc(_DepthCoordinates, GCHandleType.Pinned); var pDepthCoordinatesData = GCHandle.Alloc(_DepthCoordinates, GCHandleType.Pinned);
_CoordinateMapper.MapColorFrameToDepthSpaceUsingIntPtr( _KinectAccessManager.CoordinateMapper.MapColorFrameToDepthSpaceUsingIntPtr(
DepthData.AddrOfPinnedObject(), DepthData.AddrOfPinnedObject(),
(uint)_SourceBuffer.DepthBuffer.Length * sizeof(ushort), (uint)_SourceBuffer.DepthBuffer.Length * sizeof(ushort),
pDepthCoordinatesData.AddrOfPinnedObject(), pDepthCoordinatesData.AddrOfPinnedObject(),
...@@ -107,10 +79,7 @@ public class CoordinateMapperManager : MonoBehaviour ...@@ -107,10 +79,7 @@ public class CoordinateMapperManager : MonoBehaviour
{ {
GetFPS(); GetFPS();
if (_SourceFrameReader == null) var sourceFrame = _KinectAccessManager.SourceFrame;
return;
var sourceFrame = _SourceFrameReader.AcquireLatestFrame();
if ((nullFrame = sourceFrame == null)) if ((nullFrame = sourceFrame == null))
return; return;
...@@ -123,87 +92,168 @@ public class CoordinateMapperManager : MonoBehaviour ...@@ -123,87 +92,168 @@ public class CoordinateMapperManager : MonoBehaviour
{ {
_DepthCoordinates = null; _DepthCoordinates = null;
if (_SourceFrameReader != null) _KinectAccessManager.Dispose();
{
_SourceFrameReader.Dispose();
_SourceFrameReader = null;
}
if (_Sensor != null)
{
_Sensor.Close();
_Sensor = null;
}
} }
} }
public class SourceBuffer namespace KinectModule
{ {
public const int DepthWidth = 512; public class SourceBuffer
public const int DepthHeight = 424;
public const int ColorWidth = 1920;
public const int ColorHeight = 1080;
public const int BodyCount = 6;
private byte[] _ColorBuffer = new byte[ColorWidth * ColorHeight * 4],
_BodyIndexBuffer = new byte[DepthWidth * DepthHeight];
private ushort[] _DepthBuffer = new ushort[DepthWidth * DepthHeight];
private Body[] _BodyBuffer = new Body[BodyCount];
public byte[] ColorBuffer
{ get { return _ColorBuffer; } }
public byte[] BodyIndexBuffer
{ get { return _BodyIndexBuffer; } }
public ushort[] DepthBuffer
{ get { return _DepthBuffer; } }
public Body[] BodyBuffer
{ get { return _BodyBuffer; } }
public void UpdateBuffers(MultiSourceFrame sourceFrame)
{ {
UpdateColorBuffer (sourceFrame); public const int DepthWidth = 512;
UpdateBodyIndexBuffer(sourceFrame); public const int DepthHeight = 424;
UpdateDepthBuffer (sourceFrame); public const int ColorWidth = 1920;
UpdateBodyBuffer (sourceFrame); public const int ColorHeight = 1080;
public const int BodyCount = 6;
private byte[] _ColorBuffer = new byte[ColorWidth * ColorHeight * 4],
_BodyIndexBuffer = new byte[DepthWidth * DepthHeight];
private ushort[] _DepthBuffer = new ushort[DepthWidth * DepthHeight];
private Body[] _BodyBuffer = new Body[BodyCount];
public byte[] ColorBuffer
{ get { return _ColorBuffer; } }
public byte[] BodyIndexBuffer
{ get { return _BodyIndexBuffer; } }
public ushort[] DepthBuffer
{ get { return _DepthBuffer; } }
public Body[] BodyBuffer
{ get { return _BodyBuffer; } }
public void UpdateBuffers(MultiSourceFrame sourceFrame)
{
UpdateColorBuffer(sourceFrame);
UpdateBodyIndexBuffer(sourceFrame);
UpdateDepthBuffer(sourceFrame);
UpdateBodyBuffer(sourceFrame);
}
private void UpdateColorBuffer(MultiSourceFrame sourceFrame)
{
using (var colorFrame = sourceFrame.ColorFrameReference.AcquireFrame())
if (colorFrame != null)
{
var ColorData = GCHandle.Alloc(_ColorBuffer, GCHandleType.Pinned);
colorFrame.CopyConvertedFrameDataToIntPtr(ColorData.AddrOfPinnedObject(), (uint)_ColorBuffer.Length, ColorImageFormat.Rgba);
ColorData.Free();
}
}
private void UpdateBodyIndexBuffer(MultiSourceFrame sourceFrame)
{
using (var bodyIndexFrame = sourceFrame.BodyIndexFrameReference.AcquireFrame())
if (bodyIndexFrame != null)
{
var BodyIndexData = GCHandle.Alloc(_BodyIndexBuffer, GCHandleType.Pinned);
bodyIndexFrame.CopyFrameDataToIntPtr(BodyIndexData.AddrOfPinnedObject(), (uint)_BodyIndexBuffer.Length);
BodyIndexData.Free();
}
}
private void UpdateDepthBuffer(MultiSourceFrame sourceFrame)
{
using (var depthFrame = sourceFrame.DepthFrameReference.AcquireFrame())
if (depthFrame != null)
{
var DepthData = GCHandle.Alloc(_DepthBuffer, GCHandleType.Pinned);
depthFrame.CopyFrameDataToIntPtr(DepthData.AddrOfPinnedObject(), (uint)_DepthBuffer.Length * sizeof(ushort));
DepthData.Free();
}
}
private void UpdateBodyBuffer(MultiSourceFrame sourceFrame)
{
using (var bodyFrame = sourceFrame.BodyFrameReference.AcquireFrame())
if (bodyFrame != null)
bodyFrame.GetAndRefreshBodyData(_BodyBuffer);
}
} }
private void UpdateColorBuffer(MultiSourceFrame sourceFrame) public class KinectAccessManager : IDisposable
{ {
using (var colorFrame = sourceFrame.ColorFrameReference.AcquireFrame()) private KinectSensor _Sensor;
if (colorFrame != null) private CoordinateMapper _CoordinateMapper;
private MultiSourceFrameReader _SourceFrameReader;
private bool _IsSensorOpen = false;
private bool _IsFrameReaderOpen = false;
public bool IsAccess
{ get { return _IsSensorOpen && _IsFrameReaderOpen; } }
public CoordinateMapper CoordinateMapper
{ get { return IsAccess ? _CoordinateMapper : null; } }
public MultiSourceFrame SourceFrame
{ get { return IsAccess ? _SourceFrameReader.AcquireLatestFrame() : null; } }
public void Access()
{
OpenSensor();
OpenFrameReader();
_CoordinateMapper = _Sensor.CoordinateMapper;
}
private void OpenSensor()
{
if (_IsSensorOpen)
return;
_Sensor = KinectSensor.GetDefault();
if (_Sensor == null)
{ {
var ColorData = GCHandle.Alloc(_ColorBuffer, GCHandleType.Pinned); //TODO: Popup Modal Window
colorFrame.CopyConvertedFrameDataToIntPtr(ColorData.AddrOfPinnedObject(), (uint)_ColorBuffer.Length, ColorImageFormat.Rgba); Debug.LogError("No ready Kinect found!");
ColorData.Free(); return;
} }
}
private void UpdateBodyIndexBuffer(MultiSourceFrame sourceFrame) _Sensor.Open();
{ if (!_Sensor.IsOpen)
using (var bodyIndexFrame = sourceFrame.BodyIndexFrameReference.AcquireFrame())
if (bodyIndexFrame != null)
{ {
var BodyIndexData = GCHandle.Alloc(_BodyIndexBuffer, GCHandleType.Pinned); //TODO: Popup Modal Window
bodyIndexFrame.CopyFrameDataToIntPtr(BodyIndexData.AddrOfPinnedObject(), (uint)_BodyIndexBuffer.Length); Debug.LogError("Kinect sensor has problem!");
BodyIndexData.Free(); CloseSensor();
return;
} }
}
private void UpdateDepthBuffer(MultiSourceFrame sourceFrame) _IsSensorOpen = true;
{ }
using (var depthFrame = sourceFrame.DepthFrameReference.AcquireFrame())
if (depthFrame != null) private void OpenFrameReader()
{
if (_IsFrameReaderOpen)
return;
_SourceFrameReader = _Sensor.OpenMultiSourceFrameReader(
FrameSourceTypes.Color |
FrameSourceTypes.Depth |
FrameSourceTypes.BodyIndex |
FrameSourceTypes.Body);
_IsSensorOpen = (_SourceFrameReader != null);
}
public void Dispose()
{
CloseFrameReader();
CloseSensor();
}
private void CloseSensor()
{
if (_IsSensorOpen)
{ {
var DepthData = GCHandle.Alloc(_DepthBuffer, GCHandleType.Pinned); _Sensor.Close();
depthFrame.CopyFrameDataToIntPtr(DepthData.AddrOfPinnedObject(), (uint)_DepthBuffer.Length * sizeof(ushort)); _IsSensorOpen = false;
DepthData.Free();
} }
} }
private void UpdateBodyBuffer(MultiSourceFrame sourceFrame) private void CloseFrameReader()
{ {
using (var bodyFrame = sourceFrame.BodyFrameReference.AcquireFrame()) if (_IsFrameReaderOpen)
if (bodyFrame != null) {
bodyFrame.GetAndRefreshBodyData(_BodyBuffer); _SourceFrameReader.Dispose();
_IsFrameReaderOpen = false;
}
}
} }
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment