invisible

annotate src/frame.cc @ 9:6f5f53d0d166

use 8bit mat to save depth frames to avoid convertions during inpaint
author Eleni Maria Stea <eleni@mutantstargoat.com>
date Mon, 04 Nov 2013 00:29:14 +0200
parents bd1b0385a10b
children a0397f57c07f
rev   line source
eleni@5 1 #include <GL/gl.h>
eleni@4 2 #include <cxcore.h>
eleni@9 3 #include <opencv2/imgproc/imgproc.hpp>
eleni@9 4
eleni@4 5 #include <highgui.h> //TODO remove
eleni@6 6 #include <cv.h> //TODO remove
eleni@4 7
eleni@2 8 #include <pthread.h>
eleni@1 9 #include <stdio.h>
eleni@2 10 #include <string.h>
eleni@1 11
eleni@1 12 #include "frame.h"
eleni@2 13 #include "kinect.h"
eleni@1 14
eleni@2 15 extern Frame *frame;
eleni@2 16 extern KinectParams *kin_params;
eleni@1 17
eleni@2 18 extern bool has_video;
eleni@2 19 extern bool has_depth;
eleni@2 20
eleni@2 21 Frame::Frame()
eleni@1 22 {
eleni@5 23 video_buf = cv::Mat::zeros(KINECT_VIDEO_HEIGHT, KINECT_VIDEO_WIDTH, CV_8UC3);
eleni@9 24 depth_buf = cv::Mat::zeros(KINECT_DEPTH_HEIGHT, KINECT_DEPTH_WIDTH, CV_8UC1);
eleni@5 25
eleni@5 26 tex_setup();
eleni@5 27 }
eleni@5 28
eleni@5 29 void Frame::tex_setup()
eleni@5 30 {
eleni@5 31 glGenTextures(1, &video_tex);
eleni@5 32 glGenTextures(1, &depth_tex);
eleni@5 33
eleni@5 34 glBindTexture(GL_TEXTURE_2D, video_tex);
eleni@5 35 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
eleni@5 36 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
eleni@5 37 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
eleni@5 38 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
eleni@5 39 glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA, video_buf.size().width, video_buf.size().height,
eleni@5 40 0, GL_BGRA, GL_UNSIGNED_BYTE, &video_buf);
eleni@5 41
eleni@5 42 glBindTexture(GL_TEXTURE_2D, depth_tex);
eleni@5 43 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
eleni@5 44 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
eleni@5 45 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
eleni@5 46 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
eleni@5 47 glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA, depth_buf.size().width, depth_buf.size().height,
eleni@5 48 0, GL_BGRA, GL_UNSIGNED_BYTE, &depth_buf);
eleni@5 49
eleni@1 50 }
eleni@1 51
eleni@2 52 void Frame::process()
eleni@1 53 {
eleni@2 54 if(has_video && has_depth)
eleni@2 55 printf("Depth and Rgb\n");
eleni@2 56 }
eleni@2 57
eleni@2 58 void video_cb(freenect_device *kin_dev, void *video, uint32_t time)
eleni@2 59 {
eleni@4 60 if(!video || !frame) {
eleni@2 61 has_video = false;
eleni@2 62 return;
eleni@2 63 }
eleni@2 64
eleni@5 65 /* freenect video data to cv mat: */
eleni@5 66 unsigned char* src = (unsigned char*)video;
eleni@5 67 unsigned char* dest = frame->video_buf.data;
eleni@5 68
eleni@5 69 for(int i=0; i<KINECT_VIDEO_HEIGHT * KINECT_VIDEO_WIDTH; i++) {
eleni@5 70 dest[0] = src[2];
eleni@5 71 dest[1] = src[1];
eleni@5 72 dest[2] = src[0];
eleni@5 73 dest += 3;
eleni@5 74 src += 3;
eleni@5 75 }
eleni@2 76 has_video = true;
eleni@1 77 }
eleni@1 78
eleni@1 79 void depth_cb(freenect_device *kin_dev, void *depth, uint32_t time)
eleni@1 80 {
eleni@5 81 if(!depth || !frame) {
eleni@2 82 has_depth = false;
eleni@2 83 return;
eleni@2 84 }
eleni@2 85
eleni@5 86 /* freenect depth data to cv mat: */
eleni@8 87 uint16_t* src = (uint16_t*)depth;
eleni@9 88 uint8_t* dest = (uint8_t*)frame->depth_buf.data;
eleni@5 89
eleni@8 90 for(int i=0; i<KINECT_DEPTH_HEIGHT * KINECT_DEPTH_WIDTH; i++) {
eleni@8 91 uint16_t val = *src;
eleni@8 92 if(val >= 2047) {
eleni@8 93 val = 0;
eleni@8 94 }
eleni@9 95 *dest = val >> 3;
eleni@8 96 src++;
eleni@8 97 dest++;
eleni@8 98 }
eleni@5 99
eleni@9 100 cv::medianBlur(frame->depth_buf, frame->depth_buf, 5);
eleni@6 101 cv::imshow("foo", frame->depth_buf);
eleni@6 102 cv::waitKey(100);
eleni@2 103 has_depth = true;
eleni@1 104 }
eleni@5 105
eleni@5 106 bool save_video_ppm(void *video, int w, int h)
eleni@5 107 {
eleni@5 108 FILE *fp;
eleni@5 109 if(!(fp = fopen("test_video.ppm", "wb"))) {
eleni@5 110 fprintf(stderr, "Failed to open video file for writing.\n");
eleni@5 111 return false;
eleni@5 112 }
eleni@6 113 fprintf(fp, "P6\n%d %d\n255\n", w, h);
eleni@6 114 unsigned char *ptr = (unsigned char*)video;
eleni@5 115 for(int i=0; i<w * h * 3; i++) {
eleni@5 116 fputc(*ptr, fp);
eleni@5 117 ptr++;
eleni@5 118 }
eleni@5 119 fclose(fp);
eleni@5 120 return true;
eleni@5 121 }