2014-12-04 1 views
0

OpenFrameworks를 처음 사용합니다. OpenCV의 광학 흐름을 OpenNI의 사용자 마스크와 함께 사용하기 위해이 도구를 사용하고 있습니다. 그래서 저는 해골이 필요 없습니다. 필요한 것은 OpenNI의 사용자 마스크입니다.OpenFrameworks를 통한 OpenNI는 스켈레톤을 표시하지만 사용자 마스크는 표시하지 않습니다.

내가 OpenNI 버전 1.5.4.0NITE 버전 1.5.2.21을 사용하고 있는데 나는 우분투 트러스티에있어.

대부분의 부품이 작동하지만 하나는 제외 : 사용자 마스크가 보이지 않습니다. 원시 OpenNI 예제가 작동합니다. 사용자 윤곽선을 볼 수 있습니다. OpenFrameworks에서 사용자 마스크를 얻을 수없는 것 같습니다.

내 오픈 프레임 웍스 코드의 각 사용자에 대해

,이 작업을 수행 할 수 있습니다

// "user" is an object returned from ofxOpenNI::getTrackedUser 

// This actually displays a skeleton: 
user.drawSkeleton(); 
// These two do nothing: 
user.drawMask(); 
user.drawPointCloud(); 

을 나는이 또한 OpenNI 장치의 디버그 뷰 마찬가지입니다 생각 :

// openNiDevice is an instance of ofxOpenNI 
openNiDevice.drawDebug(); 

이는 RGB 카메라를 보여줍니다 뼈대가있는 깊이 카메라이지만 사용자 마스크를 보여주지는 않습니다. 사용자 윤곽선이 균일 한 깊이 판독으로 오인 될 수 있기 때문에 완전히 명확하지는 않지만, 그렇다고는 생각하지 않습니다. 디버그 화면에서도 사용자 마스크가 깊이 색상과 다른 색상으로 표시됩니다.

그리기시 화면에 사용자 수가 표시되고 ofxOpenNI은 사용자를 감지합니다. 또한 해골을 보여주기 때문에 무언가가이어야합니다.

또한 OpenNI 샘플 앱 Sample-NiUserTracker은 완벽한 개요를 제공하므로 OpenNI가 작동해야합니다.

내가 뭘 잘못하고 있니?

답변

0

나는 그것을 알아 냈다. 사용자 마스크 코드에서 숫자는 int로 저장되지만 char로 읽습니다. 따라서 사용자 마스크의 픽셀을 새로운 배열로 저장하지만 4 개의 항목 중 하나만 유지하면 트릭을 만들 수 있습니다.

기본적이 :

const unsigned char * userPix = user.getMaskPixels().getPixels(); 
int dataSize = user.getMaskPixels().getWidth() * user.getMaskPixels().getHeight() * 4; 
unsigned char goodGray[dataSize/4]; 
for (int i = 0; i < dataSize; i += 4) { 
    goodGray[i/4] = userPix[i]; 
} 

goodGray

이제 올바른 픽셀을 포함하고, ofImage 목적을 위해 사용될 수있다.

관련 문제