-
-
Save jayrambhia/5677608 to your computer and use it in GitHub Desktop.
| /* | |
| Copyright (C) 2010 Arne Bernin | |
| This code is licensed to you under the terms of the GNU GPL, version 2 or version 3; | |
| see: | |
| http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt | |
| http://www.gnu.org/licenses/gpl-3.0.txt | |
| */ | |
| /* | |
| Modified Code | |
| Copyright (C) 2013 Jay Rambhia | |
| This code is licensed to you under the terms of the GNU GPL, version 2 or version 3; | |
| see: | |
| http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt | |
| http://www.gnu.org/licenses/gpl-3.0.txt | |
| */ | |
| /* | |
| Makefile for Ubuntu | |
| CXXFLAGS = -O2 -g -Wall -fmessage-length=0 `pkg-config opencv --cflags ` -I /usr/include/libusb-1.0 | |
| OBJS = freenectopencvmat.o | |
| LIBS = `pkg-config opencv --libs` -lfreenect | |
| TARGET = kinectopencv | |
| $(TARGET):$(OBJS) | |
| $(CXX) -o $(TARGET) $(OBJS) $(LIBS) | |
| all:$(TARGET) | |
| clean: | |
| rm -f $(OBJS) $(TARGET) | |
| */ | |
| #include <stdio.h> | |
| #include <string.h> | |
| #include <math.h> | |
| #include <libfreenect.h> | |
| #include <pthread.h> | |
| #define CV_NO_BACKWARD_COMPATIBILITY | |
| #include <opencv2/opencv.hpp> | |
| #include <opencv2/core/core.hpp> | |
| #include <opencv2/highgui/highgui.hpp> | |
| #define FREENECTOPENCV_WINDOW_D "Depthimage" | |
| #define FREENECTOPENCV_WINDOW_N "Normalimage" | |
| #define FREENECTOPENCV_RGB_DEPTH 3 | |
| #define FREENECTOPENCV_DEPTH_DEPTH 1 | |
| #define FREENECTOPENCV_RGB_WIDTH 640 | |
| #define FREENECTOPENCV_RGB_HEIGHT 480 | |
| #define FREENECTOPENCV_DEPTH_WIDTH 640 | |
| #define FREENECTOPENCV_DEPTH_HEIGHT 480 | |
| using namespace cv; | |
| using namespace std; | |
| Mat depthimg, rgbimg, tempimg, canny_temp, canny_img; | |
| pthread_mutex_t mutex_depth = PTHREAD_MUTEX_INITIALIZER; | |
| pthread_mutex_t mutex_rgb = PTHREAD_MUTEX_INITIALIZER; | |
| pthread_t cv_thread; | |
| // callback for depthimage, called by libfreenect | |
| void depth_cb(freenect_device *dev, void *depth, uint32_t timestamp) | |
| { | |
| Mat depth8; | |
| Mat mydepth = Mat( FREENECTOPENCV_DEPTH_WIDTH,FREENECTOPENCV_DEPTH_HEIGHT, CV_16UC1, depth); | |
| mydepth.convertTo(depth8, CV_8UC1, 1.0/4.0); | |
| pthread_mutex_lock( &mutex_depth ); | |
| memcpy(depthimg.data, depth8.data, 640*480); | |
| // unlock mutex | |
| pthread_mutex_unlock( &mutex_depth ); | |
| } | |
| // callback for rgbimage, called by libfreenect | |
| void rgb_cb(freenect_device *dev, void *rgb, uint32_t timestamp) | |
| { | |
| // lock mutex for opencv rgb image | |
| pthread_mutex_lock( &mutex_rgb ); | |
| memcpy(rgbimg.data, rgb, FREENECT_VIDEO_RGB_SIZE); | |
| // unlock mutex | |
| pthread_mutex_unlock( &mutex_rgb ); | |
| } | |
| /* | |
| * thread for displaying the opencv content | |
| */ | |
| void *cv_threadfunc (void *ptr) { | |
| depthimg = Mat(FREENECTOPENCV_DEPTH_HEIGHT, FREENECTOPENCV_DEPTH_WIDTH, CV_8UC1); | |
| rgbimg = Mat(FREENECTOPENCV_RGB_HEIGHT, FREENECTOPENCV_RGB_WIDTH, CV_8UC3); | |
| tempimg = Mat(FREENECTOPENCV_RGB_HEIGHT, FREENECTOPENCV_RGB_WIDTH, CV_8UC3); | |
| canny_img = Mat(FREENECTOPENCV_RGB_HEIGHT, FREENECTOPENCV_RGB_WIDTH, CV_8UC1); | |
| canny_temp = Mat(FREENECTOPENCV_DEPTH_HEIGHT, FREENECTOPENCV_DEPTH_WIDTH, CV_8UC3); | |
| // use image polling | |
| while (1) | |
| { | |
| //lock mutex for depth image | |
| pthread_mutex_lock( &mutex_depth ); | |
| Canny(depthimg, canny_temp, 50.0, 200.0, 3); | |
| cvtColor(depthimg,tempimg,CV_GRAY2BGR); | |
| cvtColor(tempimg,tempimg,CV_HSV2BGR); | |
| imshow(FREENECTOPENCV_WINDOW_D,tempimg); | |
| imshow("Depth Canny", canny_temp); | |
| //unlock mutex for depth image | |
| pthread_mutex_unlock( &mutex_depth ); | |
| //lock mutex for rgb image | |
| pthread_mutex_lock( &mutex_rgb ); | |
| cvtColor(rgbimg,tempimg,CV_BGR2RGB); | |
| cvtColor(tempimg, canny_img, CV_BGR2GRAY); | |
| imshow(FREENECTOPENCV_WINDOW_N, tempimg); | |
| Canny(canny_img, canny_img, 50.0, 200.0, 3); | |
| imshow("Canny Image", canny_img); | |
| //unlock mutex | |
| pthread_mutex_unlock( &mutex_rgb ); | |
| // wait for quit key | |
| if(cvWaitKey(15) == 27) | |
| break; | |
| } | |
| pthread_exit(NULL); | |
| return NULL; | |
| } | |
| int main(int argc, char **argv) | |
| { | |
| freenect_context *f_ctx; | |
| freenect_device *f_dev; | |
| int res = 0; | |
| int die = 0; | |
| printf("Kinect camera test\n"); | |
| if (freenect_init(&f_ctx, NULL) < 0) | |
| { | |
| printf("freenect_init() failed\n"); | |
| return 1; | |
| } | |
| if (freenect_open_device(f_ctx, &f_dev, 0) < 0) | |
| { | |
| printf("Could not open device\n"); | |
| return 1; | |
| } | |
| freenect_set_depth_callback(f_dev, depth_cb); | |
| freenect_set_video_callback(f_dev, rgb_cb); | |
| freenect_set_video_format(f_dev, FREENECT_VIDEO_RGB); | |
| // create opencv display thread | |
| res = pthread_create(&cv_thread, NULL, cv_threadfunc, NULL); | |
| if (res) | |
| { | |
| printf("pthread_create failed\n"); | |
| return 1; | |
| } | |
| printf("init done\n"); | |
| freenect_start_depth(f_dev); | |
| freenect_start_video(f_dev); | |
| while(!die && freenect_process_events(f_ctx) >= 0 ); | |
| } |
| CXXFLAGS = -O2 -g -Wall -fmessage-length=0 `pkg-config opencv --cflags ` -I /usr/include/libusb-1.0 | |
| OBJS = freenectopencvmat.o | |
| LIBS = `pkg-config opencv --libs` -lfreenect | |
| TARGET = kinectopencv | |
| $(TARGET):$(OBJS) | |
| $(CXX) -o $(TARGET) $(OBJS) $(LIBS) | |
| all:$(TARGET) | |
| clean: | |
| rm -f $(OBJS) $(TARGET) |
Make the following change to ensure that full RGB image is displayed
//Troubleshooting step to ensure full rgb image is displayed
memcpy(rgbimg.data,rgb,(FREENECTOPENCV_RGB_WIDTH+0)*(FREENECTOPENCV_RGB_HEIGHT+950));
Any value more than 950 could corrupt Depth image
CXXFLAGS = -O2 -g -Wall -fmessage-length=0 pkg-config opencv --cflags -I /usr/include/libusb-1.0
OBJS = freenectopencvmat.o
LIBS = pkg-config opencv --libs -lfreenect -lpthread
TARGET = kinectopencv
all:$(TARGET)
clean:
rm -f
My CMakeLists.txt after renaming the .cpp file into main.cpp:
cmake_minimum_required(VERSION 3.1)
project( pcv1 LANGUAGES CXX )
find_package( OpenCV REQUIRED )
find_package(libfreenect REQUIRED)
find_package( Threads )
add_library(code
#File_you_want_to_include.cpp
#File_you_want_to_include.h
main.cpp
)
set_target_properties(code PROPERTIES
CXX_STANDARD 11
CXX_STANDARD_REQUIRED YES
CXX_EXTENSIONS NO
)
target_link_libraries(code
PUBLIC
${OpenCV_LIBS}
${FREENECT_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT}
)
add_executable(main
main.cpp
)
set_target_properties(main PROPERTIES
CXX_STANDARD 11
CXX_STANDARD_REQUIRED YES
CXX_EXTENSIONS NO
)
target_link_libraries(main
PRIVATE
code
)
hi
i cant speak good english
my error
error: ‘FREENECT_VIDEO_RGB_SIZE’ was not declared in this scope
error: ‘freenect_set_video_format’ was not declared in this scope
i do
comment
//freenect_set_video_format(f_dev, FREENECT_VIDEO_RGB);
and
i remove
FREENECT_VIDEO_RGB_SIZE
in
memcpy(rgbimg.data, rgb, FREENECT_VIDEO_RGB_SIZE);
and
i write
memcpy(rgbimg.data, rgb, 640*480);
but
rgb image is Half!!!!
pls help me
tnx