Kinect et Opencv, la profondeur de l'image, comment l'utiliser
J'ai de l'utilisation de Kinect et d'OpenCV (je suis à l'aide de c++). Je peux obtenir à la fois le RVB et la profondeur de l'image.
Avec l'image RVB je peux "jouer" comme d'habitude, le flou, l'utilisation prudente (après conversion en niveaux de gris),... mais je ne peux pas faire la même chose avec l'image de profondeur. Chaque fois que je veux faire quelque chose avec l'image de profondeur j'ai eu des exceptions.
J'ai le code suivant pour obtenir la profondeur de l'image:
CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1 );
CvMat* imageMetersMat = cvCreateMat(480, 640, CV_16UC1 );
IplImage *kinectDepthImage = cvCreateImage( cvSize(640,480),16,1);
const XnDepthPixel* pDepthMap = depth.GetDepthMap();
for (int y=0; y<XN_VGA_Y_RES; y++){
for(int x=0;x<XN_VGA_X_RES;x++){
depthMetersMat->data.s[y * XN_VGA_X_RES + x ] = 10 * pDepthMap[y * XN_VGA_X_RES + x];
}
}
cvGetImage(depthMetersMat, kinectDepthImage);
Le problème est que je ne peux pas faire n'importe quoi avec kinectDepthImage. J'ai essayé de convertir en niveaux de gris, puis en utilisant futé, mais je ne sais pas comment faire pour le convertir.
Fondamentalement, je voudrais appliquer savant et le laplacien de l'image de profondeur.
OriginalL'auteur Dr Sokoban | 2011-04-01
Vous devez vous connecter pour publier un commentaire.
Le problème est que la sortie de cvGetImage est en 16bits profondeur, tout en savant nécessite 8bit, donc j'ai besoin pour le convertir en 8bits, quelque chose comme:
OriginalL'auteur Dr Sokoban
La nouvelle OpenCV Api encurages à utiliser des Tapis à la place de la vieille types d'images. Le code actuel pour l'utilisation de la OpenNI profondeur de méta-données dans les OpenCV serait:
OriginalL'auteur Christoph Pacher
Quelle est la sizeof(XnDepthPixel) ?
Essayez d'utiliser un cvCreateImageHeader et ensuite de faire cvSetData avec la XnDepth Image
il suffit de créer une Image d'en-Tête comme je l'ai dit avec IPL_DEPTH_16U, il sera plus rapide que la conversion de l'ensemble de la matrice, en particulier si est grand. J'ai trop envie de pirater un kinect maintenant 😀
Je suis désolé, je suis nouveau avec opencv, donc je ne sais pas comment utiliser vos idées. pourquoi j'ai besoin de l'image d'en-tête et cvSetData?
De sorte que vous pouvez utiliser à l'intérieur d'Opencv la MÊME mémoire allouée par le Kinect pilote. Vous pouvez apprécier que de copier les matrices 2D n'est pas vraiment bon marché. L'en-Tête d'image donne une description de ce type de matrices, il est en train de regarder, le SetData définit le pointeur à l'effectif de la matrice à l'intérieur de l'image d'en-tête de la structure
OriginalL'auteur fabrizioM
Vérifier le lien ci-dessous de code ... pourrait vous donner de précieux renseignements. REMARQUE: ce n'est pas mon code, peut donner le résultat que vous désirez. commentaire //cvCvtColor(rgbimg,rgbimg,CV_RGB2BGR);
http://pastebin.com/e5kHzs84
Ce qui concerne
Nagaraju
OriginalL'auteur Naga
si vous utilisez OpenNI, avez-vous créé contexte, la production de nœuds, et a commencé à générer des données? Probablement que c'est votre problème..
OriginalL'auteur gideon