@@ -329,6 +329,73 @@ void freenect_camera_to_world(freenect_device* dev, int cx, int cy, int wz, doub
329
329
* wy = (double )(cy - DEPTH_Y_RES /2 ) * factor ;
330
330
}
331
331
332
+ /// RGB -> depth mapping function (inverse of default FREENECT_DEPTH_REGISTERED mapping)
333
+ void freenect_map_rgb_to_depth (freenect_device * dev , uint16_t * depth_mm , uint8_t * rgb_raw , uint8_t * rgb_registered )
334
+ {
335
+ uint32_t target_offset = dev -> registration .reg_pad_info .start_lines * DEPTH_Y_RES ;
336
+ int x ,y ;
337
+ int * map = (int * )malloc (DEPTH_Y_RES * DEPTH_X_RES * sizeof (int ));
338
+ unsigned short * zBuffer = (unsigned short * )malloc (DEPTH_Y_RES * DEPTH_X_RES * sizeof (unsigned short ));
339
+ memset (zBuffer , DEPTH_NO_MM_VALUE , DEPTH_X_RES * DEPTH_Y_RES * sizeof (unsigned short ));
340
+
341
+ for (y = 0 ; y < DEPTH_Y_RES ; y ++ ) for (x = 0 ; x < DEPTH_X_RES ; x ++ ) {
342
+ uint32_t index = y * DEPTH_X_RES + x ;
343
+ uint32_t cx ,cy ,cindex ;
344
+
345
+ map [index ] = -1 ;
346
+
347
+ int wz = depth_mm [index ];
348
+
349
+ if (wz == DEPTH_NO_MM_VALUE ) {
350
+ continue ;
351
+ }
352
+
353
+ // coordinates in rgb image corresponding to x,y in depth image
354
+ cx = (dev -> registration .registration_table [index ][0 ] + dev -> registration .depth_to_rgb_shift [wz ]) / REG_X_VAL_SCALE ;
355
+ cy = dev -> registration .registration_table [index ][1 ] - target_offset ;
356
+
357
+ if (cx >= DEPTH_X_RES ) continue ;
358
+
359
+ cindex = cy * DEPTH_X_RES + cx ;
360
+ map [index ] = cindex ;
361
+
362
+ if (zBuffer [cindex ] == DEPTH_NO_MM_VALUE || zBuffer [cindex ] > wz ) {
363
+ zBuffer [cindex ] = wz ;
364
+ }
365
+ }
366
+
367
+ for (y = 0 ; y < DEPTH_Y_RES ; y ++ ) for (x = 0 ; x < DEPTH_X_RES ; x ++ ) {
368
+ uint32_t index = y * DEPTH_X_RES + x ;
369
+ uint32_t cindex = map [index ];
370
+
371
+ // pixels without depth data or out of bounds are black
372
+ if (cindex == -1 ) {
373
+ index *= 3 ;
374
+ rgb_registered [index + 0 ] = 0 ;
375
+ rgb_registered [index + 1 ] = 0 ;
376
+ rgb_registered [index + 2 ] = 0 ;
377
+
378
+ continue ;
379
+ }
380
+
381
+ unsigned short currentDepth = depth_mm [index ];
382
+ unsigned short minDepth = zBuffer [cindex ];
383
+
384
+ // filters out pixels that are occluded
385
+ if (currentDepth <= minDepth ) {
386
+ index *= 3 ;
387
+ cindex *= 3 ;
388
+
389
+ rgb_registered [index + 0 ] = rgb_raw [cindex + 0 ];
390
+ rgb_registered [index + 1 ] = rgb_raw [cindex + 1 ];
391
+ rgb_registered [index + 2 ] = rgb_raw [cindex + 2 ];
392
+ }
393
+ }
394
+
395
+ free (zBuffer );
396
+ free (map );
397
+ }
398
+
332
399
/// Allocate and fill registration tables
333
400
/// This function should be called every time a new video (not depth!) mode is
334
401
/// activated.
0 commit comments