我一直在研究這個問題已經有相當長的一段時間了,並且在我的創造力的最後,所以希望別人能幫助我指出正確的方向。我一直在使用Kinect並嘗試將數據捕獲到MATLAB。幸運的是有很多方法可以做到這一點(我目前使用http://www.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlab)。當我試圖將捕獲的數據投影到3D時,我的傳統方法給出了較差的重建結果。簡而言之,我最終編寫了一個用於matlab的Kinect SDK包裝器,用於執行重構和對齊。重建工程就像一個夢,但是......爲什麼kinect顏色和深度不能正確對齊?
我有噸的麻煩與定位,你可以在這裏看到:
請不要在模型過於密切關注: (
正如你所看到的,對齊不正確。我不知道爲什麼是這樣的話,我讀過很多論壇在別人有比我更成功以相同的方法。
我目前的管道正在使用Ki nect Matlab(使用Openni)捕獲數據,使用Kinect SDK進行重構,然後使用Kinect SDK(NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution)進行對齊。我懷疑這可能是由於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