KinectVision.com code
This is old, from December 2010 it seems, but it's here in case the machine goes titsup. Quick, dirty and ugly but it works most of the time. First, the capture program:
#include <libusb-1.0/libusb.h> #include "libfreenect.h" #include "libfreenect_sync.h" #include <stdio.h> #include <stdlib.h> /* No error checking performed whatsoever; dealing with it later (or not). */ int main(int argc, char** argv) { uint16_t * depth = (uint16_t *)malloc(FREENECT_DEPTH_11BIT_SIZE); uint32_t timestamp; int index = 0; freenect_depth_format fmt = FREENECT_DEPTH_11BIT; uint8_t * depth8 = (uint8_t *)malloc(FREENECT_FRAME_PIX); int i; /* Capture one Kinect depth frame */ freenect_sync_get_depth(&depth, ×tamp, index, fmt); /* Convert captured frame to an 8-bit greyscale image */ for(i = 0; i < FREENECT_FRAME_PIX; i++) { depth8[i] = (2048 * 256) / (2048.0 - depth[i]); } /* Write raw greyscale image to stdout */ fwrite(depth8, FREENECT_FRAME_PIX, 1, stdout); return 0; }
Makefile:
all: capkinect clean: rm -f capkinect.o capkinect capkinect.o: capkinect.c gcc -g -I/usr/local/include/libfreenect/ -c capkinect.c -o capkinect.o capkinect: capkinect.o gcc -g capkinect.o -L/usr/local/lib/ -lfreenect_sync -o capkinect
Uploader:
#!/bin/sh INPUT=`mktemp` AVG=`mktemp` TEMP=`mktemp` OUTPUT=`mktemp --directory` #COLORMAP="black-#45931c" COLORMAP="black-white" # initial average frame capkinect | rawtopgm 640 480 | pnmcut 8 8 624 464 | pgmtoppm $COLORMAP >$AVG while [ true ]; do #echo "input: $INPUT avg: $AVG temp: $TEMP output: $OUTPUT colormap: $COLORMAP" capkinect | rawtopgm 640 480 | pnmcut 8 8 624 464 | pgmtoppm $COLORMAP >$INPUT FILENAME=$OUTPUT/`date +%s.%N` ppmmix 0.035 $AVG $INPUT >$FILENAME.ppm cp $FILENAME.ppm $AVG cat $FILENAME.ppm | cjpeg -greyscale -quality 65 >$FILENAME.jpg echo "user=XXXX:AAAA" | curl --digest -K - -F "file=@$FILENAME.jpg" http://kinectvision.com/depth rm $FILENAME.ppm $FILENAME.jpg sleep 1 done
Server end script that inputs and outputs frames:
$latest_path = $_SERVER["DOCUMENT_ROOT"] . "/incoming/latest"; if($_SERVER["REQUEST_METHOD"] == "POST") { if(!isset($_FILES["file"]["name"])) { exit(); } if(move_uploaded_file($_FILES["file"]["tmp_name"], $_SERVER["DOCUMENT_ROOT"] . "/incoming/" . $_FILES["file"]["name"])) { file_put_contents($latest_path, $_FILES["file"]["name"]); } } elseif($_SERVER["REQUEST_METHOD"] == "HEAD") { $latest = file_get_contents($latest_path); header("X-KinectVision-Latest: " . $latest); } elseif($_SERVER["REQUEST_METHOD"] == "GET") { $latest = $_SERVER["DOCUMENT_ROOT"] . "/incoming/" . file_get_contents($latest_path); header("Content-Type: image/jpeg"); header("X-KinectVision-Latest: " . $latest); if(isset($_GET["width"]) && intval($_GET["width"]) < 624) { $width = intval($_GET["width"]); $f = popen("djpeg -pnm -fast -greyscale $latest | pnmscalefixed -width=$width | cjpeg -greyscale -quality 65", "r"); while(!feof($f)) { echo fread($f, 1024); } fclose($f); } else { echo file_get_contents($latest); } }
(Don't know if it's the Suffusion theme or what that kill all the newlines from these listings. They're there, I can assure you, they're just not visible.)
Categorised as: snippet