Derzeit entwickle ich ein Tool für die Kinect für Windows v2 (ähnlich dem in XBOX ONE). Ich habe versucht, einigen Beispielen zu folgen, und habe ein Arbeitsbeispiel, das das Kamerabild, das Tiefenbild und ein Bild zeigt, das die Tiefe mit rgb unter Verwendung von opencv abbildet. Aber ich sehe, dass es meine Hand dupliziert, wenn ich das Mapping mache, und ich denke, es liegt an etwas falsch in dem Koordinaten-Mapperteil.Kinect für Windows v2 Bildfehler in der Tiefe
hier ist ein Beispiel dafür:
Und hier ist der Code-Schnipsel, die das Bild (rgbd Bild im Beispiel)
void KinectViewer::create_rgbd(cv::Mat& depth_im, cv::Mat& rgb_im, cv::Mat& rgbd_im){
HRESULT hr = m_pCoordinateMapper->MapDepthFrameToColorSpace(cDepthWidth * cDepthHeight, (UINT16*)depth_im.data, cDepthWidth * cDepthHeight, m_pColorCoordinates);
rgbd_im = cv::Mat::zeros(depth_im.rows, depth_im.cols, CV_8UC3);
double minVal, maxVal;
cv::minMaxLoc(depth_im, &minVal, &maxVal);
for (int i=0; i < cDepthHeight; i++){
for (int j=0; j < cDepthWidth; j++){
if (depth_im.at<UINT16>(i, j) > 0 && depth_im.at<UINT16>(i, j) < maxVal * (max_z/100) && depth_im.at<UINT16>(i, j) > maxVal * min_z /100){
double a = i * cDepthWidth + j;
ColorSpacePoint colorPoint = m_pColorCoordinates[i*cDepthWidth+j];
int colorX = (int)(floor(colorPoint.X + 0.5));
int colorY = (int)(floor(colorPoint.Y + 0.5));
if ((colorX >= 0) && (colorX < cColorWidth) && (colorY >= 0) && (colorY < cColorHeight))
{
rgbd_im.at<cv::Vec3b>(i, j) = rgb_im.at<cv::Vec3b>(colorY, colorX);
}
}
}
}
}
Hat jemand eine Ahnung, wie zu lösen schaffen Dies? Wie kann diese Duplizierung verhindert werden?
Vielen Dank im Voraus
UPDATE:
Wenn ich eine einfache Tiefenbild Schwellwertbildung kann ich folgendes Bild erhalten:
Dies ist, was mehr oder weniger ich passieren zu erwarten, und keine doppelte Hand im Hintergrund zu haben. Gibt es eine Möglichkeit, diese doppelte Hand im Hintergrund zu verhindern?
Woher kommt dieses Mapping? von? sehr wahrscheinlich müssen Sie die Kalibrierung zwischen Tiefenbild und Farbbild bearbeiten, da die Vorgaben nicht perfekt sind. Sie müssen also Ihre eigene Kalibrierung durchführen. Sehen Sie sich dazu an: http://nicolas.burrus.name/index.php/Research/KinectCalibration – Micka
Es stammt aus dem kinect SDK v2. Ich habe erwartet, dass ich das verwenden werde, das von der Firmware/SDK kommt, die die Intrigen der Kamera verwendet, um diese Berechnungen durchzuführen ... aber ich denke, der Fehler ist riesig im Vergleich zu anderen Kameras Firmware/Software wie Primesense mit Openni. Ich erwartete bessere Ergebnisse, oder zumindest ähnlich zu anderen Kameras .... Danke für den Link obwohl :) – api55
Afaik die Auto-Kalibrierung Daten des Kinect in der Firmware gespeichert ist nicht das grear. Aber vielleicht liege ich da falsch. – Micka