2012-03-13 8 views
1

OpenNI 레코더 모듈을 사용하여 다른 사람이 기록한 일부 데이터로 작업하고 있습니다. 불행히도, 그들은 녹음 중에 실수로 미러링 된 기능을 켜기 때문에 MirrorCap을 사용하여 깊이를 미러링하고 AlternateViewPointCap을 사용하여 깊이를 rgb와 정렬합니다. 내 깊이 노드에서 다음과 같이 이러한 기능에 액세스하려했습니다.AlternateViewPointCap 또는 MirrorCap을 재생에서 변경할 수 있습니다.

xn::Context ni_context; 
xn::Player player; 
xn::DepthGenerator g_depth; 
xn::ImageGenerator g_image; 
ni_context.Init(); 
ni_context.OpenFileRecording(oni_filename, player); 
ni_context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_depth); 
ni_context.FindExistingNode(XN_NODE_TYPE_IMAGE, g_image); 
g_depth.GetMirrorCap().SetMirror(false); 
g_depth.GetAlternativeViewPointCap().SetViewPoint(g_image); 

그러나 이것은 작동하지 않았습니다. 미러를 false로 설정 한 후에도 g_depth의 IsMirrored() 명령은 여전히 ​​true로 반환되고 alternateviewpointcap은 생성기에서받은 깊이 맵을 변경하지 않습니다.

xn::MockDepthGenerator m_depth; 
m_depth.CreateBasedOn(g_depth); 
m_depth.GetMirrorCap().SetMirror(false); 
m_depth.GetAlternativeViewPointCap().SetViewPoint(g_image); 
xn::DepthMetaData temp; 
g_depth.GetMetaData(temp); 
m_depth.SetMetaData(temp); 

이 또한 내가 m_depth에서 얻을 깊이 맵에 영향을 미치지 않습니다

은 또한 모의 노드를 통해 그 일을 시도했다. 내 색상과 깊이 정보를 정렬하는 방법에 대한 모든 제안에 감사 드리며, 해킹 할 필요가 없습니다. 이 데이터는 기록하기가 어려우므로 어떤 식 으로든 사용해야합니다.

내 현재 해결 방법은 모의 깊이 노드를 만들고 SetMetaData 함수로 설정하기 전에 내 자신의 루틴을 사용하여 모든 픽셀을 뒤집는 것입니다. 그런 다음 OpenCV를 사용하여 사용자가 4 점을 클릭하게하여 RGB 이미지에서 심도 이미지로 원근 변환을 만듭니다. 그런 다음이 변환을 rgb 프레임에 적용하여 값을 정렬합니다. 완벽하지는 않지만 작동합니다. 그러나 데이터를 사용해야하는 다른 사람들을 위해 더 적절한 수정을하고 싶습니다.

답변

1

불행히도 OpenNI의 일부 디자인 결정은 Primesense SoC의 영향을받은 것으로 보입니다. 특히 SoC는 하드웨어에서 깊이 -> RGB 등록 및 미러링을 수행 할 수 있습니다. 불행하게도 이것은 녹음했을 때 발생기의 출력이 당신이 가진 것임을 의미합니다. 죄송합니다.

Primesense 드라이버의 코드를보고 등록 (XnDeviceSensorV2/Registration.cpp)을 확인하면 OpenNI에서 액세스 할 수있는 방식으로 렌즈 매개 변수를 내보내는 것처럼 보이지만 불행합니다. 내가 본 유일한 해키 솔루션은 데이터를 내보내도록 드라이버를 수정하고 다시 컴파일하는 것입니다 (이 코드는 사용자 모드 코드이므로 걱정할 필요가 없습니다.) Avin2's SensorKinect을 포크하고 싶을 것입니다.

또한 FYI - 모의 생성기는 처리 자체를 수행하지 않습니다. NiRecordSynthetic 샘플은 모의 노드를 사용하는 방법의 예를 보여줍니다.

0

Roee의 답변에 추가하면 OpenNI를 사용하여 Kinect에서 렌즈 데이터에 액세스 할 수 있습니다. 조금 까다 롭습니다 : 찾고있는 것의 이름과 유형을 알아야합니다. 예를 들어이 코드는 나중에 깊이 투영 장치의 ZeroPlanePixelSize 및 ZeroPlaneDistance를 추출하여 나중에 사영 점을 실제 점으로 변환하는 데 사용됩니다 (장치에서 장치로 변경됨).

XnUInt64 zpd; 
XnDouble zpps; 
g_DepthGenerator.GetIntProperty("ZPD", zpd); 
g_DepthGenerator.GetRealProperty("ZPPS", zpps); 

당신은 아마 당신이 Avin2Sensor 파일을보고 그 깊이 RGB에 대한 관점의 변화가 실제로 수행되는 경우 찾는하여 필요로하는 알고리즘과 키 넥트 매개 변수를 얻을 수 있습니다.

관련 문제