Ich arbeite seit einiger Zeit an diesem Problem und bin am Ende meiner Kreativität, also hoffentlich kann jemand anderes mir helfen, in die richtige Richtung zu zeigen. Ich habe mit der Kinect gearbeitet und versucht, Daten in MATLAB zu erfassen. Glücklicherweise gibt es eine ganze Reihe von Möglichkeiten (ich verwende derzeit http://www.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlab). Als ich versuchte, die aufgenommenen Daten in 3D zu projizieren, ergaben meine traditionellen Methoden schlechte Rekonstruktionsergebnisse.Warum kinect Farbe und Tiefe werden nicht richtig ausgerichtet?
Um es kurz zu machen, ich habe am Ende einen Kinect SDK Wrapper für Matlab geschrieben, der die Rekonstruktion und die Ausrichtung durchführt. Die Rekonstruktion funktioniert wie ein Traum, aber ...
Ich Tonnen Probleme mit der Ausrichtung, wie Sie hier sehen können:
Bitte nicht zu eng am Modell aussehen kann: (.
Wie Sie sehen können, die Ausrichtung nicht korrekt ist. ich bin nicht sicher, warum das der Fall ist. ich habe viele Foren gelesen, wo andere mehr Erfolg hatten, als ich mit den gleichen Methoden.
Meine aktuelle Pipeline verwendet Ki Mit Matlab (mit Openni) können Sie Daten erfassen, mit dem Kinect SDK rekonstruieren und dann mit dem Kinect SDK (von NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution) ausrichten. Ich vermutete, dass es vielleicht an Openni lag, aber ich hatte wenig Erfolg beim Erstellen von mex-Funktionsaufrufen, um mit dem Kinect SDK zu erfassen.
Wenn mir jemand in eine Richtung zeigen kann, in die ich tiefer eindringen sollte, wäre es sehr geschätzt.
Bearbeiten:
Abbildung Ich sollte etwas Code veröffentlichen. Dies ist der Code, den ich für die Ausrichtung verwende:
/* 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 ];
}
}
Sie sollten andere wissen lassen, ob die Antworten auf Ihre Frage relevant waren und haben sie das Problem gelöst, das Sie waren. Wenn nicht, warum? So funktioniert diese Community – masad
To masad: Ja danke für deine Antwort. Ich hatte keine Gelegenheit zu bestätigen, ob deine Antwort noch funktioniert, aber ich mache es jetzt. Lass es dich ein bisschen wissen. – vsector