저는이 문제를 오랫동안 연구 해 왔으며 창의력이 끝나면 다른 누군가가 올바른 방향으로 나를 도와 줄 수 있기를 바랍니다. 저는 Kinect와 함께 MATLAB에 데이터를 캡처하려고했습니다. 다행히도 그렇게하는 데는 몇 가지 방법이 있습니다 (현재 http://www.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlab을 사용하고 있습니다). 캡처 된 데이터를 3D로 투영하려고 시도했을 때 기존의 방식으로는 재구성 결과가 좋지 않았습니다.왜 색상과 깊이가 올바르게 정렬되지 않습니까?
짧게 요약하자면, 재구성 및 정렬을 수행하는 matlab 용 Kinect SDK 래퍼를 작성했습니다.
모델에 너무 가까이 보지 마십시오 : 재건은 당신이 여기에서 볼 수 있듯이 내가 정렬에 문제의 톤 데
... 꿈처럼 작동하지만 : 당신이 볼 수 있듯이 (.
, 정렬이 올바르지 않습니다. 나는 그런 경우 이유를 모르겠어요. 나는 다른 사람들이 같은 방법으로 I보다 더 많은 성공을 거두었습니다 포럼을 많이 읽었습니다.
현재 파이프 라인에서 Ki를 사용하고 있습니다. Kinect SDK를 사용하여 재구성 한 다음 Kinect SDK를 사용하여 정렬 (NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution)하여 Matlab (Openni 사용)에서 데이터를 캡처합니다. 아마 Openni 때문일 것으로 추측되었지만 Kinect SDK를 사용하여 캡처하기 위해 mex 함수 호출을 만드는 데 거의 성공하지 못했습니다.
누구든지 나를 더 깊게 파고 들어야하는 방향으로 나를 가리킬 수 있다면, 대단히 감사하겠습니다.
편집 :
그림 일부 코드를 게시해야합니다. 이것은 정렬을 위해 사용하는 코드입니다.
/* The matlab mex function */
void mexFunction(int nlhs, mxArray *plhs[], int nrhs,
const mxArray *prhs[]){
if(nrhs < 2)
{
printf("No depth input or color image specified!\n");
mexErrMsgTxt("Input Error");
}
int width = 640, height = 480;
// get input depth data
unsigned short *pDepthRow = (unsigned short*) mxGetData(prhs[0]);
unsigned char *pColorRow = (unsigned char*) mxGetData(prhs[1]);
// compute the warping
INuiSensor *sensor = CreateFirstConnected();
long colorCoords[ 640*480*2 ];
sensor->NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution(
NUI_IMAGE_RESOLUTION_640x480, NUI_IMAGE_RESOLUTION_640x480,
640*480, pDepthRow, 640*480*2, colorCoords);
sensor->NuiShutdown();
sensor->Release();
// create matlab output; it's a column ordered matrix ;_;
int Jdimsc[3];
Jdimsc[0]=height;
Jdimsc[1]=width;
Jdimsc[2]=3;
plhs[0] = mxCreateNumericArray(3, Jdimsc, mxUINT8_CLASS, mxREAL);
unsigned char *Iout = (unsigned char*)mxGetData(plhs[0]);
for(int x = 0; x < width; x++)
for(int y = 0; y < height; y++){
int idx = (y*width + x)*2;
long c_x = colorCoords[ idx + 0 ];
long c_y = colorCoords[ idx + 1 ];
bool correct = (c_x >= 0 && c_x < width
&& c_y >= 0 && c_y < height);
c_x = correct ? c_x : x;
c_y = correct ? c_y : y;
Iout[ 0*height*width + x*height + y ] =
pColorRow[ 0*height*width + c_x*height + c_y ];
Iout[ 1*height*width + x*height + y ] =
pColorRow[ 1*height*width + c_x*height + c_y ];
Iout[ 2*height*width + x*height + y ] =
pColorRow[ 2*height*width + c_x*height + c_y ];
}
}
질문에 대한 답변이 관련성이 있고 문제를 해결했는지 다른 사람에게 알려야합니다. 그렇지 않다면 왜? 그것이이 커뮤니티가 작동하는 방식입니다. – masad
masad하려면 : 네 답장을 보내 주셔서 감사합니다. 귀하의 답변이 아직 작동하는지 여부를 확인할 기회가 없었지만 지금하고 있습니다. 조금이라도 알려 드리겠습니다. – vsector