2014-09-18 1 views
0

KinectV2의 깊이 데이터를 Unity-Script의 색상 공간에 매핑하려고합니다. 나는 마이크로 소프트가 제공하는 통일의 예에서 살펴 보았다 따라서Kinect v2 + Unity -> MapDepthFrameToColorSpaceUsingIntPtr

) = 느릅 나무는 허용되지 않습니다 - 매퍼 기능을

_sensor.CoordinateMapper.MapDepthFrameToColorSpace(_depthData, _colorSpacePoints)

좌표 일반적인 예상대로 그것은 작동하지만 11 내 프레임 속도를 감소 포인터로 작업하는 매핑에 대해 조각을 발견했습니다.

var pDepthData = GCHandle.Alloc(pDepthBuffer, GCHandleType.Pinned); 
var pDepthCoordinatesData = GCHandle.Alloc(m_pDepthCoordinates, GCHandleType.Pinned); 

m_pCoordinateMapper.MapColorFrameToDepthSpaceUsingIntPtr(
     pDepthData.AddrOfPinnedObject(), 
     (uint)pDepthBuffer.Length * sizeof(ushort), 
     pDepthCoordinatesData.AddrOfPinnedObject(), 
     (uint)m_pDepthCoordinates.Length); 

pDepthCoordinatesData.Free(); 
pDepthData.Free(); 

나의 필요에 상응하는 방법도 있습니다. 나는 pDepthBuffer는 메서드 호출 및 m_pColorSpacePoints에서 유효한 데이터를 초기화하고 임은 여전히 ​​1408 SDK 작업 (MSDN 설명서에서 권장) pDepthBuffer와 같은 길이가

var pDepthData = GCHandle.Alloc(pDepthBuffer, GCHandleType.Pinned); 
var pColorData = GCHandle.Alloc(m_pColorSpacePoints, GCHandleType.Pinned); 

m_pCoordinateMapper.MapDepthFrameToColorSpaceUsingIntPtr(
     pDepthData.AddrOfPinnedObject(), 
     pDepthBuffer.Length * sizeof(ushort), 
     pColorData.AddrOfPinnedObject(), 
     (uint)m_pColorSpacePoints.Length * sizeof(float) * 2); 

pColorData.Free(); 
pDepthData.Free(); 

MapDepthFrameToColorSpace의 포인터 버전을 시도 번역. 함수 다음의 결과는 빈/음수 반올림 부동 값이 있고 유효한 ColorSpacePoint가없는 배열입니다. 오류 없음 - 메시지. 제안 사항이 있으십니까?

답변

0

나는 그것을 작동시켰다. 최신 SDK 버전 1409로 업데이트 한 후 messageall는

ArgumentException: Value does not fall within the expected range. Rethrow as ArgumentException: This API has returned an exception from an HRESULT: 0x80070057

그래서 내가 매개 변수를 조금 재생 오류 메시지를 반환하고 지금은 유효한 데이터를 얻고있다.

다음은 GreenScreen 예제의 CoordinateMapperManager를 수정 한 것입니다. 나는 깊이 값의 위치에 의해 여기

//added declaration and initialization 
private ColorSpacePoint[] m_pColorSpacePoints; 

//in awake method 
m_pColorSpacePoints = new ColorSpacePoint[pDepthBuffer.Length]; 

//accesor to the colorspacepoints 
public ColorSpacePoint[] GetColorSpacePointBuffer() 
{ 
    return m_pColorSpacePoints; 
} 

//the new process frame method 
void ProcessFrame() 
{ 
    var pDepthData = GCHandle.Alloc(pDepthBuffer, GCHandleType.Pinned); 
    var pDepthCoordinatesData = GCHandle.Alloc(m_pDepthCoordinates, GCHandleType.Pinned); 
    var pColorData = GCHandle.Alloc(m_pColorSpacePoints, GCHandleType.Pinned); 

    m_pCoordinateMapper.MapColorFrameToDepthSpaceUsingIntPtr(
    pDepthData.AddrOfPinnedObject(), 
    (uint)pDepthBuffer.Length * sizeof(ushort), 
    pDepthCoordinatesData.AddrOfPinnedObject(), 
    (uint)m_pDepthCoordinates.Length); 


    m_pCoordinateMapper.MapDepthFrameToColorSpaceUsingIntPtr(
    pDepthData.AddrOfPinnedObject(), 
    pDepthBuffer.Length * sizeof(ushort), 
    pColorData.AddrOfPinnedObject(), 
    (uint)m_pColorSpacePoints.Length); 

    pColorData.Free(); 
    pDepthCoordinatesData.Free(); 
    pDepthData.Free(); 

    m_pColorRGBX.LoadRawTextureData(pColorBuffer); 
    m_pColorRGBX.Apply(); 
} 

그리고 그것을 사용하는 방법을 예를 HD 컬러 스트림의 픽셀 위치를 얻기 위해 매핑 된 색상 값에 대한 버퍼 을 추가했다. Untiy을 사용하여 GPU Shader에서 렌더링 작업을 수행했습니다. 다음 코드는 데이터를 가져 오는 방법을 시연하기 위해 단축 된 테스트되지 않은 코드 조각입니다.

//Size of the Kinect V2 Depth Stream 
var _width = 512; 
var _height = 424; 
var _particleCount = _width * _height; 

//Initialize an Array to store position data for particles 
var _particleArray = new Vector3[_particleCount]; 
var _colorArray = new Color[_particleCount]; 

//Get Depth Data 
var _depthData = _coordinateMapperManager.GetDepthPointBuffer(); 

//Get Mapped Color Space Points 
var _colorSpacePoints = _coordinateMapperManager.GetColorSpacePointBuffer(); 

//Get the Colorstream as Texture 
var _texture = _coordinateMapperManager.GetColorTexture(); 

var c = 0; 
for (var i = 0; i < _height; ++i) 
{ 
    for (var j = 0; j < _width; ++j) 
    { 
    _particleArray[c++] = new Vector3(j, i); 
    } 
} 

for (var i = 0; i < _depthData.Length; ++i) 
{ 
    _colorArray[i] = _texture.GetPixel((int)_colorSpacePoints[i].X, (int)_colorSpacePoints[i].Y); 
    _particleArray[i].z = _depthData[i]; 
} 

//Now we have all Data to build a colored 3D PointCloud