Je travaille avec le capteur Kinect et j'essaie d'aligner les trames de profondeur et de couleur afin de pouvoir les enregistrer comme des images qui s'intègrent l'une dans l'autre. J'ai passé beaucoup de temps à parcourir les forums msdn et la documentation modeste de Kinect SDK et je ne reçois absolument nulle part.Kinect SDK: aligner les trames de profondeur et de couleur
Sur la base de cette réponse: Kinect: Converting from RGB Coordinates to Depth Coordinates
I ont la fonction suivante, où depthData
et colorData
sont obtenus à partir NUI_LOCKED_RECT.pBits
et mappedData
est la sortie contenant nouvelle trame de couleur, mis en correspondance avec des coordonnées de profondeur:
bool mapColorFrameToDepthFrame(unsigned char *depthData, unsigned char* colorData, unsigned char* mappedData)
{
INuiCoordinateMapper* coordMapper;
// Get coordinate mapper
m_pSensor->NuiGetCoordinateMapper(&coordMapper);
NUI_DEPTH_IMAGE_POINT* depthPoints = new NUI_DEPTH_IMAGE_POINT[640 * 480];
HRESULT result = coordMapper->MapColorFrameToDepthFrame(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, NUI_IMAGE_RESOLUTION_640x480, 640 * 480, reinterpret_cast<NUI_DEPTH_IMAGE_PIXEL*>(depthData), 640 * 480, depthPoints);
if (FAILED(result))
{
return false;
}
int pos = 0;
int* colorRun = reinterpret_cast<int*>(colorData);
int* mappedRun = reinterpret_cast<int*>(mappedData);
// For each pixel of new color frame
for (int i = 0; i < 640 * 480; ++i)
{
// Find the corresponding pixel in original color frame from depthPoints
pos = (depthPoints[i].y * 640) + depthPoints[i].x;
// Set pixel value if it's within frame boundaries
if (pos < 640 * 480)
{
mappedRun[i] = colorRun[pos];
}
}
return true;
}
Tout ce que je reçois lors de l'exécution de ce code est un cadre de couleur inchangé avec tous les pixels (blancs) supprimés où depthFrame n'avait aucune information.
Avez-vous vérifié l'exemple d'écran vert dans le Kinect pour des exemples de codage de Windows? http://kinectforwindows.codeplex.com/. Il aligne la couleur et la profondeur. –
Oui, j'ai. Il n'utilise pas le nouveau 'INuiCoordinateMapper', mais une ancienne méthode' INuiSensor :: NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution'. Je l'ai essayé et ça ne marche pas non plus pour moi (j'obtiens toute l'image blanche). D'une certaine façon, le tableau de valeurs de profondeur qu'ils obtiennent est USHORT (16 bits) et le mien est de 32 bits, avec la raison possible que j'initialise mon capteur Kinect avec différents paramètres (profondeur seulement aucun index de joueur). Même si je crée un tableau de valeurs de profondeur de 16 bits à partir du bit 32, la fonction ne fonctionne pas pour moi. – jaho
chose similaire a été résolu ici: http://stackoverflow.com/a/19905805/2521214 Kinect SDK a des fonctions pour alligner les images, mais ils n'ont pas fonctionné pour moi du tout (ont une très ancienne version de Kinect) donc je l'ai fait moi-même ... dans ce lien est mes données d'étalonnage kinect pour le vôtre, vous devez le mesurer vous-même – Spektre