2011-04-01 35 views
9

He usado Kinect y OpenCV (estoy usando C++). Puedo obtener tanto el RGB como la imagen de profundidad. Con la imagen RGB puedo "jugar" como de costumbre, difuminándolo, usando canny (después de convertirlo a escala de grises), ... pero no puedo hacer lo mismo con la imagen de profundidad. Cada vez que quiero hacer algo con la imagen de profundidad obtuve excepciones.Kinect y Opencv, la imagen de profundidad, cómo usarla

Tengo el siguiente código para obtener la imagen de profundidad:

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); 

El problema es que no puedo hacer nada con kinectDepthImage. Traté de convertirlo a escala de grises y luego usar astuto, pero no sé cómo convertirlo.

Básicamente me gustaría aplicar canny y laplaciano a la imagen de profundidad.

Respuesta

5

El problema era que la salida de cvGetImage es la profundidad 16bits, mientras Canny requiere de 8 bits, por lo tanto necesito para convertirlo en 8 bits , algo así como:

cvConvertScale(depthMetersMat, kinectDepthImage8, 1.0/256.0, 0); 
+0

si esta es la respuesta a la pregunta, márquelo como "aceptado" (haga clic en marque el icono). – Spudley

0

¿Cuál es el tamaño de (XnDepthPixel)?

Trate de usar un cvCreateImageHeader y luego hacer cvSetData en él con el XnDepth imagen

+0

El problema es que la salida de cvGetImage es de 16 bits de profundidad, mientras que canny requiere 8 bits, por lo tanto necesito convertirla a 8bits, algo así como: –

+0

solo crear un encabezado de imagen como dije con IPL_DEPTH_16U, será más rápido que convertir toda la matriz, especialmente si es grande. También quiero hackear un kinect: D – fabrizioM

+0

Lo siento, soy nuevo con opencv, así que no sé cómo usar tus ideas. ¿Por qué necesito el encabezado de la imagen y cvSetData? –

0

Verificar abajo el código del enlace ... podría darle información valiosa. NOTA: No es mi código, puede dar el resultado que necesita. comente el // cvCvtColor (rgbimg, rgbimg, CV_RGB2BGR);

http://pastebin.com/e5kHzs84

Saludos Nagaraju

3

Los nuevos encurages OpenCV API para utilizar Mat en lugar de los antiguos tipos de imágenes. El código actual para el uso de los metadatos de profundidad OpenNI en OpenCV sería:

Mat depthMat16UC1(width, height, CV_16UC1, (void*) g_DepthMD.Data()); 
Mat depthMat8UC1; 
depthMat16UC1.convertTo(depthMat8UC1, CV_8U, 1.0/256.0); 
0

si está utilizando OpenNI, que han creado contexto, los nodos de producción, y comenzó la generación de datos? Probablemente ese es su problema ...

Cuestiones relacionadas