Ho lavorato a questo problema per un po 'di tempo e sono alla fine della mia creatività, quindi spero che qualcun altro possa aiutarmi a indicarmi la giusta direzione. Ho lavorato con Kinect e ho tentato di acquisire dati in MATLAB. Fortunatamente ci sono diversi modi per farlo (attualmente sto usando http://www.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlab). Quando ho provato a proiettare i dati catturati in 3D, i miei metodi tradizionali hanno dato risultati di ricostruzione mediocri.Perché il colore e la profondità di kinect non si allineano correttamente?
Per farla breve, ho finito per scrivere un wrapper Kinect SDK per matlab che esegue la ricostruzione e l'allineamento. La ricostruzione funziona come un sogno, ma ...
Sto avendo un sacco di problemi con l'allineamento, come potete vedere qui:
Si prega di non guardare troppo da vicino il modello: (.
Come si può vedere, l'allineamento non è corretto. non so perché questo è il caso. ho letto un sacco di forum dove gli altri hanno avuto più successo di quanto io con gli stessi metodi.
La mia pipeline attuale utilizza Ki nect Matlab (usando Openni) per acquisire i dati, ricostruire utilizzando l'SDK Kinect, quindi eseguire l'allineamento utilizzando il Kinect SDK (di NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution). Sospettavo che forse fosse dovuto a Openni, ma ho avuto scarso successo nel creare chiamate a funzioni di messaggistica da acquisire usando l'SDK Kinect.
Se qualcuno può indicarmi una direzione nella quale dovrei approfondire, sarebbe molto apprezzato.
Modifica:
Figura Dovrei pubblicare del codice. Questo è il codice che uso per l'allineamento:
/* 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 ];
}
}
dovresti far sapere agli altri se le risposte alla tua domanda erano pertinenti e hanno risolto il problema che eri. se no allora perché? è così che funziona questa comunità – masad
Per il masad: sì grazie per la risposta. Non ho avuto la possibilità di confermare se la tua risposta funziona ancora, ma lo sto facendo ora. Ti farò sapere un po '. – vsector