2012-10-31 4 views
8

내 응용 프로그램에서 Depth Basics Sample에서 검색된 깊이 프레임과 비슷한 깊이 프레임을 얻고 있습니다. 내가 이해할 수없는 것은 왜 이미지에 개별 레벨이 존재 하는가? 이러한 깊이있는 값의 급격한 변화를 무엇이라고 부릅니 까. 분명히 내 오른손 절반은 모두 검은 색이고 내 왼손은 3 단계로 나뉘어 보인다. 이것은 무엇이며 어떻게 제거합니까? 나는 KinectExplorer 샘플 응용 프로그램을 실행하면 다음과 같이Kinect Depth Image

Kinect Depth Basics Sample http://i46.tinypic.com/2hwekxd.jpg

나는 깊이를 얻을. 이것은 원시 깊이 데이터에서 생성하고자하는 깊이 이미지입니다.

Kinect Explorer http://i50.tinypic.com/2rwx1z5.jpg

나는 OpenCV의와 함께 NuiApi을 마이크로 소프트 키 넥트 SDK의 (V1.6)를 사용하고 있습니다. 다음 코드를 가지고

BYTE *pBuffer = (BYTE*)depthLockedRect.pBits; //pointer to data having 8-bit jump 
USHORT *depthBuffer = (USHORT*) pBuffer; //pointer to data having 16-bit jump 
int cn = 4; 
this->depthFinal = cv::Mat::zeros(depthHeight,depthWidth,CV_8UC4); //8bit 4 channel 
for(int i=0;i<this->depthFinal.rows;i++){ 
    for(int j=0;j<this->depthFinal.cols;j++){ 
     USHORT realdepth = ((*depthBuffer)&0x0fff); //Taking 12LSBs for depth 
     BYTE intensity = (BYTE)((255*realdepth)/0x0fff); //Scaling to 255 scale grayscale 
     this->depthFinal.data[i*this->depthFinal.cols*cn + j*cn + 0] = intensity; 
     this->depthFinal.data[i*this->depthFinal.cols*cn + j*cn + 1] = intensity; 
     this->depthFinal.data[i*this->depthFinal.cols*cn + j*cn + 2] = intensity; 
     depthBuffer++; 
    } 
} 
+0

이미지를 다시 확인하십시오. 표시되지 않습니다. –

+0

이미지 URL이 변경되었습니다. 다시 확인하십시오. – thinkquester

+0

''cn''은 실제로''4''가 아닌''3''이되어야합니까? 실제로 이미지를 출력하는 곳을보기 위해 흘끗 보일 수도 있습니다. – Tim

답변

0

깊이 화상 데이터의 시각화 (0~255 코드 예에서) 거칠어 신중한 수준을 갖지만, 실제 깊이 이미지 데이터는 여전히 0과 2047 사이의 숫자 신중한, 물론,하지만 그들을 묘사하기 위해 선택한 색상과 같은 거친 단위로하지 않습니다.

5

표시되는 줄무늬는 %256 작업으로 인한 깊이 값이 wrapping입니다.

하여 최대 깊이가 2048 경우
BYTE intensity = depth == 0 || depth > 4095 ? 0 : 255 - (BYTE)(((float)depth/4095.0f) * 255.0f); 

2047와 4095를 교체 대신 일으키는 모듈로 연산 (%256)을인가하는 밴드 예는 전 범위에 따라 심도 값을 매핑 나타나서 .

더 포인터 :

  1. 키 넥트가 아마도 11bit 값 (0-2047)를 반환하지만 당신은 단지 8 비트 (255)를 사용합니다.
  2. 새로운 키 넥트 버전은 12 비트 값 (0-4096) 키 넥트 탐색기 소스 코드
  3. 를 반환하는 것, 마법의 대부분이 일어날 것으로 보인다 DepthColorizer.cs라는 파일이있다. 나는이 코드가 kinect explorer에서 깊이 값을 매우 매끄럽게 만들었다 고 믿습니다. 그러나 틀릴 수도 있습니다.
+0

더 작은 값을 모듈로 사용하여 심도 값을 래핑 한 경우 밴드가 더 멀리 떨어지나요? –

1

깊이 맵의 시각화와 관련된 프로젝트를 진행하는 동안 동일한 문제에 직면했습니다. 그러나 OpenNI SDK를 Kinect SDK 라이브러리 대신 OpenCV와 함께 사용했습니다. 문제는 동일했고 솔루션이 나를 위해했던 것처럼 당신을 위해 작동합니다.

질문에 대한 이전 답변에서 언급했듯이 Kinect Depth map은 11 비트 (0-2047)입니다. 예제에서는 8 비트 데이터 유형이 사용됩니다. 나는이 문제를 해결 얻을하려면 코드에 무슨 짓을

는 16 비트 매트에 깊이 맵을 획득하고 Mat

에 대한 convertTo 기능에서 확장 옵션을 사용하여 매트 UCHAR 8 비트로 변환하는 것이 었습니다 우선 여기

Mat depthMat16UC1(XN_VGA_Y_RES, XN_VGA_X_RES, CV_16UC1); 

XN_VGA_Y_RES, XN_VGA_X_RES가 획득 한 깊이 맵의 해상도를 정의 깊이 데이터를 획득하는 Mat를 초기화합니다.

I는 다음과 같이 인 코드 할 :

depthMat16UC1.data = ((uchar*)depthMD.Data()); 
depthMat16UC1.convertTo(depthMat8UC1, CV_8U, 0.05f); 
imshow("Depth Image", depthMat8UC1); 

depthMD는 넥트 센서로부터 검색 데이터를 포함하는 메타 데이터이다.

나는 이것이 어떤면에서 도움이되기를 바랍니다.

0

kinect v2는 8 미터 깊이를 볼 수 있지만 (4.5를 넘어서는 정확도는 감소합니다). 약 0.4 미터부터 시작합니다. 그래서 색깔에 8000을 표현해야합니다. 이 작업을 수행하는 방법은 RGB 색상을 숫자로 사용하는 것입니다. 그러면 255x255x255와 같은 숫자를 픽셀로 저장할 수 있습니다. 다른 색상 형식을 사용하는 경우 색상이 다를 수 있습니다. 255x255x255의 숫자에 8000을 저장하면 일정한 양의 R + G + B가되며이 밴딩 효과가 나타납니다.

8000을 나눌 수도 있고 숫자를 빼거나 특정 값을 벗어날 수도 있습니다.

관련 문제